Added stream-reading loading wrappers to MDYPlayer and added a workaround to fix TBR reading for the moment
svn-id: r41781
This commit is contained in:
parent
e9ffb84179
commit
4ab4517016
3 changed files with 81 additions and 25 deletions
|
@ -498,18 +498,13 @@ void MDYPlayer::init() {
|
||||||
_timbresSize = 0;
|
_timbresSize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MDYPlayer::loadMDY(const char *fileName) {
|
bool MDYPlayer::loadMDY(Common::SeekableReadStream &stream) {
|
||||||
Common::File song;
|
unloadMDY();
|
||||||
byte mdyHeader[70];
|
|
||||||
|
|
||||||
unload();
|
|
||||||
song.open(fileName);
|
|
||||||
if (!song.isOpen())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
_freeData = true;
|
_freeData = true;
|
||||||
|
|
||||||
song.read(mdyHeader, 70);
|
byte mdyHeader[70];
|
||||||
|
stream.read(mdyHeader, 70);
|
||||||
|
|
||||||
_tickBeat = mdyHeader[36];
|
_tickBeat = mdyHeader[36];
|
||||||
_beatMeasure = mdyHeader[37];
|
_beatMeasure = mdyHeader[37];
|
||||||
|
@ -527,8 +522,7 @@ bool MDYPlayer::loadMDY(const char *fileName) {
|
||||||
_pitchBendRangeStep = 300;
|
_pitchBendRangeStep = 300;
|
||||||
|
|
||||||
_data = new byte[_dataSize];
|
_data = new byte[_dataSize];
|
||||||
song.read(_data, _dataSize);
|
stream.read(_data, _dataSize);
|
||||||
song.close();
|
|
||||||
|
|
||||||
reset();
|
reset();
|
||||||
_playPos = _data;
|
_playPos = _data;
|
||||||
|
@ -536,18 +530,32 @@ bool MDYPlayer::loadMDY(const char *fileName) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MDYPlayer::loadTBR(const char *fileName) {
|
bool MDYPlayer::loadMDY(const char *fileName) {
|
||||||
Common::File timbres;
|
Common::File song;
|
||||||
|
|
||||||
unload();
|
song.open(fileName);
|
||||||
timbres.open(fileName);
|
if (!song.isOpen())
|
||||||
if (!timbres.isOpen())
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
_timbresSize = timbres.size();
|
bool loaded = loadMDY(song);
|
||||||
_timbres = new byte[_timbresSize];
|
|
||||||
timbres.read(_timbres, _timbresSize);
|
song.close();
|
||||||
timbres.close();
|
|
||||||
|
return loaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MDYPlayer::loadTBR(Common::SeekableReadStream &stream) {
|
||||||
|
unloadTBR();
|
||||||
|
|
||||||
|
_timbresSize = stream.size();
|
||||||
|
|
||||||
|
// FIXME: _timbresSize is smaller than setVoice() expects!
|
||||||
|
uint32 rSize = MAX<uint32>(_timbresSize, 810);
|
||||||
|
|
||||||
|
_timbres = new byte[rSize];
|
||||||
|
memset(_timbres, 0, rSize);
|
||||||
|
|
||||||
|
stream.read(_timbres, _timbresSize);
|
||||||
|
|
||||||
reset();
|
reset();
|
||||||
setVoices();
|
setVoices();
|
||||||
|
@ -555,9 +563,30 @@ bool MDYPlayer::loadTBR(const char *fileName) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MDYPlayer::unload() {
|
bool MDYPlayer::loadTBR(const char *fileName) {
|
||||||
AdLib::unload();
|
Common::File timbres;
|
||||||
|
|
||||||
|
timbres.open(fileName);
|
||||||
|
if (!timbres.isOpen())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool loaded = loadTBR(timbres);
|
||||||
|
|
||||||
|
timbres.close();
|
||||||
|
|
||||||
|
return loaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MDYPlayer::unload() {
|
||||||
|
unloadTBR();
|
||||||
|
unloadMDY();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MDYPlayer::unloadMDY() {
|
||||||
|
AdLib::unload();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MDYPlayer::unloadTBR() {
|
||||||
delete[] _timbres;
|
delete[] _timbres;
|
||||||
|
|
||||||
_timbres = 0;
|
_timbres = 0;
|
||||||
|
@ -636,7 +665,7 @@ void MDYPlayer::interpret() {
|
||||||
setVoice(channel, timbre, false);
|
setVoice(channel, timbre, false);
|
||||||
break;
|
break;
|
||||||
case 0xE0:
|
case 0xE0:
|
||||||
warning("Pitch bend not yet implemented\n");
|
warning("Pitch bend not yet implemented");
|
||||||
|
|
||||||
note = *(_playPos)++;
|
note = *(_playPos)++;
|
||||||
note += (unsigned)(*(_playPos++)) << 7;
|
note += (unsigned)(*(_playPos++)) << 7;
|
||||||
|
|
|
@ -142,7 +142,9 @@ public:
|
||||||
~MDYPlayer();
|
~MDYPlayer();
|
||||||
|
|
||||||
bool loadMDY(const char *fileName);
|
bool loadMDY(const char *fileName);
|
||||||
|
bool loadMDY(Common::SeekableReadStream &stream);
|
||||||
bool loadTBR(const char *fileName);
|
bool loadTBR(const char *fileName);
|
||||||
|
bool loadTBR(Common::SeekableReadStream &stream);
|
||||||
|
|
||||||
void unload();
|
void unload();
|
||||||
|
|
||||||
|
@ -162,6 +164,9 @@ protected:
|
||||||
void setVoices();
|
void setVoices();
|
||||||
void setVoice(byte voice, byte instr, bool set);
|
void setVoice(byte voice, byte instr, bool set);
|
||||||
|
|
||||||
|
void unloadTBR();
|
||||||
|
void unloadMDY();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void init();
|
void init();
|
||||||
};
|
};
|
||||||
|
|
|
@ -279,7 +279,18 @@ bool Sound::adlibLoadMDY(const char *fileName) {
|
||||||
|
|
||||||
debugC(1, kDebugSound, "Adlib: Loading MDY data (\"%s\")", fileName);
|
debugC(1, kDebugSound, "Adlib: Loading MDY data (\"%s\")", fileName);
|
||||||
|
|
||||||
return _mdyPlayer->loadMDY(fileName);
|
if (!_vm->_dataIO->existData(fileName)) {
|
||||||
|
warning("Can't open MDY file \"%s\"", fileName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DataStream *stream = _vm->_dataIO->getDataStream(fileName);
|
||||||
|
|
||||||
|
bool loaded = _mdyPlayer->loadMDY(*stream);
|
||||||
|
|
||||||
|
delete stream;
|
||||||
|
|
||||||
|
return loaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sound::adlibLoadTBR(const char *fileName) {
|
bool Sound::adlibLoadTBR(const char *fileName) {
|
||||||
|
@ -289,9 +300,20 @@ bool Sound::adlibLoadTBR(const char *fileName) {
|
||||||
if (!_mdyPlayer)
|
if (!_mdyPlayer)
|
||||||
_mdyPlayer = new MDYPlayer(*_vm->_mixer);
|
_mdyPlayer = new MDYPlayer(*_vm->_mixer);
|
||||||
|
|
||||||
|
if (!_vm->_dataIO->existData(fileName)) {
|
||||||
|
warning("Can't open TBR file \"%s\"", fileName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
debugC(1, kDebugSound, "Adlib: Loading MDY instruments (\"%s\")", fileName);
|
debugC(1, kDebugSound, "Adlib: Loading MDY instruments (\"%s\")", fileName);
|
||||||
|
|
||||||
return _mdyPlayer->loadTBR(fileName);
|
DataStream *stream = _vm->_dataIO->getDataStream(fileName);
|
||||||
|
|
||||||
|
bool loaded = _mdyPlayer->loadTBR(*stream);
|
||||||
|
|
||||||
|
delete stream;
|
||||||
|
|
||||||
|
return loaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::adlibPlayTrack(const char *trackname) {
|
void Sound::adlibPlayTrack(const char *trackname) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue