fixed sound in many variation

some version should be tested

svn-id: r18585
This commit is contained in:
Andrew Kurushin
2005-07-26 19:40:58 +00:00
parent e175e68b99
commit c4f0d024ef
9 changed files with 289 additions and 114 deletions
+167 -26
View File
@@ -200,7 +200,12 @@ static GameFontDescription ITEDEMO_GameFonts[] = {
};
static GameSoundInfo ITEDEMO_GameSound = {
GAME_SOUND_VOC, 0, 0, 0
kSoundVOC,
-1,
-1,
false,
false,
true
};
// Inherit the Earth - Wyrmkeep Win32 Demo version
@@ -216,6 +221,33 @@ static GameFontDescription ITEWINDEMO_GameFonts[] = {
{0}
};
static GameSoundInfo ITEWINDEMO1_GameSound = {
kSoundPCM,
22050,
8,
false,
false,
false
};
static GameSoundInfo ITEWINDEMO2_GameVoice = {
kSoundVOX,
22050,
16,
false,
false,
true
};
static GameSoundInfo ITEWINDEMO2_GameSound = {
kSoundPCM,
22050,
16,
false,
false,
true
};
// Inherit the Earth - Wyrmkeep Mac Demo version
static GameFileDescription ITEMACDEMO_GameFiles[] = {
{"ited.rsc", GAME_RESOURCEFILE},
@@ -225,6 +257,33 @@ static GameFileDescription ITEMACDEMO_GameFiles[] = {
{"musicd.rsc", GAME_MUSICFILE}
};
static GameSoundInfo ITEMACDEMO_GameVoice = {
kSoundVOX,
22050,
16,
false,
false,
true
};
static GameSoundInfo ITEMACDEMO_GameSound = {
kSoundPCM,
22050,
16,
false,
true,
true
};
static GameSoundInfo ITEMACDEMO_GameMusic = {
kSoundPCM,
11025,
16,
false,
false,
true
};
// Inherit the Earth - Wyrmkeep Linux Demo version
static GameFileDescription ITELINDEMO_GameFiles[] = {
{"ited.rsc", GAME_RESOURCEFILE},
@@ -234,6 +293,15 @@ static GameFileDescription ITELINDEMO_GameFiles[] = {
{"musicd.rsc", GAME_MUSICFILE}
};
static GameSoundInfo ITELINDEMO_GameMusic = {
kSoundPCM,
11025,
16,
true,
false,
true
};
// Inherit the Earth - Wyrmkeep Linux version
static GameFileDescription ITELINCD_GameFiles[] = {
{"ite.rsc", GAME_RESOURCEFILE},
@@ -266,6 +334,24 @@ static GameFileDescription ITEMACCD_GameFiles[] = {
{"music.rsc", GAME_MUSICFILE}
};
static GameSoundInfo ITEMACCD_GameSound = {
kSoundPCM,
22050,
16,
false,
true,
true
};
static GameSoundInfo ITEMACCD_GameMusic = {
kSoundPCM,
11025,
16,
true,
false,
true
};
// Inherit the Earth - Diskette version
static GameFileDescription ITEDISK_GameFiles[] = {
{"ite.rsc", GAME_RESOURCEFILE},
@@ -280,7 +366,12 @@ static GameFontDescription ITEDISK_GameFonts[] = {
};
static GameSoundInfo ITEDISK_GameSound = {
GAME_SOUND_VOC, 0, 0, 0
kSoundVOC,
-1,
-1,
false,
false,
true
};
// Inherit the Earth - CD Enhanced version
@@ -298,10 +389,12 @@ static GameFontDescription ITECD_GameFonts[] = {
};
static GameSoundInfo ITECD_GameSound = {
GAME_SOUND_PCM,
kSoundPCM,
22050,
16,
false
false,
false,
true
};
static GamePatchDescription ITEWinPatch1_Files[] = {
@@ -356,7 +449,7 @@ static GamePatchDescription ITEWinPatch2_Files[] = {
{ "wyrm1.dlt", GAME_RESOURCEFILE, 1530},
{ "wyrm2.dlt", GAME_RESOURCEFILE, 1531},
{ "wyrm3.dlt", GAME_RESOURCEFILE, 1532},
{ "p2_a.iaf", GAME_VOICEFILE, 4}
{ "p2_a.iaf", GAME_VOICEFILE, 4, &ITECD_GameSound}
/* boarhall.bbm
elkenter.bbm
ferrets.bbm
@@ -373,7 +466,7 @@ static GamePatchDescription ITEMacPatch_Files[] = {
{ "wyrm4.dlt", GAME_RESOURCEFILE, 1533},
{ "credit3m.dlt", GAME_RESOURCEFILE, 1796},
{ "credit4m.dlt", GAME_RESOURCEFILE, 1797},
{ "p2_a.iaf", GAME_VOICEFILE, 4}
{ "p2_a.iaf", GAME_VOICEFILE, 4, &ITEMACCD_GameSound}
};
static GamePatchDescription ITELinPatch_Files[] = {
@@ -383,7 +476,7 @@ static GamePatchDescription ITELinPatch_Files[] = {
{ "wyrm3.dlt", GAME_RESOURCEFILE, 1532},
{ "credit3n.dlt", GAME_RESOURCEFILE, 1796},
{ "credit4n.dlt", GAME_RESOURCEFILE, 1797},
{ "P2_A.iaf", GAME_VOICEFILE, 4}
{ "P2_A.iaf", GAME_VOICEFILE, 4, &ITECD_GameSound}
};
// IHNM section
@@ -502,7 +595,7 @@ static GameFileDescription IHNMCD_GameFiles[] = {
{"patch.re_", GAME_PATCHFILE},
{"scripts.res", GAME_SCRIPTFILE},
{"sfx.res", GAME_SOUNDFILE},
{"voicess.res", GAME_VOICEFILE},
{"voicess.res", GAME_VOICEFILE}, //order of voice bank file is important
{"voices1.res", GAME_VOICEFILE},
{"voices2.res", GAME_VOICEFILE},
{"voices3.res", GAME_VOICEFILE},
@@ -519,7 +612,7 @@ static GameFileDescription IHNMCDDE_GameFiles[] = {
{"scripts.res", GAME_SCRIPTFILE},
{"patch.re_", GAME_PATCHFILE},
{"sfx.res", GAME_SOUNDFILE},
{"voicess.res", GAME_VOICEFILE},
{"voicess.res", GAME_VOICEFILE}, //order of voice bank file is important
{"voices1.res", GAME_VOICEFILE},
{"voices2.res", GAME_VOICEFILE},
{"voices3.res", GAME_VOICEFILE},
@@ -538,7 +631,12 @@ static GameFontDescription IHNMCD_GameFonts[] = {
};
static GameSoundInfo IHNM_GameSound = {
GAME_SOUND_WAV, 0, 0, 0
kSoundWAV,
-1,
-1,
false,
false,
true
};
struct GameMD5 {
@@ -667,6 +765,7 @@ static GameMD5 gameMD5[] = {
static GameDescription gameDescriptions[] = {
// Inherit the earth - DOS Demo version
// sound unchecked
{
"ite-demo",
GType_ITE,
@@ -680,6 +779,8 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(ITEDEMO_GameFonts),
ITEDEMO_GameFonts,
&ITEDEMO_GameSound,
&ITEDEMO_GameSound,
NULL,
0,
NULL,
0, // features
@@ -698,10 +799,12 @@ static GameDescription gameDescriptions[] = {
ITEMACDEMO_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITECD_GameSound,
&ITEMACDEMO_GameVoice,
&ITEMACDEMO_GameSound,
&ITEMACDEMO_GameMusic,
ARRAYSIZE(ITEMacPatch_Files),
ITEMacPatch_Files,
GF_VOX_VOICES | GF_BIG_ENDIAN_DATA | GF_MAC_RESOURCES | GF_WYRMKEEP | GF_CD_FX
GF_BIG_ENDIAN_DATA | GF_MAC_RESOURCES | GF_WYRMKEEP | GF_CD_FX
},
// Inherit the earth - early MAC Demo version
@@ -717,10 +820,12 @@ static GameDescription gameDescriptions[] = {
ITEMACDEMO_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITECD_GameSound,
&ITEMACDEMO_GameVoice,
&ITEMACDEMO_GameSound,
&ITEMACCD_GameMusic,
ARRAYSIZE(ITEMacPatch_Files),
ITEMacPatch_Files,
GF_VOX_VOICES | GF_BIG_ENDIAN_DATA | GF_MAC_RESOURCES | GF_WYRMKEEP | GF_CD_FX
GF_BIG_ENDIAN_DATA | GF_MAC_RESOURCES | GF_WYRMKEEP | GF_CD_FX
},
// Inherit the earth - MAC CD Wyrmkeep version
@@ -736,7 +841,9 @@ static GameDescription gameDescriptions[] = {
ITEMACCD_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITECD_GameSound,
&ITEMACCD_GameSound,
&ITEMACCD_GameSound,
&ITEMACCD_GameMusic,
ARRAYSIZE(ITEMacPatch_Files),
ITEMacPatch_Files,
GF_BIG_ENDIAN_DATA | GF_MAC_RESOURCES | GF_WYRMKEEP | GF_CD_FX
@@ -754,12 +861,14 @@ static GameDescription gameDescriptions[] = {
&ITE_Resources,
ARRAYSIZE(ITELINDEMO_GameFiles),
ITELINDEMO_GameFiles,
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
0,
NULL,
GF_VOX_VOICES | GF_WYRMKEEP | GF_CD_FX
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITEWINDEMO2_GameVoice,
&ITEWINDEMO2_GameSound,
&ITELINDEMO_GameMusic,
ARRAYSIZE(ITELinPatch_Files),
ITELinPatch_Files,
GF_WYRMKEEP | GF_CD_FX
},
// Inherit the earth - Win32 Demo version
@@ -775,10 +884,12 @@ static GameDescription gameDescriptions[] = {
ITEWINDEMO_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITECD_GameSound,
&ITEWINDEMO2_GameVoice,
&ITEWINDEMO2_GameSound,
NULL,
ARRAYSIZE(ITEWinPatch2_Files),
ITEWinPatch2_Files,
GF_VOX_VOICES | GF_WYRMKEEP | GF_CD_FX
GF_WYRMKEEP | GF_CD_FX
},
// Inherit the earth - early Win32 Demo version
@@ -794,13 +905,16 @@ static GameDescription gameDescriptions[] = {
ITEWINDEMO_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITECD_GameSound,
&ITEWINDEMO1_GameSound,
&ITEWINDEMO1_GameSound,
NULL,
ARRAYSIZE(ITEWinPatch1_Files),
ITEWinPatch1_Files,
GF_VOX_VOICES | GF_WYRMKEEP | GF_CD_FX
GF_WYRMKEEP | GF_CD_FX
},
// Inherit the earth - Wyrmkeep combined Windows/Mac/Linux CD
// sound unchecked
{
"ite",
GType_ITE,
@@ -814,13 +928,16 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
&ITECD_GameSound,
NULL,
0,
NULL,
GF_WYRMKEEP | GF_BIG_ENDIAN_VOICES | GF_CD_FX
GF_WYRMKEEP | GF_CD_FX
},
// Inherit the earth - Wyrmkeep Linux CD version
// should be before GID_ITE_CD_G
// sound unchecked
{
"ite",
GType_ITE,
@@ -834,12 +951,15 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
&ITECD_GameSound,
NULL,
ARRAYSIZE(ITELinPatch_Files),
ITELinPatch_Files,
GF_WYRMKEEP | GF_CD_FX
},
// Inherit the earth - Wyrmkeep Windows CD version
// sound unchecked
{
"ite",
GType_ITE,
@@ -853,12 +973,15 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
&ITECD_GameSound,
NULL,
ARRAYSIZE(ITEWinPatch1_Files),
ITEWinPatch1_Files,
GF_WYRMKEEP | GF_CD_FX
},
// Inherit the earth - DOS CD version
// sound unchecked
{
"ite",
GType_ITE,
@@ -872,12 +995,15 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
&ITECD_GameSound,
NULL,
0,
NULL,
GF_CD_FX
},
// Inherit the earth - DOS CD German version
// sound unchecked
{
"ite",
GType_ITE,
@@ -891,6 +1017,8 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
&ITECD_GameSound,
NULL,
0,
NULL,
GF_LANG_DE | GF_CD_FX
@@ -910,12 +1038,15 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
&ITECD_GameSound,
NULL,
0,
NULL,
GF_CD_FX
},
// Inherit the earth - German Floppy version
// sound unchecked
{
"ite",
GType_ITE,
@@ -929,6 +1060,8 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(ITEDISK_GameFonts),
ITEDISK_GameFonts,
&ITEDISK_GameSound,
&ITEDISK_GameSound,
NULL,
0,
NULL,
GF_LANG_DE
@@ -948,6 +1081,8 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(ITEDISK_GameFonts),
ITEDISK_GameFonts,
&ITEDISK_GameSound,
&ITEDISK_GameSound,
NULL,
0,
NULL,
0
@@ -967,6 +1102,8 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(IHNMCD_GameFonts),
IHNMCD_GameFonts,
&IHNM_GameSound,
&IHNM_GameSound,
NULL,
0,
NULL,
GF_DEFAULT_TO_1X_SCALER
@@ -986,6 +1123,8 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(IHNMCD_GameFonts),
IHNMCD_GameFonts,
&IHNM_GameSound,
&IHNM_GameSound,
NULL,
0,
NULL,
GF_DEFAULT_TO_1X_SCALER
@@ -1005,6 +1144,8 @@ static GameDescription gameDescriptions[] = {
ARRAYSIZE(IHNMCD_GameFonts),
IHNMCD_GameFonts,
&IHNM_GameSound,
&IHNM_GameSound,
NULL,
0,
NULL,
GF_DEFAULT_TO_1X_SCALER
+8 -2
View File
@@ -52,6 +52,7 @@ private:
int16 _buf[BUFFER_SIZE];
const int16 *_bufferEnd;
const int16 *_pos;
const GameSoundInfo *_musicInfo;
void refill();
bool eosIntern() const {
@@ -64,8 +65,8 @@ public:
int readBuffer(int16 *buffer, const int numSamples);
bool endOfData() const { return eosIntern(); }
bool isStereo() const { return true; }
int getRate() const { return 11025; }
bool isStereo() const { return _musicInfo->stereo; }
int getRate() const { return _musicInfo->frequency; }
};
RAWInputStream::RAWInputStream(SagaEngine *vm, ResourceContext *context, uint32 resourceId, bool looping)
@@ -75,6 +76,11 @@ RAWInputStream::RAWInputStream(SagaEngine *vm, ResourceContext *context, uint32
resourceData = vm->_resource->getResourceData(context, resourceId);
_file = context->getFile(resourceData);
_musicInfo = vm->getMusicInfo();
if (_musicInfo == NULL) {
error("RAWInputStream() wrong musicInfo");
}
// Determine the end position
_startPos = resourceData->offset;
+6 -12
View File
@@ -55,10 +55,6 @@ bool Resource::loadContext(ResourceContext *context) {
context->isBigEndian = _vm->isBigEndian();
if (!context->isBigEndian) {
context->isBigEndian = ((_vm->getFeatures() & GF_BIG_ENDIAN_VOICES) != 0) && ((context->fileType & GAME_VOICEFILE) != 0);
}
if (context->file->size() < RSC_MIN_FILESIZE) {
return false;
}
@@ -113,16 +109,14 @@ bool Resource::loadContext(ResourceContext *context) {
patchDescription = &_vm->getGameDescription()->patchDescriptions[j];
if ((patchDescription->fileType & context->fileType) != 0) {
if (patchDescription->resourceId < context->count) {
//TODO|fix: should we convert this ID? or make separate patch list for MAC version?
resourceData = &context->table[patchDescription->resourceId];
resourceData->patchFile = new Common::File();
if (resourceData->patchFile->open(patchDescription->fileName)) {
resourceData->patchData = new PatchData(patchDescription);
if (resourceData->patchData->_patchFile->open(patchDescription->fileName)) {
resourceData->offset = 0;
resourceData->size = resourceData->patchFile->size();
resourceData->size = resourceData->patchData->_patchFile->size();
} else {
warning("loadContext: patch file not found %s", patchDescription->fileName);
delete resourceData->patchFile;
resourceData->patchFile = NULL;
delete resourceData->patchData;
resourceData->patchData = NULL;
}
}
}
@@ -177,7 +171,7 @@ void Resource::clearContexts() {
delete context->file;
if (context->table != NULL) {
for(j = 0; j < context->count; j++) {
delete context->table[j].patchFile;
delete context->table[j].patchData;
}
}
free(context->table);
+16 -3
View File
@@ -38,10 +38,23 @@ namespace Saga {
//TODO: good PATCH.RE_ support
struct PatchData {
Common::File *_patchFile;
GamePatchDescription *_patchDescription;
PatchData(GamePatchDescription *patchDescription): _patchDescription(patchDescription) {
_patchFile = new Common::File();
}
~PatchData() {
delete _patchFile;
}
};
struct ResourceData {
size_t offset;
size_t size;
Common::File *patchFile;
PatchData *patchData;
};
struct ResourceContext {
@@ -55,8 +68,8 @@ struct ResourceContext {
size_t count;
Common::File *getFile(ResourceData *resourceData) const {
if (resourceData->patchFile != NULL) {
return resourceData->patchFile;
if (resourceData->patchData != NULL) {
return resourceData->patchData->_patchFile;
} else {
return file;
}
+18 -13
View File
@@ -293,20 +293,18 @@ enum GameFileTypes {
};
enum GameSoundTypes {
GAME_SOUND_PCM = 0,
GAME_SOUND_VOC,
GAME_SOUND_WAV,
GAME_SOUND_VOX
kSoundPCM = 0,
kSoundVOX = 1,
kSoundVOC = 2,
kSoundWAV = 3
};
enum GameFeatures {
GF_VOX_VOICES = 1 << 0,
GF_BIG_ENDIAN_VOICES = 1 << 1,
GF_BIG_ENDIAN_DATA = 1 << 2,
GF_MAC_RESOURCES = 1 << 3,
GF_LANG_DE = 1 << 4,
GF_WYRMKEEP = 1 << 5,
GF_CD_FX = 1 << 6
GF_BIG_ENDIAN_DATA = 1 << 0,
GF_MAC_RESOURCES = 1 << 1,
GF_LANG_DE = 1 << 2,
GF_WYRMKEEP = 1 << 3,
GF_CD_FX = 1 << 4
};
enum FontId {
@@ -329,6 +327,8 @@ struct GameSoundInfo {
long frequency;
int sampleBits;
bool stereo;
bool isBigEndian;
bool isSigned;
};
struct GameFontDescription {
@@ -357,6 +357,7 @@ struct GamePatchDescription {
const char *fileName;
uint16 fileType;
uint32 resourceId;
GameSoundInfo * soundInfo;
};
struct PanelButton {
@@ -467,7 +468,9 @@ struct GameDescription {
GameFileDescription *filesDescriptions;
int fontsCount;
GameFontDescription *fontDescriptions;
GameSoundInfo *soundInfo;
GameSoundInfo *voiceInfo;
GameSoundInfo *sfxInfo;
GameSoundInfo *musicInfo;
int patchsCount;
GamePatchDescription *patchDescriptions;
uint32 features;
@@ -643,7 +646,9 @@ public:
const bool isBigEndian() const { return (_gameDescription->features & GF_BIG_ENDIAN_DATA) != 0; }
const bool isMacResources() const { return (_gameDescription->features & GF_MAC_RESOURCES) != 0; }
const GameResourceDescription *getResourceDescription() { return _gameDescription->resourceDescription; }
const GameSoundInfo *getSoundInfo() { return _gameDescription->soundInfo; }
const GameSoundInfo *getVoiceInfo() const { return _gameDescription->voiceInfo; }
const GameSoundInfo *getSfxInfo() const { return _gameDescription->sfxInfo; }
const GameSoundInfo *getMusicInfo() const { return _gameDescription->musicInfo; }
const GameFontDescription *getFontDescription(int index) {
assert(index < _gameDescription->fontsCount);
+63 -47
View File
@@ -46,13 +46,23 @@ SndRes::SndRes(SagaEngine *vm) : _vm(vm) {
error("SndRes::SndRes resource context not found");
}
_voiceContext = _vm->_resource->getContext(GAME_VOICEFILE);
_voiceSerial = -1;
setVoiceBank(0);
}
void SndRes::setVoiceBank(int serial)
{
if (_voiceSerial == serial) return;
_voiceSerial = serial;
_voiceContext = _vm->_resource->getContext(GAME_VOICEFILE, _voiceSerial);
if (_voiceContext == NULL) {
error("SndRes::SndRes resource context not found");
}
// Grab sound resource information for the current game
_soundInfo = *_vm->getSoundInfo();
}
void SndRes::playSound(uint32 resourceId, int volume, bool loop) {
@@ -91,71 +101,77 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
int rate;
int size;
byte flags;
bool voxPcm;
size_t voxSize;
const GameSoundInfo *soundInfo;
if (resourceId == (int32)-1) {
return false;
}
_vm->_resource->loadResource(context, resourceId, soundResource, soundResourceLength);
if ((context->fileType & GAME_VOICEFILE) != 0) {
soundInfo = _vm->getVoiceInfo();
} else {
soundInfo = _vm->getSfxInfo();
}
if (context->table[resourceId].patchData != NULL) {
if (context->table[resourceId].patchData->_patchDescription->soundInfo != NULL) {
soundInfo = context->table[resourceId].patchData->_patchDescription->soundInfo;
}
}
MemoryReadStream readS(soundResource, soundResourceLength);
//TODO: check soundResource header - game may have GAME_SOUND_PCM, but patch file can be GAME_SOUND_VOC
resourceType = _soundInfo.resourceType;
resourceType = soundInfo->resourceType;
buffer.isBigEndian = soundInfo->isBigEndian;
if (soundResourceLength >= 8) {
if (!memcmp(&soundResource, "Creative", 8)) {
resourceType = GAME_SOUND_VOC;
resourceType = kSoundVOC;
} else if (!memcmp(soundResource, "RIFF", 4) != 0) {
resourceType = GAME_SOUND_WAV;
resourceType = kSoundWAV;
}
}
switch (resourceType) {
case GAME_SOUND_PCM:
buffer.frequency = _soundInfo.frequency;
buffer.isSigned = true;
voxPcm = (_vm->getFeatures() & GF_VOX_VOICES);
if (voxPcm) {
if (_vm->getGameType() == GType_ITE) {
//.iaf is not vox
if (_vm->_resource->getResourceData(context, resourceId)->patchFile != NULL) {
voxPcm = false;
}
}
}
if (voxPcm) {
buffer.sampleBits = 16;
buffer.stereo = false;
buffer.size = soundResourceLength * 4;
if (onlyHeader) {
buffer.buffer = NULL;
free(soundResource);
} else {
voxStream = makeADPCMStream(readS, soundResourceLength, kADPCMOki);
buffer.buffer = (byte *)malloc(buffer.size);
voxSize = voxStream->readBuffer((int16*)buffer.buffer, soundResourceLength * 2);
if (voxSize != soundResourceLength * 2) {
error("SndRes::load() wrong VOX output size");
}
delete voxStream;
}
case kSoundPCM:
buffer.frequency = soundInfo->frequency;
buffer.isSigned = soundInfo->isSigned;
buffer.sampleBits = soundInfo->sampleBits;
buffer.size = soundResourceLength;
buffer.stereo = soundInfo->stereo;
if (onlyHeader) {
buffer.buffer = NULL;
free(soundResource);
} else {
buffer.sampleBits = _soundInfo.sampleBits;
buffer.size = soundResourceLength;
buffer.stereo = _soundInfo.stereo;
if (onlyHeader) {
buffer.buffer = NULL;
free(soundResource);
} else {
buffer.buffer = soundResource;
}
buffer.buffer = soundResource;
}
result = true;
break;
case GAME_SOUND_VOC:
case kSoundVOX:
buffer.frequency = soundInfo->frequency;
buffer.isSigned = soundInfo->isSigned;
buffer.sampleBits = soundInfo->sampleBits;
buffer.stereo = soundInfo->stereo;
buffer.size = soundResourceLength * 4;
if (onlyHeader) {
buffer.buffer = NULL;
free(soundResource);
} else {
voxStream = makeADPCMStream(readS, soundResourceLength, kADPCMOki);
buffer.buffer = (byte *)malloc(buffer.size);
voxSize = voxStream->readBuffer((int16*)buffer.buffer, soundResourceLength * 2);
if (voxSize != soundResourceLength * 2) {
error("SndRes::load() wrong VOX output size");
}
delete voxStream;
}
result = true;
break;
case kSoundVOC:
data = loadVOCFromStream(readS, size, rate);
if (data) {
buffer.frequency = rate;
@@ -173,7 +189,7 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
}
free(soundResource);
break;
case GAME_SOUND_WAV:
case kSoundWAV:
if (loadWAVFromStream(readS, size, rate, flags)) {
buffer.frequency = rate;
buffer.sampleBits = 16;
+3 -3
View File
@@ -39,16 +39,16 @@ public:
void playSound(uint32 resourceId, int volume, bool loop);
void playVoice(uint32 resourceId);
int getVoiceLength(uint32 resourceId);
void setVoiceBank(int serial);
private:
bool load(ResourceContext *context, uint32 resourceId, SoundBuffer &buffer, bool onlyHeader);
bool loadVocSound(byte *soundResource, size_t soundResourceLength, SoundBuffer &buffer);
bool loadWavSound(byte *soundResource, size_t soundResourceLength, SoundBuffer &buffer);
ResourceContext *_sfxContext;
ResourceContext *_voiceContext;
GameSoundInfo _soundInfo;
int _voiceSerial; // voice bank number
SagaEngine *_vm;
};
+5 -5
View File
@@ -38,7 +38,7 @@ Sound::~Sound() {
delete _voxStream;
}
void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int volume, bool loop, bool forceBigEndian) {
void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int volume, bool loop) {
byte flags;
flags = Audio::Mixer::FLAG_AUTOFREE;
@@ -48,7 +48,8 @@ void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int
if (buffer.sampleBits == 16) {
flags |= Audio::Mixer::FLAG_16BITS;
if (!(_vm->isBigEndian()) && !forceBigEndian)
if (!buffer.isBigEndian)
flags |= Audio::Mixer::FLAG_LITTLE_ENDIAN;
}
if (buffer.stereo)
@@ -60,7 +61,7 @@ void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int
}
void Sound::playSound(SoundBuffer &buffer, int volume, bool loop) {
playSoundBuffer(&_effectHandle, buffer, 2 * volume, loop, false);
playSoundBuffer(&_effectHandle, buffer, 2 * volume, loop);
}
void Sound::pauseSound() {
@@ -76,10 +77,9 @@ void Sound::stopSound() {
}
void Sound::playVoice(SoundBuffer &buffer) {
playSoundBuffer(&_voiceHandle, buffer, 255, false, (_vm->getFeatures() & GF_BIG_ENDIAN_VOICES) != 0);
playSoundBuffer(&_voiceHandle, buffer, 255, false);
}
void Sound::pauseVoice() {
_mixer->pauseHandle(_voiceHandle, true);
}
+3 -3
View File
@@ -39,10 +39,10 @@ struct SoundBuffer {
int sampleBits;
bool stereo;
bool isSigned;
byte *buffer;
size_t size;
//big endianess flag!!!
bool isBigEndian;
};
class Sound {
@@ -63,7 +63,7 @@ public:
private:
void playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int volume, bool loop, bool forceBigEndian);
void playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int volume, bool loop);
int _enabled;
SagaEngine *_vm;