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;
|
||||
byte *data = 0;
|
||||
int rate = 0, size = 0;
|
||||
byte flags = 0;
|
||||
Common::File* file;
|
||||
|
||||
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)
|
||||
buffer.isBigEndian = context->isBigEndian;
|
||||
if ((context->fileType & GAME_VOICEFILE) && (_vm->getFeatures() & GF_LE_VOICES))
|
||||
buffer.isBigEndian = false;
|
||||
// Default sound type is 16-bit signed PCM, used in ITE by PCM and VOX files
|
||||
buffer.isCompressed = context->isCompressed;
|
||||
buffer.soundType = resourceType;
|
||||
buffer.originalSize = 0;
|
||||
buffer.stereo = false;
|
||||
buffer.isSigned = true; // default for PCM and VOX
|
||||
buffer.frequency = 22050; // default for PCM and VOX
|
||||
buffer.sampleBits = 16; // default for PCM and VOX
|
||||
// Set default flags and frequency for PCM, VOC and VOX files, which got no header
|
||||
buffer.flags = Audio::Mixer::FLAG_16BITS;
|
||||
buffer.frequency = 22050;
|
||||
if (_vm->getGameId() == GID_ITE) {
|
||||
if (_vm->getFeatures() & GF_8BIT_UNSIGNED_PCM) { // older ITE demos
|
||||
buffer.isSigned = false;
|
||||
buffer.sampleBits = 8;
|
||||
buffer.flags |= Audio::Mixer::FLAG_UNSIGNED;
|
||||
buffer.flags &= ~Audio::Mixer::FLAG_16BITS;
|
||||
} else {
|
||||
// Voice files in newer ITE demo versions are OKI ADPCM (VOX) encoded
|
||||
if (!scumm_stricmp(context->fileName, "voicesd.rsc"))
|
||||
|
@ -292,6 +287,12 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
|
|||
}
|
||||
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
|
||||
int soundOffset = (context->fileType & GAME_MACBINARY) ? 36 : 0;
|
||||
|
||||
|
@ -321,25 +322,23 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
|
|||
case kSoundShorten:
|
||||
case kSoundVOC:
|
||||
if (resourceType == kSoundWAV) {
|
||||
result = Audio::loadWAVFromStream(readS, size, rate, flags);
|
||||
result = Audio::loadWAVFromStream(readS, size, rate, buffer.flags);
|
||||
} 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) {
|
||||
data = Audio::loadVOCFromStream(readS, size, rate);
|
||||
result = (data != 0);
|
||||
if (onlyHeader)
|
||||
free(data);
|
||||
#ifdef ENABLE_SAGA2
|
||||
} else if (resourceType == kSoundShorten) {
|
||||
result = Audio::loadShortenFromStream(readS, size, rate, flags);
|
||||
#endif
|
||||
buffer.flags |= Audio::Mixer::FLAG_UNSIGNED;
|
||||
}
|
||||
|
||||
if (result) {
|
||||
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;
|
||||
|
||||
if (!onlyHeader && resourceType != kSoundVOC) {
|
||||
|
@ -360,8 +359,10 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
|
|||
readS.readByte(); // Skip compression identifier byte
|
||||
buffer.frequency = readS.readUint16LE();
|
||||
buffer.originalSize = readS.readUint32LE();
|
||||
buffer.sampleBits = readS.readByte();
|
||||
buffer.stereo = (readS.readByte() == char(0)) ? false : true;
|
||||
if (readS.readByte() == 8) // read sample bits
|
||||
buffer.flags &= ~Audio::Mixer::FLAG_16BITS;
|
||||
if (readS.readByte() != 0) // read stereo flag
|
||||
buffer.flags |= Audio::Mixer::FLAG_STEREO;
|
||||
|
||||
buffer.size = soundResourceLength;
|
||||
buffer.soundType = resourceType;
|
||||
|
@ -407,12 +408,12 @@ int SndRes::getVoiceLength(uint32 resourceId) {
|
|||
msDouble = (double)buffer.size;
|
||||
else
|
||||
msDouble = (double)buffer.originalSize;
|
||||
if (buffer.sampleBits == 16) {
|
||||
|
||||
if (buffer.flags & Audio::Mixer::FLAG_16BITS)
|
||||
msDouble /= 2.0;
|
||||
}
|
||||
if (buffer.stereo) {
|
||||
|
||||
if (buffer.flags & Audio::Mixer::FLAG_STEREO)
|
||||
msDouble /= 2.0;
|
||||
}
|
||||
|
||||
msDouble = msDouble / buffer.frequency * 1000.0;
|
||||
return (int)msDouble;
|
||||
|
|
|
@ -65,29 +65,18 @@ SndHandle *Sound::getHandle() {
|
|||
|
||||
void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int volume,
|
||||
sndHandleType handleType, bool loop) {
|
||||
byte flags;
|
||||
|
||||
flags = Audio::Mixer::FLAG_AUTOFREE;
|
||||
buffer.flags |= Audio::Mixer::FLAG_AUTOFREE;
|
||||
|
||||
if (loop)
|
||||
flags |= Audio::Mixer::FLAG_LOOP;
|
||||
buffer.flags |= Audio::Mixer::FLAG_LOOP;
|
||||
|
||||
if (buffer.sampleBits == 16) {
|
||||
flags |= Audio::Mixer::FLAG_16BITS;
|
||||
|
||||
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;
|
||||
Audio::Mixer::SoundType soundType = (handleType == kVoiceHandle) ?
|
||||
Audio::Mixer::kSpeechSoundType : Audio::Mixer::kSFXSoundType;
|
||||
|
||||
if (!buffer.isCompressed) {
|
||||
Audio::Mixer::SoundType soundType = (handleType == kVoiceHandle) ?
|
||||
Audio::Mixer::kSpeechSoundType : Audio::Mixer::kSFXSoundType;
|
||||
_mixer->playRaw(soundType, handle, buffer.buffer,
|
||||
buffer.size, buffer.frequency, flags, -1, volume);
|
||||
buffer.size, buffer.frequency, buffer.flags, -1, volume);
|
||||
} else {
|
||||
Audio::AudioStream *stream = 0;
|
||||
|
||||
|
@ -113,14 +102,8 @@ void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int
|
|||
break;
|
||||
}
|
||||
|
||||
if (stream != NULL) {
|
||||
if (handleType == kVoiceHandle)
|
||||
_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);
|
||||
}
|
||||
if (stream != NULL)
|
||||
_mixer->playInputStream(soundType, handle, stream, -1, volume, 0, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -44,15 +44,12 @@ enum SOUND_FLAGS {
|
|||
|
||||
struct SoundBuffer {
|
||||
uint16 frequency;
|
||||
int sampleBits;
|
||||
bool stereo;
|
||||
bool isSigned;
|
||||
bool isCompressed;
|
||||
byte flags;
|
||||
|
||||
byte *buffer;
|
||||
size_t size;
|
||||
size_t originalSize;
|
||||
bool isBigEndian;
|
||||
GameSoundTypes soundType;
|
||||
size_t fileOffset;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue