diff --git a/source/audiolib/include/fx_man.h b/source/audiolib/include/fx_man.h index 0f81df5c7..3febd12bb 100644 --- a/source/audiolib/include/fx_man.h +++ b/source/audiolib/include/fx_man.h @@ -64,9 +64,9 @@ int32_t FX_Shutdown(void); int32_t FX_Play(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, - int32_t vol, int32_t left, int32_t right, int32_t priority, uint32_t callbackval); + int32_t vol, int32_t left, int32_t right, int32_t priority, float volume, uint32_t callbackval); int32_t FX_Play3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, - int32_t distance, int32_t priority, uint32_t callbackval); + int32_t distance, int32_t priority, float volume, uint32_t callbackval); int32_t FX_SetPrintf(void(*function)(const char *, ...)); diff --git a/source/audiolib/include/multivoc.h b/source/audiolib/include/multivoc.h index 8a5bd82ed..aaec04452 100644 --- a/source/audiolib/include/multivoc.h +++ b/source/audiolib/include/multivoc.h @@ -86,30 +86,30 @@ void MV_SetReverbDelay(int32_t delay); // int32_t MV_SetMixMode( int32_t numchannels, int32_t samplebits ); // int32_t MV_StartPlayback( void ); // void MV_StopPlayback( void ); -int32_t MV_PlayWAV3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, - int32_t priority, uint32_t callbackval); -int32_t MV_PlayWAV(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval); -int32_t MV_PlayVOC3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, - int32_t priority, uint32_t callbackval); -int32_t MV_PlayVOC(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval); -int32_t MV_PlayVorbis3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, - int32_t distance, int32_t priority, uint32_t callbackval); -int32_t MV_PlayVorbis(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval); -int32_t MV_PlayFLAC3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, - int32_t priority, uint32_t callbackval); -int32_t MV_PlayFLAC(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval); -int32_t MV_PlayXA3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, - int32_t priority, uint32_t callbackval); -int32_t MV_PlayXA(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval); -int32_t MV_PlayXMP3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, - int32_t priority, uint32_t callbackval); -int32_t MV_PlayXMP(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval); +int32_t MV_PlayWAV3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, + float volume, uint32_t callbackval); +int32_t MV_PlayWAV(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, + int32_t priority, float volume, uint32_t callbackval); +int32_t MV_PlayVOC3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, + float volume, uint32_t callbackval); +int32_t MV_PlayVOC(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, + int32_t priority, float volume, uint32_t callbackval); +int32_t MV_PlayVorbis3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, + float volume, uint32_t callbackval); +int32_t MV_PlayVorbis(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, + int32_t priority, float volume, uint32_t callbackval); +int32_t MV_PlayFLAC3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, + float volume, uint32_t callbackval); +int32_t MV_PlayFLAC(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, + int32_t priority, float volume, uint32_t callbackval); +int32_t MV_PlayXA3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, float volume, + uint32_t callbackval); +int32_t MV_PlayXA(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, + int32_t priority, float volume, uint32_t callbackval); +int32_t MV_PlayXMP3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, + float volume, uint32_t callbackval); +int32_t MV_PlayXMP(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, + int32_t priority, float volume, uint32_t callbackval); int MV_IdentifyXMP(char const *ptr, uint32_t length); diff --git a/source/audiolib/src/_multivc.h b/source/audiolib/src/_multivc.h index 212622ec8..f6123c183 100644 --- a/source/audiolib/src/_multivc.h +++ b/source/audiolib/src/_multivc.h @@ -49,13 +49,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define MV_MAXPANPOSITION 127 /* formerly 31 */ #define MV_NUMPANPOSITIONS ( MV_MAXPANPOSITION + 1 ) #define MV_MAXTOTALVOLUME 255 -#define MV_MAXVOLUME 255 /* formerly 63 */ +#define MV_MAXVOLUME 127 /* formerly 63 */ #define MV_NUMVOICES 8 // mirrors FX_MUSIC_PRIORITY from fx_man.h #define MV_MUSIC_PRIORITY INT_MAX #define MIX_VOLUME(volume) ((max(0, min((volume), 255)) * (MV_MAXVOLUME + 1)) >> 8) +#define MV_VOLUME(src) (Blrintf((float)(src) * volume)) #define MV_MIXBUFFERSIZE 256 #define MV_NUMBEROFBUFFERS 16 @@ -77,7 +78,7 @@ typedef struct VoiceNode playbackstatus (*GetSound)(struct VoiceNode *voice); - void (*mix)(uint32_t position, uint32_t rate, const char *start, uint32_t length); + void (*mix)(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume); const char *sound; @@ -94,6 +95,8 @@ typedef struct VoiceNode char bits; char channels; + float volume; + unsigned LoopCount; uint32_t LoopSize; uint32_t BlockLength; @@ -178,17 +181,17 @@ void MV_ReleaseXAVoice(VoiceNode *voice); void MV_ReleaseXMPVoice(VoiceNode *voice); // implemented in mix.c -void MV_Mix16BitMono(uint32_t position, uint32_t rate, const char *start, uint32_t length); -void MV_Mix16BitStereo(uint32_t position, uint32_t rate, const char *start, uint32_t length); -void MV_Mix16BitMono16(uint32_t position, uint32_t rate, const char *start, uint32_t length); -void MV_Mix16BitStereo16(uint32_t position, uint32_t rate, const char *start, uint32_t length); +void MV_Mix16BitMono(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume); +void MV_Mix16BitStereo(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume); +void MV_Mix16BitMono16(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume); +void MV_Mix16BitStereo16(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume); void MV_16BitReverb( char const *src, char *dest, int16_t *volume, int32_t count ); // implemented in mixst.c -void MV_Mix16BitMono8Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length); -void MV_Mix16BitStereo8Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length); -void MV_Mix16BitMono16Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length); -void MV_Mix16BitStereo16Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length); +void MV_Mix16BitMono8Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume); +void MV_Mix16BitStereo8Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume); +void MV_Mix16BitMono16Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume); +void MV_Mix16BitStereo16Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume); extern char *MV_MixDestination; // pointer to the next output sample extern uint32_t MV_MixPosition; // return value of where the source pointer got to diff --git a/source/audiolib/src/flac.cpp b/source/audiolib/src/flac.cpp index 0cbaece67..d34c77b6a 100644 --- a/source/audiolib/src/flac.cpp +++ b/source/audiolib/src/flac.cpp @@ -378,14 +378,12 @@ Begin playback of sound data at specified angle and distance from listener. ---------------------------------------------------------------------*/ -int32_t MV_PlayFLAC3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, - int32_t distance, int32_t priority, uint32_t callbackval) - +int32_t MV_PlayFLAC3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, float volume, uint32_t callbackval) { int32_t left; int32_t right; int32_t mid; - int32_t volume; + int32_t vol; int32_t status; if (!MV_Installed) @@ -400,16 +398,16 @@ int32_t MV_PlayFLAC3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pi angle += MV_NUMPANPOSITIONS / 2; } - volume = MIX_VOLUME(distance); + vol = MIX_VOLUME(distance); // Ensure angle is within 0 - 127 angle &= MV_MAXPANPOSITION; - left = MV_PanTable[angle][volume].left; - right = MV_PanTable[angle][volume].right; + left = MV_PanTable[angle][vol].left; + right = MV_PanTable[angle][vol].right; mid = max(0, 255 - distance); - status = MV_PlayFLAC(ptr, ptrlength, loophow, -1, pitchoffset, mid, left, right, priority, callbackval); + status = MV_PlayFLAC(ptr, length, loophow, -1, pitchoffset, mid, left, right, priority, volume, callbackval); return status; } @@ -422,9 +420,7 @@ Begin playback of sound data with the given sound levels and priority. ---------------------------------------------------------------------*/ -int32_t MV_PlayFLAC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval) - +int32_t MV_PlayFLAC(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority, float volume, uint32_t callbackval) { VoiceNode *voice; flac_data *fd = 0; @@ -448,7 +444,7 @@ int32_t MV_PlayFLAC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t lo fd->ptr = ptr; fd->pos = 0; fd->blocksize = 0; - fd->length = ptrlength; + fd->length = length; fd->block = NULL; @@ -638,6 +634,8 @@ int32_t MV_PlayFLAC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t lo voice->FixedPointBufferSize = (voice->RateScale * MV_MIXBUFFERSIZE) - voice->RateScale; MV_SetVoiceMixMode(voice); + voice->volume = volume; + MV_SetVoiceVolume(voice, vol, left, right); MV_PlayVoice(voice); @@ -668,7 +666,7 @@ void MV_ReleaseFLACVoice(VoiceNode *voice) #include "_multivc.h" int32_t MV_PlayFLAC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, - int32_t vol, int32_t left, int32_t right, int32_t priority, uint32_t callbackval) + int32_t vol, int32_t left, int32_t right, int32_t priority, float volume, uint32_t callbackval) { UNREFERENCED_PARAMETER(ptr); UNREFERENCED_PARAMETER(ptrlength); @@ -679,6 +677,7 @@ int32_t MV_PlayFLAC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t lo UNREFERENCED_PARAMETER(left); UNREFERENCED_PARAMETER(right); UNREFERENCED_PARAMETER(priority); + UNREFERENCED_PARAMETER(volume); UNREFERENCED_PARAMETER(callbackval); MV_Printf("MV_PlayFLAC: FLAC support not included in this binary.\n"); @@ -686,7 +685,7 @@ int32_t MV_PlayFLAC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t lo } int32_t MV_PlayFLAC3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, - int32_t distance, int32_t priority, uint32_t callbackval) + int32_t distance, int32_t priority, float volume, uint32_t callbackval) { UNREFERENCED_PARAMETER(ptr); UNREFERENCED_PARAMETER(ptrlength); @@ -695,6 +694,7 @@ int32_t MV_PlayFLAC3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pi UNREFERENCED_PARAMETER(angle); UNREFERENCED_PARAMETER(distance); UNREFERENCED_PARAMETER(priority); + UNREFERENCED_PARAMETER(volume); UNREFERENCED_PARAMETER(callbackval); MV_Printf("MV_PlayFLAC: FLAC support not included in this binary.\n"); diff --git a/source/audiolib/src/formats.cpp b/source/audiolib/src/formats.cpp index 7377e61ff..f4932bccb 100644 --- a/source/audiolib/src/formats.cpp +++ b/source/audiolib/src/formats.cpp @@ -308,7 +308,7 @@ end_of_data: } int32_t MV_PlayWAV3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, - int32_t priority, uint32_t callbackval) + int32_t priority, float volume, uint32_t callbackval) { if (!MV_Installed) return MV_Error; @@ -319,17 +319,17 @@ int32_t MV_PlayWAV3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitcho angle += MV_NUMPANPOSITIONS / 2; } - int const volume = MIX_VOLUME(distance); + int const vol = MIX_VOLUME(distance); // Ensure angle is within 0 - 127 angle &= MV_MAXPANPOSITION; return MV_PlayWAV(ptr, length, loophow, -1, pitchoffset, max(0, 255 - distance), - MV_PanTable[ angle ][ volume ].left, MV_PanTable[ angle ][ volume ].right, priority, callbackval); + MV_PanTable[ angle ][ vol ].left, MV_PanTable[ angle ][ vol ].right, priority, volume, callbackval); } -int32_t MV_PlayWAV(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval) +int32_t MV_PlayWAV(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, + int32_t left, int32_t right, int32_t priority, float volume, uint32_t callbackval) { if (!MV_Installed) return MV_Error; @@ -381,28 +381,28 @@ int32_t MV_PlayWAV(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loo voice->channels = format.nChannels; voice->GetSound = MV_GetNextWAVBlock; - int32_t length = data.size; + int32_t blocklen = data.size; if (voice->bits == 16) { data.size &= ~1; - length /= 2; + blocklen /= 2; } if (voice->channels == 2) { data.size &= ~1; - length /= 2; + blocklen /= 2; } voice->rawdataptr = (uint8_t *)ptr; - voice->ptrlength = ptrlength; + voice->ptrlength = length; voice->Playing = TRUE; voice->Paused = FALSE; voice->LoopCount = 0; voice->position = 0; voice->length = 0; - voice->BlockLength = length; + voice->BlockLength = blocklen; voice->NextBlock = (char *)((intptr_t) ptr + sizeof(riff_header) + riff.format_size + sizeof(data_header)); voice->next = NULL; voice->prev = NULL; @@ -410,7 +410,8 @@ int32_t MV_PlayWAV(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loo voice->callbackval = callbackval; voice->LoopStart = loopstart >= 0 ? voice->NextBlock : NULL; voice->LoopEnd = NULL; - voice->LoopSize = loopend > 0 ? loopend - loopstart + 1 : length; + voice->LoopSize = loopend > 0 ? loopend - loopstart + 1 : blocklen; + voice->volume = volume; MV_SetVoicePitch(voice, format.nSamplesPerSec, pitchoffset); MV_SetVoiceVolume(voice, vol, left, right); @@ -419,8 +420,8 @@ int32_t MV_PlayWAV(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loo return voice->handle; } -int32_t MV_PlayVOC3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, - int32_t distance, int32_t priority, uint32_t callbackval) +int32_t MV_PlayVOC3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, + int32_t distance, int32_t priority, float volume, uint32_t callbackval) { if (!MV_Installed) return MV_Error; @@ -431,17 +432,17 @@ int32_t MV_PlayVOC3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pit angle += MV_NUMPANPOSITIONS / 2; } - int const volume = MIX_VOLUME(distance); + int const vol = MIX_VOLUME(distance); // Ensure angle is within 0 - 127 angle &= MV_MAXPANPOSITION; - return MV_PlayVOC(ptr, ptrlength, loophow, -1, pitchoffset, max(0, 255 - distance), - MV_PanTable[ angle ][ volume ].left, MV_PanTable[ angle ][ volume ].right, priority, callbackval); + return MV_PlayVOC(ptr, length, loophow, -1, pitchoffset, max(0, 255 - distance), + MV_PanTable[ angle ][ vol ].left, MV_PanTable[ angle ][ vol ].right, priority, volume, callbackval); } -int32_t MV_PlayVOC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval) +int32_t MV_PlayVOC(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, + int32_t left, int32_t right, int32_t priority, float volume, uint32_t callbackval) { if (!MV_Installed) return MV_Error; @@ -463,7 +464,7 @@ int32_t MV_PlayVOC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loo } voice->rawdataptr = (uint8_t *)ptr; - voice->ptrlength = ptrlength; + voice->ptrlength = length; voice->Playing = TRUE; voice->Paused = FALSE; voice->wavetype = FMT_VOC; @@ -483,6 +484,8 @@ int32_t MV_PlayVOC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loo voice->LoopEnd = NULL; voice->LoopSize = loopend - loopstart + 1; + voice->volume = volume; + MV_SetVoiceVolume(voice, vol, left, right); MV_PlayVoice(voice); diff --git a/source/audiolib/src/fx_man.cpp b/source/audiolib/src/fx_man.cpp index f8055a29c..666fb8606 100644 --- a/source/audiolib/src/fx_man.cpp +++ b/source/audiolib/src/fx_man.cpp @@ -134,18 +134,18 @@ static wavefmt_t FX_DetectFormat(char const * const ptr, uint32_t length) return fmt; } -int32_t FX_Play(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, - int32_t vol, int32_t left, int32_t right, int32_t priority, uint32_t callbackval) +int32_t FX_Play(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, + int32_t vol, int32_t left, int32_t right, int32_t priority, float volume, uint32_t callbackval) { - static int32_t(*const func[])(char *, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, uint32_t) = + static int32_t(*const func[])(char *, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, float, uint32_t) = { NULL, NULL, MV_PlayVOC, MV_PlayWAV, MV_PlayVorbis, MV_PlayFLAC, MV_PlayXA, MV_PlayXMP }; EDUKE32_STATIC_ASSERT(FMT_MAX == ARRAY_SIZE(func)); - wavefmt_t const fmt = FX_DetectFormat(ptr, length); + wavefmt_t const fmt = FX_DetectFormat(ptr, ptrlength); int handle = - (func[fmt]) ? func[fmt](ptr, length, loopstart, loopend, pitchoffset, vol, left, right, priority, callbackval) : -1; + (func[fmt]) ? func[fmt](ptr, ptrlength, loopstart, loopend, pitchoffset, vol, left, right, priority, volume, callbackval) : -1; if (handle <= MV_Ok) { @@ -156,18 +156,18 @@ int32_t FX_Play(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, return handle; } -int32_t FX_Play3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, - int32_t priority, uint32_t callbackval) +int32_t FX_Play3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, + int32_t priority, float volume, uint32_t callbackval) { - static int32_t (*const func[])(char *, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, uint32_t) = + static int32_t (*const func[])(char *, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, float, uint32_t) = { NULL, NULL, MV_PlayVOC3D, MV_PlayWAV3D, MV_PlayVorbis3D, MV_PlayFLAC3D, MV_PlayXA3D, MV_PlayXMP3D }; EDUKE32_STATIC_ASSERT(FMT_MAX == ARRAY_SIZE(func)); - wavefmt_t const fmt = FX_DetectFormat(ptr, length); + wavefmt_t const fmt = FX_DetectFormat(ptr, ptrlength); int handle = - (func[fmt]) ? func[fmt](ptr, length, loophow, pitchoffset, angle, distance, priority, callbackval) : -1; + (func[fmt]) ? func[fmt](ptr, ptrlength, loophow, pitchoffset, angle, distance, priority, volume, callbackval) : -1; if (handle <= MV_Ok) { diff --git a/source/audiolib/src/mix.cpp b/source/audiolib/src/mix.cpp index 9d26fc78a..4bc29abda 100644 --- a/source/audiolib/src/mix.cpp +++ b/source/audiolib/src/mix.cpp @@ -21,160 +21,137 @@ #include "_multivc.h" /* - JBF: - position = offset of starting sample in start rate = resampling increment start = sound data length = count of samples to mix + volume = direct volume adjustment, 1.0 = no change */ // 8-bit mono source, 16-bit mono output -void MV_Mix16BitMono(uint32_t position, uint32_t rate, const char *start, uint32_t length) +void MV_Mix16BitMono(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume) { - uint8_t const * const source = (uint8_t const *) start; - int16_t *dest = (int16_t *) MV_MixDestination; - int32_t sample0; + auto const source = (uint8_t const *)start; + int16_t * dest = (int16_t *)MV_MixDestination; - while (length--) { - sample0 = source[position >> 16]; + while (length--) + { + int const sample0 = MV_VOLUME(source[position >> 16]); position += rate; - sample0 = MV_LeftVolume[sample0] + *dest; - if (sample0 < -32768) sample0 = -32768; - else if (sample0 > 32767) sample0 = 32767; - - *dest = (int16_t) sample0; - - dest += MV_SampleSize / 2; + *dest = (int16_t)clamp(MV_LeftVolume[sample0] + *dest, INT16_MIN, INT16_MAX); + dest += MV_SampleSize >> 1; } - MV_MixPosition = position; - MV_MixDestination = (char *) dest; + MV_MixPosition = position; + MV_MixDestination = (char *)dest; } // 8-bit mono source, 16-bit stereo output -void MV_Mix16BitStereo(uint32_t position, uint32_t rate, const char *start, uint32_t length) +void MV_Mix16BitStereo(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume) { - uint8_t const * const source = (uint8_t const *) start; - int16_t *dest = (int16_t *) MV_MixDestination; - int32_t sample0, sample1; + auto const source = (uint8_t const *)start; + int16_t * dest = (int16_t *)MV_MixDestination; - while (length--) { - sample0 = source[position >> 16]; - sample1 = sample0; + while (length--) + { + int const sample0 = MV_VOLUME(source[position >> 16]); position += rate; - sample0 = MV_LeftVolume[sample0] + *dest; - sample1 = MV_RightVolume[sample1] + *(dest + MV_RightChannelOffset / 2); - if (sample0 < -32768) sample0 = -32768; - else if (sample0 > 32767) sample0 = 32767; - if (sample1 < -32768) sample1 = -32768; - else if (sample1 > 32767) sample1 = 32767; - - *dest = (int16_t) sample0; - *(dest + MV_RightChannelOffset/2) = (int16_t) sample1; - - dest += MV_SampleSize / 2; + *dest = (int16_t)clamp(MV_LeftVolume[sample0] + *dest, INT16_MIN, INT16_MAX); + *(dest + (MV_RightChannelOffset >> 1)) + = (int16_t)clamp(MV_RightVolume[sample0] + *(dest + (MV_RightChannelOffset >> 1)), INT16_MIN, INT16_MAX); + dest += MV_SampleSize >> 1; } - MV_MixPosition = position; - MV_MixDestination = (char *) dest; + MV_MixPosition = position; + MV_MixDestination = (char *)dest; } // 16-bit mono source, 16-bit mono output -void MV_Mix16BitMono16(uint32_t position, uint32_t rate, const char *start, uint32_t length) +void MV_Mix16BitMono16(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume) { - uint16_t const * const source = (uint16_t const *) start; - int16_t *dest = (int16_t *) MV_MixDestination; - int32_t sample0l, sample0h, sample0; + auto const source = (uint16_t const *)start; + int16_t * dest = (int16_t *)MV_MixDestination; - while (length--) { - sample0 = source[position >> 16]; + while (length--) + { + int const sample0 = MV_VOLUME(source[position >> 16]); #ifdef BIGENDIAN - sample0l = sample0 >> 8; - sample0h = (sample0 & 255) ^ 128; + int sample0l = sample0 >> 8; + int sample0h = (sample0 & 255) ^ 128; #else - sample0l = sample0 & 255; - sample0h = (sample0 >> 8) ^ 128; + int sample0l = sample0 & 255; + int sample0h = (sample0 >> 8) ^ 128; #endif position += rate; sample0l = MV_LeftVolume[sample0l] >> 8; sample0h = MV_LeftVolume[sample0h]; - sample0 = sample0l + sample0h + 128 + *dest; - if (sample0 < -32768) sample0 = -32768; - else if (sample0 > 32767) sample0 = 32767; - *dest = (int16_t) sample0; + *dest = (int16_t)clamp(sample0l + sample0h + 128 + *dest, INT16_MIN, INT16_MAX); - dest += MV_SampleSize / 2; + dest += MV_SampleSize >> 1; } - MV_MixPosition = position; - MV_MixDestination = (char *) dest; + MV_MixPosition = position; + MV_MixDestination = (char *)dest; } // 16-bit mono source, 16-bit stereo output -void MV_Mix16BitStereo16(uint32_t position, uint32_t rate, const char *start, uint32_t length) +void MV_Mix16BitStereo16(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume) { - uint16_t const * const source = (uint16_t const *) start; - int16_t *dest = (int16_t *) MV_MixDestination; - int32_t sample0l, sample0h, sample0; - int32_t sample1l, sample1h, sample1; + auto const source = (uint16_t const *)start; + int16_t * dest = (int16_t *)MV_MixDestination; - while (length--) { - sample0 = source[position >> 16]; -#ifdef BIGENDIAN - sample0l = sample0 >> 8; - sample0h = (sample0 & 255) ^ 128; -#else - sample0l = sample0 & 255; - sample0h = (sample0 >> 8) ^ 128; -#endif - sample1l = sample0l; - sample1h = sample0h; + while (length--) + { + int const sample0 = MV_VOLUME(source[position >> 16]); position += rate; +#ifdef BIGENDIAN + int sample0l = sample0 >> 8; + int sample0h = (sample0 & 255) ^ 128; +#else + int sample0l = sample0 & 255; + int sample0h = (sample0 >> 8) ^ 128; +#endif + + int const sample1l = MV_RightVolume[sample0l] >> 8; + int const sample1h = MV_RightVolume[sample0h]; + sample0l = MV_LeftVolume[sample0l] >> 8; sample0h = MV_LeftVolume[sample0h]; - sample1l = MV_RightVolume[sample1l] >> 8; - sample1h = MV_RightVolume[sample1h]; - sample0 = sample0l + sample0h + 128 + *dest; - sample1 = sample1l + sample1h + 128 + *(dest + MV_RightChannelOffset/2); - if (sample0 < -32768) sample0 = -32768; - else if (sample0 > 32767) sample0 = 32767; - if (sample1 < -32768) sample1 = -32768; - else if (sample1 > 32767) sample1 = 32767; - *dest = (int16_t) sample0; - *(dest + MV_RightChannelOffset/2) = (int16_t) sample1; + *dest = (int16_t)clamp(sample0l + sample0h + 128 + *dest, INT16_MIN, INT16_MAX); + *(dest + (MV_RightChannelOffset >> 1)) + = (int16_t)clamp(sample1l + sample1h + 128 + *(dest + (MV_RightChannelOffset >> 1)), INT16_MIN, INT16_MAX); - dest += MV_SampleSize / 2; + dest += MV_SampleSize >> 1; } - MV_MixPosition = position; - MV_MixDestination = (char *) dest; + MV_MixPosition = position; + MV_MixDestination = (char *)dest; } void MV_16BitReverb(char const *src, char *dest, int16_t *volume, int32_t count) { - uint16_t const * input = (uint16_t const *) src; - int16_t * output = (int16_t *) dest; - int16_t sample0l, sample0h, sample0; + auto input = (uint16_t const *)src; + int16_t *output = (int16_t *)dest; - do { - sample0 = *input++; -#if 0 //def BIGENDIAN - sample0l = sample0 >> 8; - sample0h = (sample0 & 255) ^ 128; + do + { + int const sample0 = *input++; +#if 0 // def BIGENDIAN + int sample0l = sample0 >> 8; + int sample0h = (sample0 & 255) ^ 128; #else - sample0l = sample0 & 255; - sample0h = (sample0 >> 8) ^ 128; + int sample0l = sample0 & 255; + int sample0h = (sample0 >> 8) ^ 128; #endif - sample0l = ((int16_t *) volume)[sample0l] >> 8; - sample0h = ((int16_t *) volume)[sample0h]; - *output++ = (int16_t) (sample0l + sample0h + 128); + sample0l = ((int16_t *)volume)[sample0l] >> 8; + sample0h = ((int16_t *)volume)[sample0h]; + *output++ = (int16_t)(sample0l + sample0h + 128); } while (--count > 0); } diff --git a/source/audiolib/src/mixst.cpp b/source/audiolib/src/mixst.cpp index 9b0af3f56..d737ebf36 100644 --- a/source/audiolib/src/mixst.cpp +++ b/source/audiolib/src/mixst.cpp @@ -20,155 +20,130 @@ #include "_multivc.h" - /* - JBF: - position = offset of starting sample in start rate = resampling increment start = sound data length = count of samples to mix + volume = direct volume adjustment, 1.0 = no change */ // 8-bit stereo source, 16-bit mono output -void MV_Mix16BitMono8Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length) +void MV_Mix16BitMono8Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume) { - uint8_t const * const source = (uint8_t const *) start; - int16_t *dest = (int16_t *) MV_MixDestination; - int32_t sample0, sample1; + auto const source = (uint8_t const *)start; + int16_t * dest = (int16_t *)MV_MixDestination; - while (length--) { - sample0 = source[(position >> 16) << 1]; - sample1 = source[((position >> 16) << 1) + 1]; + while (length--) + { + int const sample0 = MV_VOLUME(source[(position >> 16) << 1]); + int const sample1 = MV_VOLUME(source[((position >> 16) << 1) + 1]); position += rate; - sample0 = (MV_LeftVolume[sample0] + MV_LeftVolume[sample1]) / 2 + *dest; - if (sample0 < -32768) sample0 = -32768; - else if (sample0 > 32767) sample0 = 32767; - - *dest = (int16_t) sample0; - - dest += MV_SampleSize / 2; + *dest = (int16_t)clamp(((MV_LeftVolume[sample0] + MV_LeftVolume[sample1]) >> 1) + *dest, INT16_MIN, INT16_MAX); + dest += MV_SampleSize >> 1; } - MV_MixPosition = position; - MV_MixDestination = (char *) dest; + MV_MixPosition = position; + MV_MixDestination = (char *)dest; } // 8-bit stereo source, 16-bit stereo output -void MV_Mix16BitStereo8Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length) +void MV_Mix16BitStereo8Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume) { - uint8_t const * const source = (uint8_t const *) start; - int16_t *dest = (int16_t *) MV_MixDestination; - int32_t sample0, sample1; + auto const source = (uint8_t const *)start; + int16_t * dest = (int16_t *)MV_MixDestination; - while (length--) { - sample0 = source[(position >> 16) << 1]; - sample1 = source[((position >> 16) << 1) + 1]; + while (length--) + { + int const sample0 = MV_VOLUME(source[(position >> 16) << 1]); + int const sample1 = MV_VOLUME(source[((position >> 16) << 1) + 1]); position += rate; - sample0 = MV_LeftVolume[sample0] + *dest; - sample1 = MV_RightVolume[sample1] + *(dest + MV_RightChannelOffset / 2); - if (sample0 < -32768) sample0 = -32768; - else if (sample0 > 32767) sample0 = 32767; - if (sample1 < -32768) sample1 = -32768; - else if (sample1 > 32767) sample1 = 32767; - - *dest = (int16_t) sample0; - *(dest + MV_RightChannelOffset/2) = (int16_t) sample1; - - dest += MV_SampleSize / 2; + *dest = (int16_t)clamp(MV_LeftVolume[sample0] + *dest, INT16_MIN, INT16_MAX); + *(dest + (MV_RightChannelOffset >> 1)) + = (int16_t)clamp(MV_RightVolume[sample1] + *(dest + (MV_RightChannelOffset >> 1)), INT16_MIN, INT16_MAX); + dest += MV_SampleSize >> 1; } - MV_MixPosition = position; - MV_MixDestination = (char *) dest; + MV_MixPosition = position; + MV_MixDestination = (char *)dest; } // 16-bit stereo source, 16-bit mono output -void MV_Mix16BitMono16Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length) +void MV_Mix16BitMono16Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume) { - uint16_t const * const source = (uint16_t const *) start; - int16_t *dest = (int16_t *) MV_MixDestination; - int32_t sample0l, sample0h, sample0; - int32_t sample1l, sample1h, sample1; + auto const source = (uint16_t const *)start; + int16_t * dest = (int16_t *)MV_MixDestination; - while (length--) { - sample0 = source[(position >> 16) << 1]; - sample1 = source[((position >> 16) << 1) + 1]; + while (length--) + { + int sample0 = MV_VOLUME(source[(position >> 16) << 1]); + int sample1 = MV_VOLUME(source[((position >> 16) << 1) + 1]); #ifdef BIGENDIAN - sample0l = sample0 >> 8; - sample0h = (sample0 & 255) ^ 128; - sample1l = sample1 >> 8; - sample1h = (sample1 & 255) ^ 128; + int sample0l = sample0 >> 8; + int sample0h = (sample0 & 255) ^ 128; + int sample1l = sample1 >> 8; + int sample1h = (sample1 & 255) ^ 128; #else - sample0l = sample0 & 255; - sample0h = (sample0 >> 8) ^ 128; - sample1l = sample1 & 255; - sample1h = (sample1 >> 8) ^ 128; + int sample0l = sample0 & 255; + int sample0h = (sample0 >> 8) ^ 128; + int sample1l = sample1 & 255; + int sample1h = (sample1 >> 8) ^ 128; #endif position += rate; sample0l = MV_LeftVolume[sample0l] >> 8; sample0h = MV_LeftVolume[sample0h]; - sample0 = sample0l + sample0h + 128; + sample0 = sample0l + sample0h + 128; + sample1l = MV_LeftVolume[sample1l] >> 8; sample1h = MV_LeftVolume[sample1h]; - sample1 = sample1l + sample1h + 128; + sample1 = sample1l + sample1h + 128; - sample0 = (sample0 + sample1) / 2 + *dest; - if (sample0 < -32768) sample0 = -32768; - else if (sample0 > 32767) sample0 = 32767; - - *dest = (int16_t) sample0; - - dest += MV_SampleSize / 2; + *dest = (int16_t)clamp(((sample0 + sample1) >> 1) + *dest, INT16_MIN, INT16_MAX); + dest += MV_SampleSize >> 1; } - MV_MixPosition = position; - MV_MixDestination = (char *) dest; + MV_MixPosition = position; + MV_MixDestination = (char *)dest; } // 16-bit stereo source, 16-bit stereo output -void MV_Mix16BitStereo16Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length) +void MV_Mix16BitStereo16Stereo(uint32_t position, uint32_t rate, const char *start, uint32_t length, float volume) { - uint16_t const * const source = (uint16_t const *) start; - int16_t *dest = (int16_t *) MV_MixDestination; - int32_t sample0l, sample0h, sample0; - int32_t sample1l, sample1h, sample1; + auto const source = (uint16_t const *)start; + int16_t * dest = (int16_t *)MV_MixDestination; - while (length--) { - sample0 = source[(position >> 16) << 1]; - sample1 = source[((position >> 16) << 1) + 1]; + while (length--) + { + int sample0 = MV_VOLUME(source[(position >> 16) << 1]); + int sample1 = MV_VOLUME(source[((position >> 16) << 1) + 1]); #ifdef BIGENDIAN - sample0l = sample0 >> 8; - sample0h = (sample0 & 255) ^ 128; - sample1l = sample1 >> 8; - sample1h = (sample1 & 255) ^ 128; + int sample0l = sample0 >> 8; + int sample0h = (sample0 & 255) ^ 128; + int sample1l = sample1 >> 8; + int sample1h = (sample1 & 255) ^ 128; #else - sample0l = sample0 & 255; - sample0h = (sample0 >> 8) ^ 128; - sample1l = sample1 & 255; - sample1h = (sample1 >> 8) ^ 128; + int sample0l = sample0 & 255; + int sample0h = (sample0 >> 8) ^ 128; + int sample1l = sample1 & 255; + int sample1h = (sample1 >> 8) ^ 128; #endif position += rate; sample0l = MV_LeftVolume[sample0l] >> 8; sample0h = MV_LeftVolume[sample0h]; + sample1l = MV_RightVolume[sample1l] >> 8; sample1h = MV_RightVolume[sample1h]; - sample0 = sample0l + sample0h + 128 + *dest; - sample1 = sample1l + sample1h + 128 + *(dest + MV_RightChannelOffset/2); - if (sample0 < -32768) sample0 = -32768; - else if (sample0 > 32767) sample0 = 32767; - if (sample1 < -32768) sample1 = -32768; - else if (sample1 > 32767) sample1 = 32767; - *dest = (int16_t) sample0; - *(dest + MV_RightChannelOffset/2) = (int16_t) sample1; - - dest += MV_SampleSize / 2; + *dest = (int16_t)clamp(sample0l + sample0h + 128 + *dest, INT16_MIN, INT16_MAX); + *(dest + (MV_RightChannelOffset >> 1)) + = (int16_t)clamp(sample1l + sample1h + 128 + *(dest + (MV_RightChannelOffset >> 1)), INT16_MIN, INT16_MAX); + dest += MV_SampleSize >> 1; } - MV_MixPosition = position; - MV_MixDestination = (char *) dest; + MV_MixPosition = position; + MV_MixDestination = (char *)dest; } diff --git a/source/audiolib/src/multivoc.cpp b/source/audiolib/src/multivoc.cpp index 31fb2366a..b385d7268 100644 --- a/source/audiolib/src/multivoc.cpp +++ b/source/audiolib/src/multivoc.cpp @@ -177,7 +177,7 @@ static void MV_Mix(VoiceNode *voice, int const buffer) voclength = length; if (voice->mix) - voice->mix(position, rate, start, voclength); + voice->mix(position, rate, start, voclength, voice->volume); voice->position = MV_MixPosition; diff --git a/source/audiolib/src/vorbis.cpp b/source/audiolib/src/vorbis.cpp index 9d16cb0bc..9cc8d006b 100644 --- a/source/audiolib/src/vorbis.cpp +++ b/source/audiolib/src/vorbis.cpp @@ -338,8 +338,7 @@ Begin playback of sound data at specified angle and distance from listener. ---------------------------------------------------------------------*/ -int32_t MV_PlayVorbis3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, - int32_t distance, int32_t priority, uint32_t callbackval) +int32_t MV_PlayVorbis3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, float volume, uint32_t callbackval) { if (!MV_Installed) { @@ -353,13 +352,13 @@ int32_t MV_PlayVorbis3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t angle += MV_NUMPANPOSITIONS / 2; } - int const volume = MIX_VOLUME(distance); + int const vol = MIX_VOLUME(distance); // Ensure angle is within 0 - 127 angle &= MV_MAXPANPOSITION; - return MV_PlayVorbis(ptr, ptrlength, loophow, -1, pitchoffset, max(0, 255 - distance), - MV_PanTable[angle][volume].left, MV_PanTable[angle][volume].right, priority, callbackval); + return MV_PlayVorbis(ptr, length, loophow, -1, pitchoffset, max(0, 255 - distance), + MV_PanTable[angle][vol].left, MV_PanTable[angle][vol].right, priority, volume, callbackval); } @@ -370,8 +369,7 @@ Begin playback of sound data with the given sound levels and priority. ---------------------------------------------------------------------*/ -int32_t MV_PlayVorbis(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, - int32_t vol, int32_t left, int32_t right, int32_t priority, uint32_t callbackval) +int32_t MV_PlayVorbis(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority, float volume, uint32_t callbackval) { UNREFERENCED_PARAMETER(loopend); @@ -391,7 +389,7 @@ int32_t MV_PlayVorbis(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t vd->ptr = ptr; vd->pos = 0; - vd->length = ptrlength; + vd->length = length; vd->lastbitstream = -1; int32_t status = ov_open_callbacks((void *)vd, &vd->vf, 0, 0, vorbis_callbacks); @@ -460,6 +458,8 @@ int32_t MV_PlayVorbis(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t MV_SetVoicePitch(voice, vi->rate, pitchoffset); MV_SetVoiceMixMode( voice ); + voice->volume = volume; + MV_SetVoiceVolume( voice, vol, left, right ); MV_PlayVoice( voice ); @@ -482,7 +482,7 @@ void MV_ReleaseVorbisVoice( VoiceNode * voice ) #include "_multivc.h" int32_t MV_PlayVorbis(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, - int32_t vol, int32_t left, int32_t right, int32_t priority, uint32_t callbackval) + int32_t vol, int32_t left, int32_t right, int32_t priority, float volume, uint32_t callbackval) { UNREFERENCED_PARAMETER(ptr); UNREFERENCED_PARAMETER(ptrlength); @@ -493,6 +493,7 @@ int32_t MV_PlayVorbis(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t UNREFERENCED_PARAMETER(left); UNREFERENCED_PARAMETER(right); UNREFERENCED_PARAMETER(priority); + UNREFERENCED_PARAMETER(volume); UNREFERENCED_PARAMETER(callbackval); MV_Printf("MV_PlayVorbis: OggVorbis support not included in this binary.\n"); @@ -500,7 +501,7 @@ int32_t MV_PlayVorbis(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t } int32_t MV_PlayVorbis3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, - int32_t distance, int32_t priority, uint32_t callbackval) + int32_t distance, int32_t priority, float volume, uint32_t callbackval) { UNREFERENCED_PARAMETER(ptr); UNREFERENCED_PARAMETER(ptrlength); @@ -509,6 +510,7 @@ int32_t MV_PlayVorbis3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t UNREFERENCED_PARAMETER(angle); UNREFERENCED_PARAMETER(distance); UNREFERENCED_PARAMETER(priority); + UNREFERENCED_PARAMETER(volume); UNREFERENCED_PARAMETER(callbackval); MV_Printf("MV_PlayVorbis: OggVorbis support not included in this binary.\n"); diff --git a/source/audiolib/src/xa.cpp b/source/audiolib/src/xa.cpp index 9fb00a806..30dbd1e3f 100644 --- a/source/audiolib/src/xa.cpp +++ b/source/audiolib/src/xa.cpp @@ -370,48 +370,39 @@ Begin playback of sound data at specified angle and distance from listener. ---------------------------------------------------------------------*/ -int32_t MV_PlayXA3D -( - char *ptr, - uint32_t ptrlength, - int32_t loophow, - int32_t pitchoffset, - int32_t angle, - int32_t distance, - int32_t priority, - uint32_t callbackval - ) +int32_t MV_PlayXA3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, float volume, + uint32_t callbackval) { - int32_t left; - int32_t right; - int32_t mid; - int32_t volume; - int32_t status; + int32_t left; + int32_t right; + int32_t mid; + int32_t vol; + int32_t status; - if ( !MV_Installed ) - { - MV_SetErrorCode( MV_NotInstalled ); - return MV_Error; - } + if (!MV_Installed) + { + MV_SetErrorCode(MV_NotInstalled); + return MV_Error; + } - if ( distance < 0 ) - { - distance = -distance; - angle += MV_NUMPANPOSITIONS / 2; - } + if (distance < 0) + { + distance = -distance; + angle += MV_NUMPANPOSITIONS / 2; + } - volume = MIX_VOLUME( distance ); + vol = MIX_VOLUME(distance); - // Ensure angle is within 0 - 127 - angle &= MV_MAXPANPOSITION; + // Ensure angle is within 0 - 127 + angle &= MV_MAXPANPOSITION; - left = MV_PanTable[ angle ][ volume ].left; - right = MV_PanTable[ angle ][ volume ].right; - mid = max( 0, 255 - distance ); + left = MV_PanTable[angle][vol].left; + right = MV_PanTable[angle][vol].right; + mid = max(0, 255 - distance); - status = MV_PlayXA(ptr, ptrlength, loophow, -1, pitchoffset, mid, left, right, priority, callbackval); + status = MV_PlayXA(ptr, length, loophow, -1, pitchoffset, mid, left, right, priority, volume, callbackval); - return status; + return status; } @@ -422,20 +413,8 @@ Begin playback of sound data with the given sound levels and priority. ---------------------------------------------------------------------*/ -int32_t MV_PlayXA -( - char *ptr, - uint32_t ptrlength, - int32_t loopstart, - int32_t loopend, - int32_t pitchoffset, - int32_t vol, - int32_t left, - int32_t right, - int32_t priority, - uint32_t callbackval - ) - +int32_t MV_PlayXA(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, + int32_t priority, float volume, uint32_t callbackval) { VoiceNode *voice; xa_data * xad = 0; @@ -458,7 +437,7 @@ int32_t MV_PlayXA xad->pos = XA_DATA_START; xad->t1 = xad->t2 = xad->t1_x = xad->t2_x = 0; xad->blocksize = 0; - xad->length = ptrlength; + xad->length = length; xad->block = NULL; @@ -495,6 +474,8 @@ int32_t MV_PlayXA voice->LoopEnd = 0; voice->LoopSize = (loopstart >= 0 ? 1 : 0); + voice->volume = volume; + MV_SetVoiceVolume( voice, vol, left, right ); MV_PlayVoice( voice ); diff --git a/source/audiolib/src/xmp.cpp b/source/audiolib/src/xmp.cpp index 0967312da..0bd7712f1 100644 --- a/source/audiolib/src/xmp.cpp +++ b/source/audiolib/src/xmp.cpp @@ -69,13 +69,12 @@ static playbackstatus MV_GetNextXMPBlock(VoiceNode *voice) return KeepPlaying; } -int32_t MV_PlayXMP3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, - int32_t distance, int32_t priority, uint32_t callbackval) +int32_t MV_PlayXMP3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, float volume, uint32_t callbackval) { int32_t left; int32_t right; int32_t mid; - int32_t volume; + int32_t vol; int32_t status; if (!MV_Installed) @@ -90,22 +89,21 @@ int32_t MV_PlayXMP3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pit angle += MV_NUMPANPOSITIONS / 2; } - volume = MIX_VOLUME(distance); + vol = MIX_VOLUME(distance); // Ensure angle is within 0 - 127 angle &= MV_MAXPANPOSITION; - left = MV_PanTable[angle][volume].left; - right = MV_PanTable[angle][volume].right; + left = MV_PanTable[angle][vol].left; + right = MV_PanTable[angle][vol].right; mid = max( 0, 255 - distance ); - status = MV_PlayXMP(ptr, ptrlength, loophow, -1, pitchoffset, mid, left, right, priority, callbackval); + status = MV_PlayXMP(ptr, length, loophow, -1, pitchoffset, mid, left, right, priority, volume, callbackval); return status; } -int32_t MV_PlayXMP(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval) +int32_t MV_PlayXMP(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, int32_t left, int32_t right, int32_t priority, float volume, uint32_t callbackval) { VoiceNode *voice; xmp_data * xmpd = 0; @@ -127,7 +125,7 @@ int32_t MV_PlayXMP(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loo } xmpd->ptr = ptr; - xmpd->length = ptrlength; + xmpd->length = length; if ((xmpd->context = xmp_create_context()) == NULL) { @@ -136,7 +134,7 @@ int32_t MV_PlayXMP(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loo return MV_Error; } - if ((retval = xmp_load_module_from_memory(xmpd->context, ptr, ptrlength)) != 0) + if ((retval = xmp_load_module_from_memory(xmpd->context, ptr, length)) != 0) { free(xmpd); MV_Printf("MV_PlayXMP: xmp_load_module_from_memory failed (%i)\n", retval); @@ -189,6 +187,8 @@ int32_t MV_PlayXMP(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loo voice->FixedPointBufferSize = (voice->RateScale * MV_MIXBUFFERSIZE) - voice->RateScale; MV_SetVoiceMixMode(voice); + voice->volume = volume; + MV_SetVoiceVolume(voice, vol, left, right); MV_PlayVoice(voice); @@ -217,7 +217,7 @@ void MV_ReleaseXMPVoice(VoiceNode * voice) static char const NoXMP[] = "MV_PlayXMP: libxmp-lite support not included in this binary.\n"; int32_t MV_PlayXMP(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, - int32_t left, int32_t right, int32_t priority, uint32_t callbackval) + int32_t left, int32_t right, int32_t priority, float volume, uint32_t callbackval) { UNREFERENCED_PARAMETER(ptr); UNREFERENCED_PARAMETER(ptrlength); @@ -228,6 +228,7 @@ int32_t MV_PlayXMP(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loo UNREFERENCED_PARAMETER(left); UNREFERENCED_PARAMETER(right); UNREFERENCED_PARAMETER(priority); + UNREFERENCED_PARAMETER(volume); UNREFERENCED_PARAMETER(callbackval); MV_Printf(NoXMP); @@ -235,7 +236,7 @@ int32_t MV_PlayXMP(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loo } int32_t MV_PlayXMP3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, - int32_t distance, int32_t priority, uint32_t callbackval) + int32_t distance, int32_t priority, float volume, uint32_t callbackval) { UNREFERENCED_PARAMETER(ptr); UNREFERENCED_PARAMETER(ptrlength); @@ -244,6 +245,7 @@ int32_t MV_PlayXMP3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pit UNREFERENCED_PARAMETER(angle); UNREFERENCED_PARAMETER(distance); UNREFERENCED_PARAMETER(priority); + UNREFERENCED_PARAMETER(volume); UNREFERENCED_PARAMETER(callbackval); MV_Printf(NoXMP); diff --git a/source/duke3d/src/game.cpp b/source/duke3d/src/game.cpp index 5797c2620..3d6628466 100644 --- a/source/duke3d/src/game.cpp +++ b/source/duke3d/src/game.cpp @@ -4464,7 +4464,7 @@ extern int G_StartRTS(int lumpNum, int localPlayer) if (pData != NULL) { - FX_Play3D(pData, RTS_SoundLength(lumpNum - 1), FX_ONESHOT, 0, 0, FX_VOLUME(1), 255, -lumpNum); + FX_Play3D(pData, RTS_SoundLength(lumpNum - 1), FX_ONESHOT, 0, 0, FX_VOLUME(1), 255, 1.f, -lumpNum); g_RTSPlaying = 7; return 1; } diff --git a/source/duke3d/src/gamedef.cpp b/source/duke3d/src/gamedef.cpp index 4a62aa203..cccae545d 100644 --- a/source/duke3d/src/gamedef.cpp +++ b/source/duke3d/src/gamedef.cpp @@ -6136,6 +6136,8 @@ repeatcase: g_sounds[k].vo = *(g_scriptPtr-1); g_scriptPtr -= 5; + g_sounds[k].volume = 1.f; + if (k > g_highestSoundIdx) g_highestSoundIdx = k; diff --git a/source/duke3d/src/sounds.cpp b/source/duke3d/src/sounds.cpp index d58e87484..91e408565 100644 --- a/source/duke3d/src/sounds.cpp +++ b/source/duke3d/src/sounds.cpp @@ -254,7 +254,7 @@ static int32_t S_PlayMusic(const char *fn) int32_t const mvol = MASTER_VOLUME(ud.config.MusicVolume); int MyMusicVoice = FX_Play(MyMusicPtr, MusicLen, 0, 0, 0, mvol, mvol, mvol, - FX_MUSIC_PRIORITY, MUSIC_ID); + FX_MUSIC_PRIORITY, 1.f, MUSIC_ID); if (MyMusicVoice <= FX_Ok) { @@ -720,13 +720,13 @@ int32_t S_PlaySound3D(int32_t num, int32_t i, const vec3_t *pos) if (repeatp && !ambsfxp) { // XXX: why is 'right' 0? - voice = FX_Play(snd.ptr, snd.soundsiz, 0, -1, pitch, FX_VOLUME(sndist >> 6), FX_VOLUME(sndist >> 6), 0, snd.pr, + voice = FX_Play(snd.ptr, snd.soundsiz, 0, -1, pitch, FX_VOLUME(sndist >> 6), FX_VOLUME(sndist >> 6), 0, snd.pr, snd.volume, (sndNum * MAXSOUNDINSTANCES) + sndSlot); } else { // Ambient MUSICANDSFX always start playing using the 3D routines! - voice = FX_Play3D(snd.ptr, snd.soundsiz, repeatp ? FX_LOOP : FX_ONESHOT, pitch, sndang >> 4, FX_VOLUME(sndist >> 6), snd.pr, + voice = FX_Play3D(snd.ptr, snd.soundsiz, repeatp ? FX_LOOP : FX_ONESHOT, pitch, sndang >> 4, FX_VOLUME(sndist >> 6), snd.pr, snd.volume, (sndNum * MAXSOUNDINSTANCES) + sndSlot); } @@ -782,9 +782,9 @@ int32_t S_PlaySound(int32_t num) if (snd.m & SF_LOOP) voice = FX_Play(snd.ptr, snd.soundsiz, 0, -1, pitch, FX_VOLUME(LOUDESTVOLUME), FX_VOLUME(LOUDESTVOLUME), FX_VOLUME(LOUDESTVOLUME), - snd.soundsiz, (num * MAXSOUNDINSTANCES) + sndnum); + snd.soundsiz, snd.volume, (num * MAXSOUNDINSTANCES) + sndnum); else - voice = FX_Play3D(snd.ptr, snd.soundsiz, FX_ONESHOT, pitch, 0, FX_VOLUME(255 - LOUDESTVOLUME), snd.pr, (num * MAXSOUNDINSTANCES) + sndnum); + voice = FX_Play3D(snd.ptr, snd.soundsiz, FX_ONESHOT, pitch, 0, FX_VOLUME(255 - LOUDESTVOLUME), snd.pr, snd.volume, (num * MAXSOUNDINSTANCES) + sndnum); if (voice <= FX_Ok) { diff --git a/source/duke3d/src/sounds_mapster32.cpp b/source/duke3d/src/sounds_mapster32.cpp index c412186a1..50fe541f3 100644 --- a/source/duke3d/src/sounds_mapster32.cpp +++ b/source/duke3d/src/sounds_mapster32.cpp @@ -255,12 +255,12 @@ int32_t S_PlaySound3D(int32_t num, int32_t i, const vec3_t *pos) return -1; voice = FX_Play(g_sounds[num].ptr, g_sounds[num].soundsiz, 0, -1, - pitch, sndist>>6, sndist>>6, 0, g_sounds[num].pr, num); + pitch, sndist>>6, sndist>>6, 0, g_sounds[num].pr, 1.f, num); } else { voice = FX_Play3D(g_sounds[num].ptr, g_sounds[num].soundsiz, FX_ONESHOT, - pitch, sndang>>4, sndist>>6, g_sounds[num].pr, num); + pitch, sndang>>4, sndist>>6, g_sounds[num].pr, 1.f, num); } if (voice >= FX_Ok) @@ -314,12 +314,12 @@ void S_PlaySound(int32_t num) if (g_sounds[num].m & SF_LOOP) { voice = FX_Play(g_sounds[num].ptr, g_sounds[num].soundsiz, 0, -1, - pitch,LOUDESTVOLUME,LOUDESTVOLUME,LOUDESTVOLUME,g_sounds[num].soundsiz,num); + pitch,LOUDESTVOLUME,LOUDESTVOLUME,LOUDESTVOLUME,g_sounds[num].soundsiz, 1.f,num); } else { voice = FX_Play3D(g_sounds[num].ptr, g_sounds[num].soundsiz, FX_ONESHOT, - pitch,0,255-LOUDESTVOLUME,g_sounds[num].pr, num); + pitch,0,255-LOUDESTVOLUME,g_sounds[num].pr, 1.f, num); } if (voice >= FX_Ok)