CRYO: Get rid of HnmContext, refactoring

This commit is contained in:
Strangerke 2017-01-03 22:37:30 -08:00 committed by Eugene Sandulenko
parent b3fcb77053
commit caec6a8de9
5 changed files with 189 additions and 203 deletions

View file

@ -117,25 +117,6 @@ struct HNMHeader {
typedef struct HNMHeader HNMHeader; typedef struct HNMHeader HNMHeader;
#pragma pack(pop) #pragma pack(pop)
struct hnm_t {
int _frameNum;
int _unused04;
Common::File *_file;
HNMHeader _header;
byte *tmpBuffer[2];
byte *finalBuffer;
byte *_newFrameBuffer;
byte *_oldFrameBuffer;
byte *_readBuffer;
byte *_dataPtr;
color_t _palette[256];
bool _canLoop;
int16 _unused896;
int16 _chunkId;
int _totalRead;
};
typedef struct hnm_t hnm_t;
class Sound { class Sound {
private: private:
int32 _headerOffset; int32 _headerOffset;

View file

@ -110,7 +110,6 @@ EdenGame::EdenGame(CryoEngine *vm) : _vm(vm) {
_hnmSoundChannel = nullptr; _hnmSoundChannel = nullptr;
_voiceSound = nullptr; _voiceSound = nullptr;
_view2 = _underSubtitlesView = _subtitlesView = _underBarsView = _mainView = _hnmView = nullptr; _view2 = _underSubtitlesView = _subtitlesView = _underBarsView = _mainView = _hnmView = nullptr;
_hnmContext = nullptr;
_doubledScreen = false; _doubledScreen = false;
_cirsorPanX = 0; _cirsorPanX = 0;
_inventoryScrollDelay = 0; _inventoryScrollDelay = 0;
@ -4741,8 +4740,8 @@ void EdenGame::openbigfile() {
_bigfileHeader->_files[j]._flag = _bigfile.readByte(); _bigfileHeader->_files[j]._flag = _bigfile.readByte();
} }
_hnmContext = _vm->_video->resetInternals(); _vm->_video->resetInternals();
_vm->_video->setFile(_hnmContext, &_bigfile); _vm->_video->setFile(&_bigfile);
} }
void EdenGame::closebigfile() { void EdenGame::closebigfile() {
@ -4839,7 +4838,7 @@ void EdenGame::shnmfl(uint16 num) {
int size = file->_size; int size = file->_size;
int offs = file->_offs; int offs = file->_offs;
debug("* Loading movie %d (%s) at 0x%X, %d bytes", num, file->_name.c_str(), (uint)offs, size); debug("* Loading movie %d (%s) at 0x%X, %d bytes", num, file->_name.c_str(), (uint)offs, size);
_hnmContext->_file->seek(offs, SEEK_SET); _vm->_video->_file->seek(offs, SEEK_SET);
} }
int EdenGame::ssndfl(uint16 num) { int EdenGame::ssndfl(uint16 num) {
@ -6351,21 +6350,21 @@ void EdenGame::mouse() {
////// film.c ////// film.c
// Original name: showfilm // Original name: showfilm
void EdenGame::showMovie(char arg1) { void EdenGame::showMovie(char arg1) {
_vm->_video->readHeader(_hnmContext); _vm->_video->readHeader();
if (_vm->_video->_curVideoNum == 92) { if (_vm->_video->_curVideoNum == 92) {
// _hnmContext->_header._unusedFlag2 = 0; CHECKME: Useless? // _hnmContext->_header._unusedFlag2 = 0; CHECKME: Useless?
_hnmSoundChannel->setVolumeLeft(0); _hnmSoundChannel->setVolumeLeft(0);
_hnmSoundChannel->setVolumeRight(0); _hnmSoundChannel->setVolumeRight(0);
} }
if (_vm->_video->getVersion(_hnmContext) != 4) if (_vm->_video->getVersion() != 4)
return; return;
bool playing = true; bool playing = true;
_vm->_video->allocMemory(_hnmContext); _vm->_video->allocMemory();
_hnmView = new View(_vm, _hnmContext->_header._width, _hnmContext->_header._height); _hnmView = new View(_vm, _vm->_video->_header._width, _vm->_video->_header._height);
_hnmView->setSrcZoomValues(0, 0); _hnmView->setSrcZoomValues(0, 0);
_hnmView->setDisplayZoomValues(_hnmContext->_header._width * 2, _hnmContext->_header._height * 2); _hnmView->setDisplayZoomValues(_vm->_video->_header._width * 2, _vm->_video->_header._height * 2);
_hnmView->centerIn(_vm->_screenView); _hnmView->centerIn(_vm->_screenView);
_hnmViewBuf = _hnmView->_bufferPtr; _hnmViewBuf = _hnmView->_bufferPtr;
if (arg1) { if (arg1) {
@ -6374,12 +6373,12 @@ void EdenGame::showMovie(char arg1) {
_hnmView->_normal._dstTop = _mainView->_normal._dstTop + 16; _hnmView->_normal._dstTop = _mainView->_normal._dstTop + 16;
_hnmView->_zoom._dstTop = _mainView->_zoom._dstTop + 32; _hnmView->_zoom._dstTop = _mainView->_zoom._dstTop + 32;
} }
_vm->_video->setFinalBuffer(_hnmContext, _hnmView->_bufferPtr); _vm->_video->setFinalBuffer(_hnmView->_bufferPtr);
_hnmView->_doubled = _doubledScreen; _hnmView->_doubled = _doubledScreen;
do { do {
_hnmFrameNum = _vm->_video->getFrameNum(_hnmContext); _hnmFrameNum = _vm->_video->getFrameNum();
_vm->_video->waitLoop(_hnmContext); _vm->_video->waitLoop();
playing = _vm->_video->nextElement(_hnmContext); playing = _vm->_video->nextElement();
if (_specialTextMode) if (_specialTextMode)
handleHNMSubtitles(); handleHNMSubtitles();
else else
@ -6411,7 +6410,7 @@ void EdenGame::showMovie(char arg1) {
} }
} while (playing && !_videoCanceledFlag); } while (playing && !_videoCanceledFlag);
delete _hnmView; delete _hnmView;
_vm->_video->deallocMemory(_hnmContext); _vm->_video->deallocMemory();
} }
void EdenGame::playHNM(int16 num) { void EdenGame::playHNM(int16 num) {
@ -6436,8 +6435,8 @@ void EdenGame::playHNM(int16 num) {
_showVideoSubtitle = false; _showVideoSubtitle = false;
_videoCanceledFlag = false; _videoCanceledFlag = false;
shnmfl(num); shnmfl(num);
_vm->_video->reset(_hnmContext); _vm->_video->reset();
_vm->_video->flushPreloadBuffer(_hnmContext); _vm->_video->flushPreloadBuffer();
if (_needToFade) { if (_needToFade) {
fadeToBlack(4); fadeToBlack(4);
clearScreen(); clearScreen();

View file

@ -650,7 +650,6 @@ private:
View *_underBarsView; View *_underBarsView;
View *_mainView; View *_mainView;
View *_hnmView; View *_hnmView;
hnm_t *_hnmContext;
Common::Rect _underSubtitlesBackupRect; Common::Rect _underSubtitlesBackupRect;
Common::Rect _underSubtitlesScreenRect; Common::Rect _underSubtitlesScreenRect;
Common::Rect _underBottomBarBackupRect; Common::Rect _underBottomBarBackupRect;

View file

@ -50,32 +50,27 @@ HnmPlayer::HnmPlayer(CryoEngine *vm) : _vm(vm) {
} }
// Original name: CLHNM_New // Original name: CLHNM_New
hnm_t *HnmPlayer::resetInternals() { void HnmPlayer::resetInternals() {
_frameNum = 0;
hnm_t *hnm = (hnm_t *)malloc(sizeof(*hnm)); _unused04 = 0;
_file = nullptr;
hnm->_frameNum = 0; tmpBuffer[0] = nullptr;
hnm->_unused04 = 0; tmpBuffer[1] = nullptr;
hnm->_file = nullptr; _finalBuffer = nullptr;
hnm->tmpBuffer[0] = nullptr; _readBuffer = nullptr;
hnm->tmpBuffer[1] = nullptr; _unused896 = 0;
hnm->finalBuffer = nullptr; _totalRead = 0;
hnm->_readBuffer = nullptr;
hnm->_unused896 = 0;
hnm->_totalRead = 0;
for (int i = 0; i < 256; i++) { for (int i = 0; i < 256; i++) {
hnm->_palette[i].a = 0; _palette[i].a = 0;
hnm->_palette[i].r = 0; _palette[i].r = 0;
hnm->_palette[i].g = 0; _palette[i].g = 0;
hnm->_palette[i].b = 0; _palette[i].b = 0;
} }
return hnm;
} }
// Original name: CLHNM_SetFile // Original name: CLHNM_SetFile
void HnmPlayer::setFile(hnm_t *hnm, Common::File *file) { void HnmPlayer::setFile(Common::File *file) {
hnm->_file = file; _file = file;
} }
// Original name: CLHNM_SetupTimer // Original name: CLHNM_SetupTimer
@ -90,10 +85,10 @@ void HnmPlayer::resetInternalTimer() {
} }
// Original name: CLHNM_Reset // Original name: CLHNM_Reset
void HnmPlayer::reset(hnm_t *hnm) { void HnmPlayer::reset() {
hnm->_frameNum = 0; _frameNum = 0;
hnm->_unused04 = 0; _unused04 = 0;
hnm->_totalRead = 0; _totalRead = 0;
_soundStarted = false; _soundStarted = false;
_pendingSounds = 0; _pendingSounds = 0;
resetInternalTimer(); resetInternalTimer();
@ -111,7 +106,7 @@ void HnmPlayer::setForceZero2Black(bool forceblack) {
} }
// Original name: CLHNM_WaitLoop // Original name: CLHNM_WaitLoop
void HnmPlayer::waitLoop(hnm_t *hnm) { void HnmPlayer::waitLoop() {
_expectedFrameTime += _rate; _expectedFrameTime += _rate;
_nextFrameTime = _expectedFrameTime - _timeDrift; _nextFrameTime = _expectedFrameTime - _timeDrift;
if (_useSoundSync && _vm->_timerTicks > 1000.0 + _nextFrameTime) if (_useSoundSync && _vm->_timerTicks > 1000.0 + _nextFrameTime)
@ -185,101 +180,102 @@ void HnmPlayer::decompADPCM(byte *buffer, int16 *output, int size) {
} }
// Original name: CLHNM_ReadHeader // Original name: CLHNM_ReadHeader
void HnmPlayer::readHeader(hnm_t *hnm) { void HnmPlayer::readHeader() {
hnm->_header._signature = hnm->_file->readUint32BE(); _header._signature = _file->readUint32BE();
hnm->_header._unusedFlag1 = hnm->_file->readByte(); _header._unusedFlag1 = _file->readByte();
hnm->_header._unusedFlag2 = hnm->_file->readByte(); _header._unusedFlag2 = _file->readByte();
hnm->_header._unusedReserved = hnm->_file->readByte(); _header._unusedReserved = _file->readByte();
hnm->_header._unusedBpp = hnm->_file->readByte(); _header._unusedBpp = _file->readByte();
hnm->_header._width = hnm->_file->readUint16LE(); _header._width = _file->readUint16LE();
hnm->_header._height = hnm->_file->readUint16LE(); _header._height = _file->readUint16LE();
hnm->_header._unusedFileSize = hnm->_file->readSint32LE(); _header._unusedFileSize = _file->readSint32LE();
hnm->_header._numbFrame = hnm->_file->readSint32LE(); _header._numbFrame = _file->readSint32LE();
hnm->_header._unusedTableOffset = hnm->_file->readSint32LE(); _header._unusedTableOffset = _file->readSint32LE();
hnm->_header._unusedSpeed = hnm->_file->readSint16LE(); _header._unusedSpeed = _file->readSint16LE();
hnm->_header._unusedMaxBuffer = hnm->_file->readSint16LE(); _header._unusedMaxBuffer = _file->readSint16LE();
hnm->_header._bufferSize = hnm->_file->readSint32LE(); _header._bufferSize = _file->readSint32LE();
hnm->_header._unusedUnknown = hnm->_file->readSint16LE(); _header._unusedUnknown = _file->readSint16LE();
for (int i = 0; i < 14; i++) for (int i = 0; i < 14; i++)
hnm->_header._unusedReserved2[i] = hnm->_file->readSByte(); _header._unusedReserved2[i] = _file->readSByte();
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
hnm->_header._unusedCopyright[i] = hnm->_file->readSByte(); _header._unusedCopyright[i] = _file->readSByte();
hnm->_header._bufferSize += 4096; //TODO: checkme _header._bufferSize += 4096; //TODO: checkme
} }
// Original name: CLHNM_GetVersion // Original name: CLHNM_GetVersion
int16 HnmPlayer::getVersion(hnm_t *hnm) { int16 HnmPlayer::getVersion() {
if (hnm->_header._signature == MKTAG('H','N','M','4')) if (_header._signature == MKTAG('H','N','M','4'))
return 4; return 4;
return -1; return -1;
} }
// Original name: CLHNM_AllocMemory // Original name: CLHNM_AllocMemory
void HnmPlayer::allocMemory(hnm_t *hnm) { void HnmPlayer::allocMemory() {
hnm->tmpBuffer[0] = (byte *)malloc(hnm->_header._bufferSize + 2); // TODO: rework this code
tmpBuffer[0] = (byte *)malloc(_header._bufferSize + 2);
if (!hnm->tmpBuffer[0]) if (!tmpBuffer[0])
return; return;
hnm->tmpBuffer[1] = (byte *)malloc(hnm->_header._bufferSize + 2); tmpBuffer[1] = (byte *)malloc(_header._bufferSize + 2);
if (!hnm->tmpBuffer[1]) { if (!tmpBuffer[1]) {
free(hnm->tmpBuffer[0]); free(tmpBuffer[0]);
hnm->tmpBuffer[0] = nullptr; tmpBuffer[0] = nullptr;
return; return;
} }
hnm->_readBuffer = (byte *)malloc(hnm->_header._bufferSize + 2); _readBuffer = (byte *)malloc(_header._bufferSize + 2);
if (!hnm->_readBuffer) { if (!_readBuffer) {
free(hnm->tmpBuffer[0]); free(tmpBuffer[0]);
hnm->tmpBuffer[0] = nullptr; tmpBuffer[0] = nullptr;
free(hnm->tmpBuffer[1]); free(tmpBuffer[1]);
hnm->tmpBuffer[1] = nullptr; tmpBuffer[1] = nullptr;
} }
} }
// Original name: CLHNM_DeallocMemory // Original name: CLHNM_DeallocMemory
void HnmPlayer::deallocMemory(hnm_t *hnm) { void HnmPlayer::deallocMemory() {
free(hnm->tmpBuffer[0]); free(tmpBuffer[0]);
free(hnm->tmpBuffer[1]); free(tmpBuffer[1]);
free(hnm->_readBuffer); free(_readBuffer);
hnm->tmpBuffer[0] = nullptr; tmpBuffer[0] = nullptr;
hnm->tmpBuffer[1] = nullptr; tmpBuffer[1] = nullptr;
hnm->_readBuffer = nullptr; _readBuffer = nullptr;
} }
// Original name: CLHNM_SetFinalBuffer // Original name: CLHNM_SetFinalBuffer
void HnmPlayer::setFinalBuffer(hnm_t *hnm, byte *buffer) { void HnmPlayer::setFinalBuffer(byte *buffer) {
hnm->finalBuffer = buffer; _finalBuffer = buffer;
} }
// Original name: CLHNM_GetFrameNum // Original name: CLHNM_GetFrameNum
int HnmPlayer::getFrameNum(hnm_t *hnm) { int HnmPlayer::getFrameNum() {
return hnm->_frameNum; return _frameNum;
} }
// Original name: CLHNM_TryRead // Original name: CLHNM_TryRead
void HnmPlayer::tryRead(hnm_t *hnm, int size) { void HnmPlayer::tryRead(int size) {
hnm->_file->read(hnm->_readBuffer, size); _file->read(_readBuffer, size);
} }
// Original name: CLHNM_LoadFrame // Original name: CLHNM_LoadFrame
bool HnmPlayer::loadFrame(hnm_t *hnm) { bool HnmPlayer::loadFrame() {
tryRead(hnm, 4); tryRead(4);
int chunk = *(int *)hnm->_readBuffer; int chunk = *(int *)_readBuffer;
chunk = LE32(chunk); chunk = LE32(chunk);
chunk &= 0xFFFFFF; // upper bit - keyframe mark? chunk &= 0xFFFFFF; // upper bit - keyframe mark?
if (!chunk) if (!chunk)
return false; return false;
if (chunk - 4 > hnm->_header._bufferSize) if (chunk - 4 > _header._bufferSize)
error("loadFrame - Chunk size"); error("loadFrame - Chunk size");
tryRead(hnm, chunk - 4); tryRead(chunk - 4);
hnm->_dataPtr = hnm->_readBuffer; _dataPtr = _readBuffer;
hnm->_totalRead += chunk; _totalRead += chunk;
return true; return true;
} }
@ -351,13 +347,13 @@ void HnmPlayer::desentrelace320(byte *frame_buffer, byte *final_buffer, uint16 h
} }
// Original name: CLHNM_Desentrelace // Original name: CLHNM_Desentrelace
void HnmPlayer::desentrelace(hnm_t *hnm) { void HnmPlayer::desentrelace() {
switch (hnm->_header._width) { switch (_header._width) {
case 320: case 320:
desentrelace320(hnm->_newFrameBuffer, hnm->finalBuffer, hnm->_header._height); desentrelace320(_newFrameBuffer, _finalBuffer, _header._height);
break; break;
// case 480: // case 480:
// CLHNM_Desentrelace480(hnm->new_frame_buffer, hnm->final_buffer, hnm->header.height); // CLHNM_Desentrelace480(_newFrameBuffer, finalBuffer, _header._height);
// break; // break;
default: default:
error("desentrelace - Unexpected width"); error("desentrelace - Unexpected width");
@ -467,51 +463,51 @@ void HnmPlayer::decompUBA(byte *output, byte *curr_buffer, byte *prev_buffer, by
} }
// Original name: CLHNM_NextElement // Original name: CLHNM_NextElement
bool HnmPlayer::nextElement(hnm_t *hnm) { bool HnmPlayer::nextElement() {
if (hnm->_frameNum == 0) { if (_frameNum == 0) {
resetInternalTimer(); resetInternalTimer();
_prevLeft = _prevRight = 0; _prevLeft = _prevRight = 0;
} }
if (hnm->_frameNum == hnm->_header._numbFrame) if (_frameNum == _header._numbFrame)
return false; return false;
if (!loadFrame(hnm)) if (!loadFrame())
return false; return false;
for (;;) { for (;;) {
int sz = READ_LE_UINT32(hnm->_dataPtr) & 0xFFFFFF; int sz = READ_LE_UINT32(_dataPtr) & 0xFFFFFF;
hnm->_dataPtr += 4; _dataPtr += 4;
int16 id = READ_LE_UINT16(hnm->_dataPtr); int16 id = READ_LE_UINT16(_dataPtr);
hnm->_dataPtr += 2; _dataPtr += 2;
char h6 = *hnm->_dataPtr; char h6 = *_dataPtr;
hnm->_dataPtr += 1; _dataPtr += 1;
char h7 = *hnm->_dataPtr; char h7 = *_dataPtr;
hnm->_dataPtr += 1; _dataPtr += 1;
hnm->_chunkId = id; _chunkId = id;
switch (id) { switch (id) {
case MKTAG16('L', 'P'): case MKTAG16('L', 'P'):
changePalette(hnm); changePalette();
hnm->_dataPtr += sz - 8; _dataPtr += sz - 8;
break; break;
case MKTAG16('Z', 'I'): case MKTAG16('Z', 'I'):
hnm->_frameNum++; _frameNum++;
selectBuffers(hnm); selectBuffers();
decompLempelZiv(hnm->_dataPtr + 4, hnm->_newFrameBuffer); decompLempelZiv(_dataPtr + 4, _newFrameBuffer);
switch (hnm->_header._width) { switch (_header._width) {
// case 320: CLBlitter_RawCopy320ASM(hnm->new_frame_buffer, hnm->old_frame_buffer, hnm->header.height); break; // case 320: CLBlitter_RawCopy320ASM(_newFrameBuffer, _oldFrameBuffer, _header._height); break;
// case 480: CLBlitter_RawCopy480ASM(hnm->new_frame_buffer, hnm->old_frame_buffer, hnm->header.height); break; // case 480: CLBlitter_RawCopy480ASM(_newFrameBuffer, _oldFrameBuffer, _header._height); break;
// case 640: CLBlitter_RawCopy640ASM(hnm->new_frame_buffer, hnm->old_frame_buffer, hnm->header.height); break; // case 640: CLBlitter_RawCopy640ASM(_newFrameBuffer, _oldFrameBuffer, _header._height); break;
// default: memcpy(hnm->old_frame_buffer, hnm->new_frame_buffer, hnm->header.width * hnm->header.height); // default: memcpy(_oldFrameBuffer, _newFrameBuffer, _header._width * _header._height);
default: default:
memcpy(hnm->_oldFrameBuffer, hnm->_newFrameBuffer, hnm->_header._bufferSize); //TODO strange buffer size here memcpy(_oldFrameBuffer, _newFrameBuffer, _header._bufferSize); //TODO strange buffer size here
} }
if (!(h6 & 1)) if (!(h6 & 1))
desentrelace(hnm); desentrelace();
else { else {
// if(hnm->header.width == 640) // if(_header._width == 640)
// CLBlitter_RawCopy640(hnm->new_frame_buffer, hnm->final_buffer, hnm->header.height); // CLBlitter_RawCopy640(_newFrameBuffer, finalBuffer, _header._height);
// else // else
memcpy(hnm->finalBuffer, hnm->_newFrameBuffer, hnm->_header._height); //TODO: wrong size? memcpy(_finalBuffer, _newFrameBuffer, _header._height); //TODO: wrong size?
} }
if (_useAdpcm) { if (_useAdpcm) {
if (!_soundStarted) { if (!_soundStarted) {
@ -527,16 +523,16 @@ bool HnmPlayer::nextElement(hnm_t *hnm) {
return true; return true;
case MKTAG16('U', 'I'): case MKTAG16('U', 'I'):
hnm->_frameNum++; _frameNum++;
selectBuffers(hnm); selectBuffers();
decompUBA(hnm->_newFrameBuffer, hnm->_newFrameBuffer, hnm->_oldFrameBuffer, hnm->_dataPtr, hnm->_header._width, h6); decompUBA(_newFrameBuffer, _newFrameBuffer, _oldFrameBuffer, _dataPtr, _header._width, h6);
if (!(h6 & 1)) if (!(h6 & 1))
desentrelace(hnm); desentrelace();
else { else {
// if(hnm->header.width == 640) // if(_header._width == 640)
// CLBlitter_RawCopy640(hnm->new_frame_buffer, hnm->final_buffer, hnm->header.height); // CLBlitter_RawCopy640(_newFrameBuffer, _finalBuffer, _header._height);
// else // else
memcpy(hnm->finalBuffer, hnm->_newFrameBuffer, hnm->_header._width * hnm->_header._height); memcpy(_finalBuffer, _newFrameBuffer, _header._width * _header._height);
} }
return true; return true;
@ -546,7 +542,7 @@ bool HnmPlayer::nextElement(hnm_t *hnm) {
if (!h6) { if (!h6) {
int sound_size = sz - 8; int sound_size = sz - 8;
if (!_useAdpcm) { if (!_useAdpcm) {
_soundGroup->setDatas(hnm->_dataPtr, sound_size - 2, false); _soundGroup->setDatas(_dataPtr, sound_size - 2, false);
if (_soundStarted) if (_soundStarted)
_soundGroup->playNextSample(_soundChannel); _soundGroup->playNextSample(_soundChannel);
else else
@ -555,11 +551,11 @@ bool HnmPlayer::nextElement(hnm_t *hnm) {
int16 *sound_buffer = (int16 *)_soundGroupAdpcm->getNextBuffer(); int16 *sound_buffer = (int16 *)_soundGroupAdpcm->getNextBuffer();
if (!_pendingSounds) { if (!_pendingSounds) {
const int kDecompTableSize = 256 * sizeof(int16); const int kDecompTableSize = 256 * sizeof(int16);
loadDecompTable((int16 *)hnm->_dataPtr); loadDecompTable((int16 *)_dataPtr);
decompADPCM(hnm->_dataPtr + kDecompTableSize, sound_buffer, sound_size - kDecompTableSize); decompADPCM(_dataPtr + kDecompTableSize, sound_buffer, sound_size - kDecompTableSize);
_soundGroupAdpcm->assignDatas(sound_buffer, (sound_size - kDecompTableSize) * 2, false); _soundGroupAdpcm->assignDatas(sound_buffer, (sound_size - kDecompTableSize) * 2, false);
} else { } else {
decompADPCM(hnm->_dataPtr, sound_buffer, sound_size); decompADPCM(_dataPtr, sound_buffer, sound_size);
_soundGroupAdpcm->assignDatas(sound_buffer, sound_size * 2, false); _soundGroupAdpcm->assignDatas(sound_buffer, sound_size * 2, false);
} }
_pendingSounds++; _pendingSounds++;
@ -569,12 +565,12 @@ bool HnmPlayer::nextElement(hnm_t *hnm) {
} else } else
error("nextElement - unexpected flag"); error("nextElement - unexpected flag");
} }
hnm->_dataPtr += sz - 8; _dataPtr += sz - 8;
break; break;
default: default:
if (_customChunkHandler) if (_customChunkHandler)
_customChunkHandler(hnm->_dataPtr, sz - 8, id, h6, h7); _customChunkHandler(_dataPtr, sz - 8, id, h6, h7);
hnm->_dataPtr += sz - 8; _dataPtr += sz - 8;
} }
} }
return true; return true;
@ -586,13 +582,13 @@ SoundChannel *HnmPlayer::getSoundChannel() {
} }
// Original name: CLHNM_FlushPreloadBuffer // Original name: CLHNM_FlushPreloadBuffer
void HnmPlayer::flushPreloadBuffer(hnm_t *hnm) { void HnmPlayer::flushPreloadBuffer() {
} }
// Original name: CLHNM_ChangePalette // Original name: CLHNM_ChangePalette
void HnmPlayer::changePalette(hnm_t *hnm) { void HnmPlayer::changePalette() {
CLPalette_GetLastPalette(hnm->_palette); CLPalette_GetLastPalette(_palette);
byte *pal = hnm->_dataPtr; byte *pal = _dataPtr;
if (*(uint16 *)pal == 0xFFFF) if (*(uint16 *)pal == 0xFFFF)
return; return;
@ -609,7 +605,7 @@ void HnmPlayer::changePalette(hnm_t *hnm) {
mincolor = fst; mincolor = fst;
if (maxcolor < fst + cnt) if (maxcolor < fst + cnt)
maxcolor = fst + cnt; maxcolor = fst + cnt;
color_t *color = hnm->_palette + fst; color_t *color = _palette + fst;
if (_safePalette) { if (_safePalette) {
while (cnt--) { while (cnt--) {
byte r = *pal++; byte r = *pal++;
@ -640,23 +636,23 @@ void HnmPlayer::changePalette(hnm_t *hnm) {
} while (*(uint16 *)pal != 0xFFFF); } while (*(uint16 *)pal != 0xFFFF);
#if 0 #if 0
if (preserve_color0) { if (preserve_color0) {
hnm->palette[0].r = 0; _palette[0].r = 0;
hnm->palette[0].g = 0; _palette[0].g = 0;
hnm->palette[0].b = 0; _palette[0].b = 0;
} }
#endif #endif
// CLBlitter_Send2ScreenNextCopy(hnm->palette, mincolor, maxcolor - mincolor); // CLBlitter_Send2ScreenNextCopy(_palette, mincolor, maxcolor - mincolor);
CLBlitter_Send2ScreenNextCopy(hnm->_palette, 0, 256); CLBlitter_Send2ScreenNextCopy(_palette, 0, 256);
} }
// Original name: CLHNM_SelectBuffers // Original name: CLHNM_SelectBuffers
void HnmPlayer::selectBuffers(hnm_t *hnm) { void HnmPlayer::selectBuffers() {
if (hnm->_frameNum % 2) { if (_frameNum % 2) {
hnm->_newFrameBuffer = hnm->tmpBuffer[1]; _newFrameBuffer = tmpBuffer[1];
hnm->_oldFrameBuffer = hnm->tmpBuffer[0]; _oldFrameBuffer = tmpBuffer[0];
} else { } else {
hnm->_newFrameBuffer = hnm->tmpBuffer[0]; _newFrameBuffer = tmpBuffer[0];
hnm->_oldFrameBuffer = hnm->tmpBuffer[1]; _oldFrameBuffer = tmpBuffer[1];
} }
} }
@ -664,14 +660,9 @@ void HnmPlayer::selectBuffers(hnm_t *hnm) {
void HnmPlayer::done() { void HnmPlayer::done() {
} }
// Original name: CLHNM_Dispose
void HnmPlayer::dispose(hnm_t *hnm) {
free(hnm);
}
// Original name: CLHNM_CanLoop // Original name: CLHNM_CanLoop
void HnmPlayer::canLoop(hnm_t *hnm, bool canLoop) { void HnmPlayer::canLoop(bool canLoop) {
hnm->_canLoop = canLoop; _canLoop = canLoop;
} }
// Original name: CLHNM_SoundInADPCM // Original name: CLHNM_SoundInADPCM

View file

@ -28,6 +28,23 @@ namespace Cryo {
class CryoEngine; class CryoEngine;
class HnmPlayer { class HnmPlayer {
public:
int _frameNum;
int _unused04;
Common::File *_file;
HNMHeader _header;
byte *tmpBuffer[2];
byte *_finalBuffer;
byte *_newFrameBuffer;
byte *_oldFrameBuffer;
byte *_readBuffer;
byte *_dataPtr;
color_t _palette[256];
bool _canLoop;
int16 _unused896;
int16 _chunkId;
int _totalRead;
private: private:
CryoEngine *_vm; CryoEngine *_vm;
@ -35,19 +52,18 @@ private:
void wantsSound(bool sound); void wantsSound(bool sound);
void decompADPCM(byte *buffer, int16 *output, int size); void decompADPCM(byte *buffer, int16 *output, int size);
void loadDecompTable(int16 *buffer); void loadDecompTable(int16 *buffer);
bool loadFrame(hnm_t *hnm); bool loadFrame();
void tryRead(hnm_t *hnm, int size); void tryRead(int size);
void changePalette(hnm_t *hnm); void changePalette();
void selectBuffers(hnm_t *hnm); void selectBuffers();
void decompLempelZiv(byte *buffer, byte *output); void decompLempelZiv(byte *buffer, byte *output);
void desentrelace320(byte *frame_buffer, byte *final_buffer, uint16 height); void desentrelace320(byte *frame_buffer, byte *final_buffer, uint16 height);
void desentrelace(hnm_t *hnm); void desentrelace();
void decompUBA(byte *output, byte *curr_buffer, byte *prev_buffer, byte *input, int width, char flags); void decompUBA(byte *output, byte *curr_buffer, byte *prev_buffer, byte *input, int width, char flags);
// Unused // Unused
void done(); void done();
void dispose(hnm_t *hnm); void canLoop(bool canLoop);
void canLoop(hnm_t *hnm, bool canLoop);
void soundInADPCM(bool is_adpcm); void soundInADPCM(bool is_adpcm);
void soundMono(bool is_mono); void soundMono(bool is_mono);
// //
@ -81,23 +97,23 @@ public:
HnmPlayer(CryoEngine *vm); HnmPlayer(CryoEngine *vm);
void setupTimer(float rate); void setupTimer(float rate);
void reset(hnm_t *hnm); void reset();
void closeSound(); void closeSound();
void waitLoop(hnm_t *hnm); void waitLoop();
void flushPreloadBuffer(hnm_t *hnm); void flushPreloadBuffer();
void setupSound(int16 numSounds, int16 length, int16 sampleSize, float rate, int16 mode); void setupSound(int16 numSounds, int16 length, int16 sampleSize, float rate, int16 mode);
void setupSoundADPCM(int16 numSounds, int16 length, int16 sampleSize, float rate, int16 mode); void setupSoundADPCM(int16 numSounds, int16 length, int16 sampleSize, float rate, int16 mode);
bool nextElement(hnm_t *hnm); bool nextElement();
void init(); void init();
void setForceZero2Black(bool forceblack); void setForceZero2Black(bool forceblack);
void readHeader(hnm_t *hnm); void readHeader();
int16 getVersion(hnm_t *hnm); int16 getVersion();
void allocMemory(hnm_t *hnm); void allocMemory();
void deallocMemory(hnm_t *hnm); void deallocMemory();
void setFinalBuffer(hnm_t *hnm, byte *buffer); void setFinalBuffer(byte *buffer);
int getFrameNum(hnm_t *hnm); int getFrameNum();
hnm_t *resetInternals(); void resetInternals();
void setFile(hnm_t *hnm, Common::File *file); void setFile(Common::File *file);
SoundChannel *getSoundChannel(); SoundChannel *getSoundChannel();
}; };