[Scummvm-cvs-logs] CVS: scummvm/bs2/driver d_sound.cpp,1.22,1.23
Pawel Kolodziejski
aquadran at users.sourceforge.net
Sun Aug 31 13:27:18 CEST 2003
Update of /cvsroot/scummvm/scummvm/bs2/driver
In directory sc8-pr-cvs1:/tmp/cvs-serv20285/bs2/driver
Modified Files:
d_sound.cpp
Log Message:
added mixer features: volume and pan control per channel
Index: d_sound.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/driver/d_sound.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- d_sound.cpp 31 Aug 2003 17:28:36 -0000 1.22
+++ d_sound.cpp 31 Aug 2003 20:26:20 -0000 1.23
@@ -179,6 +179,12 @@
#define GetdAPower(dA, power) for (power = 15; power > 0 && !((dA) & (1 << power)); power--)
int32 panTable[33] = {
+ -127, -119, -111, -103, -95, -87, -79, -71, -63, -55, -47, -39, -31, -23, -15, -7,
+ 0,
+ 7, 15, 23, 31, 39, 47, 55, 63, 71, 79, 87, 95, 103, 111, 119, 127
+};
+/*
+int32 panTable[33] = {
-10000,
-1500, -1400, -1300, -1200,
-1100, -1000, -900, -800,
@@ -196,7 +202,11 @@
-800, -791, -782, -773, -764, -755, -747, -738, -730, -721, -713, -705, -697, -689, -681, -673, -665, -658, -650, -643, -635, -628, -621, -613, -606, -599, -593, -586, -579, -572, -566, -559, -553, -546, -540, -534, -528, -522, -516, -510, -504, -498, -492, -487, -481, -476, -470, -465, -459, -454, -449, -444, -439, -434, -429, -424, -419, -414, -409, -404,
-400, -362, -328, -297, -269, -244, -221, -200, -181, -164, -148, -134, -122, -110, -100, -90, -82, -74, -67, -61, -55, -50, -45, -41, -37, -33, -30, -27, -25, -22, -20, -18, -16, -15, -13, -12, -11, -10, -9, -8, -7, -6, -6, -5, -5, -4, -4, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0
};
-
+*/
+int32 musicVolTable[17] = {
+ 0, 15, 31, 47, 63, 79, 95, 111, 127, 143, 159, 175, 191, 207, 223, 239, 255
+};
+/*
int32 musicVolTable[17] = {
-10000,
-5000, -3000, -2500, -2250,
@@ -204,7 +214,7 @@
-1000, -750, -500, -350,
-200, -100, -50, 0
};
-
+*/
void sword2_sound_handler (void *engine) {
g_sword2->_sound->FxServer();
}
@@ -460,7 +470,7 @@
if (GetCompressedSign(data8[i + 1]))
data16[i] = data16[i - 1] - (GetCompressedAmplitude(data8[i + 1]) << GetCompressedShift(data8[i + 1]));
else
- data16[i] = data16[i - 1] + (GetCompressedAmplitude(data8[i + 1])<<GetCompressedShift(data8[i + 1]));
+ data16[i] = data16[i - 1] + (GetCompressedAmplitude(data8[i + 1]) << GetCompressedShift(data8[i + 1]));
i++;
}
@@ -534,11 +544,16 @@
free(data8);
// Modify the volume according to the master volume
+ byte volume;
+ int8 p;
if (speechMuted) {
+ volume = 0;
// IDirectSoundBuffer_SetVolume(dsbSpeech, volTable[0]);
} else {
+ volume = vol * speechVol;
// IDirectSoundBuffer_SetVolume(dsbSpeech, volTable[vol*speechVol]);
}
+ p = panTable[pan + 16];
// IDirectSoundBuffer_SetPan(dsbSpeech, panTable[pan+16]);
// Start the speech playing
@@ -552,8 +567,8 @@
data16[j] = TO_BE_16(data16[j]);
soundHandleSpeech = 0;
- _mixer->playRaw(&soundHandleSpeech, data16, bufferSize, 22050, flags);
-
+ _mixer->playRaw(&soundHandleSpeech, data16, bufferSize, 22050, flags, volume, pan);
+
speechStatus = 1;
}
@@ -561,7 +576,6 @@
return (RD_OK);
}
-
int32 Sword2Sound::StopSpeechSword2(void) {
if (!soundOn)
return(RD_OK);
@@ -593,6 +607,7 @@
void Sword2Sound::SetSpeechVolume(uint8 volume) {
speechVol = volume;
if ((soundHandleSpeech != 0) && !speechMuted && GetSpeechStatus() == RDSE_SAMPLEPLAYING) {
+ g_engine->_mixer->setChannelVolume(soundHandleSpeech, 16 * speechVol);
// IDirectSoundBuffer_SetVolume(dsbSpeech, volTable[16*speechVol]);
}
}
@@ -606,8 +621,10 @@
if (GetSpeechStatus() == RDSE_SAMPLEPLAYING) {
if (mute) {
+ g_engine->_mixer->setChannelVolume(soundHandleSpeech, 0);
// IDirectSoundBuffer_SetVolume(dsbSpeech, volTable[0]);
} else {
+ g_engine->_mixer->setChannelVolume(soundHandleSpeech, 16 * speechVol);
// IDirectSoundBuffer_SetVolume(dsbSpeech, volTable[16*speechVol]);
}
}
@@ -827,14 +844,17 @@
fxLooped[i] = 0;
flagsFx[i] &= ~SoundMixer::FLAG_LOOP;
+ byte volume;
// Start the sound effect playing
if (musicMuted) {
+ volume = 0;
// IDirectSoundBuffer_SetVolume(dsbFx[i], volTable[0]);
} else {
+ volume = musicVolTable[volMusic[0]];
// IDirectSoundBuffer_SetVolume(dsbFx[i], musicVolTable[volMusic[0]]);
}
// IDirectSoundBuffer_SetPan(dsbFx[i], 0);
- g_engine->_mixer->playRaw(&soundHandleFx[i], bufferFx[i], bufferSizeFx[i], fxRate[i], flagsFx[i]);
+ g_engine->_mixer->playRaw(&soundHandleFx[i], bufferFx[i], bufferSizeFx[i], fxRate[i], flagsFx[i], volume, 0);
fxCached[i] = RDSE_FXTOCLEAR;
} else {
@@ -850,15 +870,20 @@
fxVolume[i] = vol;
+ byte volume;
+ int8 p;
// Start the sound effect playing
if (fxMuted) {
+ volume = 0;
// IDirectSoundBuffer_SetVolume(dsbFx[i], volTable[0]);
} else {
+ volume = vol * fxVol;
// IDirectSoundBuffer_SetVolume(dsbFx[i], volTable[vol*fxVol]);
}
+ p = panTable[pan + 16];
// IDirectSoundBuffer_SetPan(dsbFx[i], panTable[pan+16]);
- g_engine->_mixer->playRaw(&soundHandleFx[i], bufferFx[i], bufferSizeFx[i], fxRate[i], flagsFx[i]);
+ g_engine->_mixer->playRaw(&soundHandleFx[i], bufferFx[i], bufferSizeFx[i], fxRate[i], flagsFx[i], volume, p);
if (id == (int32) 0xffffffff) {
fxCached[i] = RDSE_FXTOCLEAR;
}
@@ -875,13 +900,17 @@
return RDERR_FXFUCKED;
}
fxCached[i] = RDSE_FXTOCLEAR;
+
+ byte volume;
if (musicMuted) {
+ volume = 0;
// IDirectSoundBuffer_SetVolume(dsbFx[i], volTable[0]);
} else {
+ volume = musicVolTable[volMusic[0]];
// IDirectSoundBuffer_SetVolume(dsbFx[i], musicVolTable[volMusic[0]]);
}
// IDirectSoundBuffer_SetPan(dsbFx[i], 0);
- g_engine->_mixer->playRaw(&soundHandleFx[i], bufferFx[i], bufferSizeFx[i], fxRate[i], flagsFx[i]);
+ g_engine->_mixer->playRaw(&soundHandleFx[i], bufferFx[i], bufferSizeFx[i], fxRate[i], flagsFx[i], volume, 0);
} else {
hr = OpenFx(id, data);
if (hr != RD_OK) {
@@ -900,14 +929,19 @@
flagsFx[i] &= ~SoundMixer::FLAG_LOOP;
fxVolume[i] = vol;
+ byte volume;
+ int8 p;
// Start the sound effect playing
if (fxMuted) {
+ volume = 0;
// IDirectSoundBuffer_SetVolume(dsbFx[i], volTable[0]);
} else {
+ volume = vol * fxVol;
// IDirectSoundBuffer_SetVolume(dsbFx[i], volTable[vol*fxVol]);
}
+ p = panTable[pan + 16];
// IDirectSoundBuffer_SetPan(dsbFx[i], panTable[pan+16]);
- g_engine->_mixer->playRaw(&soundHandleFx[i], bufferFx[i], bufferSizeFx[i], fxRate[i], flagsFx[i]);
+ g_engine->_mixer->playRaw(&soundHandleFx[i], bufferFx[i], bufferSizeFx[i], fxRate[i], flagsFx[i], volume, p);
}
}
}
@@ -1020,6 +1054,8 @@
fxVolume[i] = vol;
if (!fxMuted) {
+ g_engine->_mixer->setChannelVolume(soundHandleFx[i], vol * fxVol);
+ g_engine->_mixer->setChannelPan(soundHandleFx[i], panTable[pan + 16]);
// IDirectSoundBuffer_SetVolume(dsbFx[i], volTable[vol*fxVol]);
// IDirectSoundBuffer_SetPan(dsbFx[i], panTable[pan+16]);
}
@@ -1033,6 +1069,7 @@
fxVolume[i] = vol;
if (!fxMuted) {
+ g_engine->_mixer->setChannelVolume(soundHandleFx[i], vol * fxVol);
// IDirectSoundBuffer_SetVolume(dsbFx[i], volTable[vol*fxVol]);
}
return RD_OK;
@@ -1142,6 +1179,7 @@
// Now update the volume of any fxs playing
for (fxi = 0; fxi < MAXFX; fxi++) {
if (fxId[fxi] && !fxMuted) {
+ g_engine->_mixer->setChannelVolume(soundHandleFx[fxi], fxVolume[fxi] * fxVol);
// IDirectSoundBuffer_SetVolume(dsbFx[fxi], volTable[fxVolume[fxi]*fxVol]);
}
}
@@ -1156,8 +1194,10 @@
for (fxi = 0; fxi < MAXFX; fxi++) {
if (fxId[fxi]) {
if (mute) {
+ g_engine->_mixer->setChannelVolume(soundHandleFx[fxi], 0);
// IDirectSoundBuffer_SetVolume(dsbFx[fxi], volTable[0]);
} else {
+ g_engine->_mixer->setChannelVolume(soundHandleFx[fxi], fxVolume[fxi] * fxVol);
// IDirectSoundBuffer_SetVolume(dsbFx[fxi], volTable[fxVolume[fxi]*fxVol]);
}
}
@@ -1304,13 +1344,22 @@
v1 = volMusic[1];
}
+ byte volume;
+ int8 pan;
+
if (v0 > v1) {
+ volume = musicVolTable[v0];
+ pan = (musicVolTable[v1 * 16 / v0] / 2) - 127;
// IDirectSoundBuffer_SetVolume(lpDsbMus[primaryStream], musicVolTable[v0]);
// IDirectSoundBuffer_SetPan(lpDsbMus[primaryStream], musicVolTable[v1*16/v0]);
} else if (v1 > v0) {
+ volume = musicVolTable[v1];
+ pan = (musicVolTable[v0 * 16 / v1] / 2) + 127;
// IDirectSoundBuffer_SetVolume(lpDsbMus[primaryStream], musicVolTable[v1]);
// IDirectSoundBuffer_SetPan(lpDsbMus[primaryStream], -musicVolTable[v0*16/v1]);
} else {
+ volume = musicVolTable[v1];
+ pan = 0;
// IDirectSoundBuffer_SetVolume(lpDsbMus[primaryStream], musicVolTable[v1]);
// IDirectSoundBuffer_SetPan(lpDsbMus[primaryStream], 0);
}
@@ -1321,13 +1370,8 @@
data16[i] = TO_BE_16(data16[i]);
}
- if (soundHandleMusic[primaryStream] == 0) {
- soundHandleMusic[primaryStream] = g_engine->_mixer->newStream(data16, bufferSizeMusic, 22050, SoundMixer::FLAG_16BITS, 100000);
- } else {
- g_engine->_mixer->appendStream(soundHandleMusic[primaryStream], data16, bufferSizeMusic);
- }
-
- free(data16);
+ soundHandleMusic[primaryStream] = g_engine->_mixer->newStream(data16, bufferSizeMusic, 22050,
+ SoundMixer::FLAG_16BITS | SoundMixer::FLAG_AUTOFREE, 100000, volume, 0);
// Recorder some last variables
musStreaming[primaryStream] = 1;
@@ -1767,17 +1811,28 @@
v1 = (volMusic[1] * (0 - musFading[i]) / 16);
}
+ byte volume;
+ int8 pan;
+
if (v0 > v1) {
+ volume = musicVolTable[v0];
+ pan = (musicVolTable[v1 * 16 / v0] / 2) - 127;
// IDirectSoundBuffer_SetVolume(lpDsbMus[i], musicVolTable[v0]);
// IDirectSoundBuffer_SetPan(lpDsbMus[i], musicVolTable[v1*16/v0]);
} else {
if (v1 > v0) {
+ volume = musicVolTable[v1];
+ pan = (musicVolTable[v0 * 16 / v1] / 2) + 127;
// IDirectSoundBuffer_SetVolume(lpDsbMus[i], musicVolTable[v1]);
// IDirectSoundBuffer_SetPan(lpDsbMus[i], -musicVolTable[v0*16/v1]);
} else {
+ volume = musicVolTable[v1];
+ pan = 0;
// IDirectSoundBuffer_SetVolume(lpDsbMus[i], musicVolTable[v1]);
// IDirectSoundBuffer_SetPan(lpDsbMus[i], 0);
}
+ g_engine->_mixer->setChannelVolume(soundHandleMusic[i], volume);
+ g_engine->_mixer->setChannelPan(soundHandleMusic[i], pan);
}
}
}
@@ -1840,15 +1895,12 @@
data16[y] = TO_BE_16(data16[y]);
}
- if (soundHandleMusic[i] == 0) {
- soundHandleMusic[i] = g_engine->_mixer->newStream(data16, bufferSizeMusic, 22050, SoundMixer::FLAG_16BITS, 100000);
- } else {
- // Paranoid check that seems to
- // be necessary.
- if (len & 1)
- len--;
- g_engine->_mixer->appendStream(soundHandleMusic[i], data16, len);
- }
+ // Paranoid check that seems to
+ // be necessary.
+ if (len & 1)
+ len--;
+ assert(soundHandleMusic[i]);
+ g_engine->_mixer->appendStream(soundHandleMusic[i], data16, len);
free(data16);
@@ -2227,6 +2279,7 @@
for (i = 0; i < MAXMUS; i++) {
volMusic[i] = volume;
if (musStreaming[i] && !musFading[i] && !musicMuted) {
+ g_engine->_mixer->setChannelVolume(soundHandleMusic[i], musicVolTable[volume]);
// IDirectSoundBuffer_SetVolume(lpDsbMus[i], musicVolTable[volume]);
}
}
@@ -2249,8 +2302,10 @@
if (musStreaming[i] && !musFading[i]) {
if (mute) {
+ g_engine->_mixer->setChannelVolume(soundHandleMusic[i], musicVolTable[0]);
// IDirectSoundBuffer_SetVolume(lpDsbMus[i], musicVolTable[0]);
} else {
+ g_engine->_mixer->setChannelVolume(soundHandleMusic[i], musicVolTable[volMusic[i]]);
// IDirectSoundBuffer_SetVolume(lpDsbMus[i], musicVolTable[volMusic[i]]);
}
}
More information about the Scummvm-git-logs
mailing list