Simplified the sound playing code by removing the boolean variables for signed, stereo, endian and sample bit information - now sound flags are used instead. Some cleanup.
svn-id: r43470
This commit is contained in:
parent
c368f60a1d
commit
a9eb98c218
3 changed files with 35 additions and 54 deletions
|
@ -192,7 +192,6 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
|
||||||
GameSoundTypes resourceType = kSoundPCM;
|
GameSoundTypes resourceType = kSoundPCM;
|
||||||
byte *data = 0;
|
byte *data = 0;
|
||||||
int rate = 0, size = 0;
|
int rate = 0, size = 0;
|
||||||
byte flags = 0;
|
|
||||||
Common::File* file;
|
Common::File* file;
|
||||||
|
|
||||||
if (resourceId == (uint32)-1) {
|
if (resourceId == (uint32)-1) {
|
||||||
|
@ -269,21 +268,17 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default sound type is 16-bit PCM (used in ITE)
|
// Default sound type is 16-bit signed PCM, used in ITE by PCM and VOX files
|
||||||
buffer.isBigEndian = context->isBigEndian;
|
|
||||||
if ((context->fileType & GAME_VOICEFILE) && (_vm->getFeatures() & GF_LE_VOICES))
|
|
||||||
buffer.isBigEndian = false;
|
|
||||||
buffer.isCompressed = context->isCompressed;
|
buffer.isCompressed = context->isCompressed;
|
||||||
buffer.soundType = resourceType;
|
buffer.soundType = resourceType;
|
||||||
buffer.originalSize = 0;
|
buffer.originalSize = 0;
|
||||||
buffer.stereo = false;
|
// Set default flags and frequency for PCM, VOC and VOX files, which got no header
|
||||||
buffer.isSigned = true; // default for PCM and VOX
|
buffer.flags = Audio::Mixer::FLAG_16BITS;
|
||||||
buffer.frequency = 22050; // default for PCM and VOX
|
buffer.frequency = 22050;
|
||||||
buffer.sampleBits = 16; // default for PCM and VOX
|
|
||||||
if (_vm->getGameId() == GID_ITE) {
|
if (_vm->getGameId() == GID_ITE) {
|
||||||
if (_vm->getFeatures() & GF_8BIT_UNSIGNED_PCM) { // older ITE demos
|
if (_vm->getFeatures() & GF_8BIT_UNSIGNED_PCM) { // older ITE demos
|
||||||
buffer.isSigned = false;
|
buffer.flags |= Audio::Mixer::FLAG_UNSIGNED;
|
||||||
buffer.sampleBits = 8;
|
buffer.flags &= ~Audio::Mixer::FLAG_16BITS;
|
||||||
} else {
|
} else {
|
||||||
// Voice files in newer ITE demo versions are OKI ADPCM (VOX) encoded
|
// Voice files in newer ITE demo versions are OKI ADPCM (VOX) encoded
|
||||||
if (!scumm_stricmp(context->fileName, "voicesd.rsc"))
|
if (!scumm_stricmp(context->fileName, "voicesd.rsc"))
|
||||||
|
@ -292,6 +287,12 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
|
||||||
}
|
}
|
||||||
buffer.buffer = NULL;
|
buffer.buffer = NULL;
|
||||||
|
|
||||||
|
// Check for LE sounds
|
||||||
|
if (!context->isBigEndian)
|
||||||
|
buffer.flags |= Audio::Mixer::FLAG_LITTLE_ENDIAN;
|
||||||
|
if ((context->fileType & GAME_VOICEFILE) && (_vm->getFeatures() & GF_LE_VOICES))
|
||||||
|
buffer.flags |= Audio::Mixer::FLAG_LITTLE_ENDIAN;
|
||||||
|
|
||||||
// Older Mac versions of ITE were Macbinary packed
|
// Older Mac versions of ITE were Macbinary packed
|
||||||
int soundOffset = (context->fileType & GAME_MACBINARY) ? 36 : 0;
|
int soundOffset = (context->fileType & GAME_MACBINARY) ? 36 : 0;
|
||||||
|
|
||||||
|
@ -321,25 +322,23 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
|
||||||
case kSoundShorten:
|
case kSoundShorten:
|
||||||
case kSoundVOC:
|
case kSoundVOC:
|
||||||
if (resourceType == kSoundWAV) {
|
if (resourceType == kSoundWAV) {
|
||||||
result = Audio::loadWAVFromStream(readS, size, rate, flags);
|
result = Audio::loadWAVFromStream(readS, size, rate, buffer.flags);
|
||||||
} else if (resourceType == kSoundAIFF) {
|
} else if (resourceType == kSoundAIFF) {
|
||||||
result = Audio::loadAIFFFromStream(readS, size, rate, flags);
|
result = Audio::loadAIFFFromStream(readS, size, rate, buffer.flags);
|
||||||
|
#ifdef ENABLE_SAGA2
|
||||||
|
} else if (resourceType == kSoundShorten) {
|
||||||
|
result = Audio::loadShortenFromStream(readS, size, rate, buffer.flags);
|
||||||
|
#endif
|
||||||
} else if (resourceType == kSoundVOC) {
|
} else if (resourceType == kSoundVOC) {
|
||||||
data = Audio::loadVOCFromStream(readS, size, rate);
|
data = Audio::loadVOCFromStream(readS, size, rate);
|
||||||
result = (data != 0);
|
result = (data != 0);
|
||||||
if (onlyHeader)
|
if (onlyHeader)
|
||||||
free(data);
|
free(data);
|
||||||
#ifdef ENABLE_SAGA2
|
buffer.flags |= Audio::Mixer::FLAG_UNSIGNED;
|
||||||
} else if (resourceType == kSoundShorten) {
|
|
||||||
result = Audio::loadShortenFromStream(readS, size, rate, flags);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
buffer.frequency = rate;
|
buffer.frequency = rate;
|
||||||
buffer.sampleBits = (flags & Audio::Mixer::FLAG_16BITS) ? 16 : 8;
|
|
||||||
buffer.stereo = flags & Audio::Mixer::FLAG_STEREO;
|
|
||||||
buffer.isSigned = (resourceType == kSoundVOC) ? false : !(flags & Audio::Mixer::FLAG_UNSIGNED);
|
|
||||||
buffer.size = size;
|
buffer.size = size;
|
||||||
|
|
||||||
if (!onlyHeader && resourceType != kSoundVOC) {
|
if (!onlyHeader && resourceType != kSoundVOC) {
|
||||||
|
@ -360,8 +359,10 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
|
||||||
readS.readByte(); // Skip compression identifier byte
|
readS.readByte(); // Skip compression identifier byte
|
||||||
buffer.frequency = readS.readUint16LE();
|
buffer.frequency = readS.readUint16LE();
|
||||||
buffer.originalSize = readS.readUint32LE();
|
buffer.originalSize = readS.readUint32LE();
|
||||||
buffer.sampleBits = readS.readByte();
|
if (readS.readByte() == 8) // read sample bits
|
||||||
buffer.stereo = (readS.readByte() == char(0)) ? false : true;
|
buffer.flags &= ~Audio::Mixer::FLAG_16BITS;
|
||||||
|
if (readS.readByte() != 0) // read stereo flag
|
||||||
|
buffer.flags |= Audio::Mixer::FLAG_STEREO;
|
||||||
|
|
||||||
buffer.size = soundResourceLength;
|
buffer.size = soundResourceLength;
|
||||||
buffer.soundType = resourceType;
|
buffer.soundType = resourceType;
|
||||||
|
@ -407,12 +408,12 @@ int SndRes::getVoiceLength(uint32 resourceId) {
|
||||||
msDouble = (double)buffer.size;
|
msDouble = (double)buffer.size;
|
||||||
else
|
else
|
||||||
msDouble = (double)buffer.originalSize;
|
msDouble = (double)buffer.originalSize;
|
||||||
if (buffer.sampleBits == 16) {
|
|
||||||
|
if (buffer.flags & Audio::Mixer::FLAG_16BITS)
|
||||||
msDouble /= 2.0;
|
msDouble /= 2.0;
|
||||||
}
|
|
||||||
if (buffer.stereo) {
|
if (buffer.flags & Audio::Mixer::FLAG_STEREO)
|
||||||
msDouble /= 2.0;
|
msDouble /= 2.0;
|
||||||
}
|
|
||||||
|
|
||||||
msDouble = msDouble / buffer.frequency * 1000.0;
|
msDouble = msDouble / buffer.frequency * 1000.0;
|
||||||
return (int)msDouble;
|
return (int)msDouble;
|
||||||
|
|
|
@ -65,29 +65,18 @@ SndHandle *Sound::getHandle() {
|
||||||
|
|
||||||
void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int volume,
|
void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int volume,
|
||||||
sndHandleType handleType, bool loop) {
|
sndHandleType handleType, bool loop) {
|
||||||
byte flags;
|
|
||||||
|
|
||||||
flags = Audio::Mixer::FLAG_AUTOFREE;
|
buffer.flags |= Audio::Mixer::FLAG_AUTOFREE;
|
||||||
|
|
||||||
if (loop)
|
if (loop)
|
||||||
flags |= Audio::Mixer::FLAG_LOOP;
|
buffer.flags |= Audio::Mixer::FLAG_LOOP;
|
||||||
|
|
||||||
if (buffer.sampleBits == 16) {
|
Audio::Mixer::SoundType soundType = (handleType == kVoiceHandle) ?
|
||||||
flags |= Audio::Mixer::FLAG_16BITS;
|
Audio::Mixer::kSpeechSoundType : Audio::Mixer::kSFXSoundType;
|
||||||
|
|
||||||
if (!buffer.isBigEndian)
|
|
||||||
flags |= Audio::Mixer::FLAG_LITTLE_ENDIAN;
|
|
||||||
}
|
|
||||||
if (buffer.stereo)
|
|
||||||
flags |= Audio::Mixer::FLAG_STEREO;
|
|
||||||
if (!buffer.isSigned)
|
|
||||||
flags |= Audio::Mixer::FLAG_UNSIGNED;
|
|
||||||
|
|
||||||
if (!buffer.isCompressed) {
|
if (!buffer.isCompressed) {
|
||||||
Audio::Mixer::SoundType soundType = (handleType == kVoiceHandle) ?
|
|
||||||
Audio::Mixer::kSpeechSoundType : Audio::Mixer::kSFXSoundType;
|
|
||||||
_mixer->playRaw(soundType, handle, buffer.buffer,
|
_mixer->playRaw(soundType, handle, buffer.buffer,
|
||||||
buffer.size, buffer.frequency, flags, -1, volume);
|
buffer.size, buffer.frequency, buffer.flags, -1, volume);
|
||||||
} else {
|
} else {
|
||||||
Audio::AudioStream *stream = 0;
|
Audio::AudioStream *stream = 0;
|
||||||
|
|
||||||
|
@ -113,14 +102,8 @@ void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stream != NULL) {
|
if (stream != NULL)
|
||||||
if (handleType == kVoiceHandle)
|
_mixer->playInputStream(soundType, handle, stream, -1, volume, 0, true, false);
|
||||||
_mixer->playInputStream(Audio::Mixer::kSpeechSoundType, handle, stream, -1,
|
|
||||||
volume, 0, true, false);
|
|
||||||
else
|
|
||||||
_mixer->playInputStream(Audio::Mixer::kSFXSoundType, handle, stream, -1,
|
|
||||||
volume, 0, true, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,15 +44,12 @@ enum SOUND_FLAGS {
|
||||||
|
|
||||||
struct SoundBuffer {
|
struct SoundBuffer {
|
||||||
uint16 frequency;
|
uint16 frequency;
|
||||||
int sampleBits;
|
|
||||||
bool stereo;
|
|
||||||
bool isSigned;
|
|
||||||
bool isCompressed;
|
bool isCompressed;
|
||||||
|
byte flags;
|
||||||
|
|
||||||
byte *buffer;
|
byte *buffer;
|
||||||
size_t size;
|
size_t size;
|
||||||
size_t originalSize;
|
size_t originalSize;
|
||||||
bool isBigEndian;
|
|
||||||
GameSoundTypes soundType;
|
GameSoundTypes soundType;
|
||||||
size_t fileOffset;
|
size_t fileOffset;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue