SCI/newmusic: now adding digital sample data as separate channel for sci0 games (not yet playing)

svn-id: r46629
This commit is contained in:
Martin Kiewitz 2009-12-27 12:17:43 +00:00
parent 19cb4ad6e0
commit e6ad7523c8
3 changed files with 41 additions and 24 deletions

View file

@ -1816,8 +1816,9 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi
_innerResource = resource;
byte *data = resource->data, *data2;
Channel *channel;
byte *data, *data2;
byte *dataEnd;
Channel *channel, *sampleChannel;
switch (_soundVersion) {
case SCI_VERSION_0_EARLY:
@ -1825,12 +1826,15 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi
// SCI0 only has a header of 0x11/0x21 byte length and the actual midi track follows afterwards
_trackCount = 1;
_tracks = new Track[_trackCount];
_tracks->nDigital = 0xFF;
_tracks->digitalChannelNr = -1;
_tracks->type = TRACKTYPE_NONE;
_tracks->channelCount = 1;
// Digital sample data included? -> Add an additional channel
if (resource->data[0] == 2)
_tracks->channelCount++;
_tracks->channels = new Channel[_tracks->channelCount];
channel = _tracks->channels;
memset(_tracks->channels, 0, sizeof(Channel) * _tracks->channelCount);
channel = &_tracks->channels[0];
if (_soundVersion == SCI_VERSION_0_EARLY) {
channel->data = resource->data + 0x11;
channel->size = resource->size - 0x11;
@ -1838,15 +1842,28 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi
channel->data = resource->data + 0x21;
channel->size = resource->size - 0x21;
}
channel->number = 0;
channel->poly = 0;
channel->time = channel->prev = 0;
channel->unk = 0;
if (_tracks->channelCount == 2) {
// Digital sample data included
_tracks->digitalChannelNr = 1;
sampleChannel = &_tracks->channels[1];
// we need to find 0xFC (channel terminator) within the data
data = channel->data;
dataEnd = channel->data + channel->size;
while ((data < dataEnd) && (*data != 0xfc))
data++;
// Skip any following 0xFCs as well
while ((data < dataEnd) && (*data == 0xfc))
data++;
// Now adjust channels accordingly
sampleChannel->data = data;
sampleChannel->size = channel->size - (data - channel->data);
channel->size = data - channel->data;
}
break;
case SCI_VERSION_1_EARLY:
case SCI_VERSION_1_LATE:
data = resource->data;
// Count # of tracks
_trackCount = 0;
while ((*data++) != 0xFF) {
@ -1873,7 +1890,7 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi
}
_tracks[trackNr].channels = new Channel[_tracks[trackNr].channelCount];
if (_tracks[trackNr].type != 0xF0) { // Digital track marker - not supported currently
_tracks[trackNr].nDigital = 0xFF; // No digital channel associated
_tracks[trackNr].digitalChannelNr = -1; // No digital sound associated
for (channelNr = 0; channelNr < _tracks[trackNr].channelCount; channelNr++) {
channel = &_tracks[trackNr].channels[channelNr];
channel->unk = READ_LE_UINT16(data);
@ -1883,7 +1900,7 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi
channel->poly = *(channel->data - 1);
channel->time = channel->prev = 0;
if (channel->number == 0xFE) // Digital channel
_tracks[trackNr].nDigital = channelNr;
_tracks[trackNr].digitalChannelNr = channelNr;
data += 6;
}
} else {

View file

@ -450,7 +450,7 @@ public:
struct Track {
TrackType type;
byte nDigital;
int16 digitalChannelNr;
byte channelCount;
Channel *channels;
};

View file

@ -304,13 +304,13 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) {
if (track) {
// if MIDI device is selected but there is no digital track in sound resource
// try to use adlib's digital sample if possible
if (_midiType <= MD_MT32 && track->nDigital == 0xFF && _bMultiMidi) {
if (pSnd->soundRes->getTrackByType(SoundResource::TRACKTYPE_ADLIB)->nDigital != 0xFF)
if (_midiType <= MD_MT32 && track->digitalChannelNr == -1 && _bMultiMidi) {
if (pSnd->soundRes->getTrackByType(SoundResource::TRACKTYPE_ADLIB)->digitalChannelNr != -1)
track = pSnd->soundRes->getTrackByType(SoundResource::TRACKTYPE_ADLIB);
}
// play digital sample
if (track->nDigital != 0xFF) {
byte *channelData = track->channels[track->nDigital].data;
if (track->digitalChannelNr != -1) {
byte *channelData = track->channels[track->digitalChannelNr].data;
int rate = READ_LE_UINT16(channelData);
uint32 size = READ_LE_UINT16(channelData + 2);
assert(READ_LE_UINT16(channelData + 4) == 0); // Possibly a compression flag