Add per-sound volume support to audiolib. This allows you to control the volume of sounds independently from the distance-based system exposed through CON. To use this, you must define your sounds via the .def syntax and set the "volume" property--default is 1.0.

git-svn-id: https://svn.eduke32.com/eduke32@7117 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2018-10-25 23:32:14 +00:00
parent 98f42cba6f
commit 374a09536d
16 changed files with 297 additions and 352 deletions

View file

@ -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 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 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 *, ...)); int32_t FX_SetPrintf(void(*function)(const char *, ...));

View file

@ -86,30 +86,30 @@ void MV_SetReverbDelay(int32_t delay);
// int32_t MV_SetMixMode( int32_t numchannels, int32_t samplebits ); // int32_t MV_SetMixMode( int32_t numchannels, int32_t samplebits );
// int32_t MV_StartPlayback( void ); // int32_t MV_StartPlayback( void );
// void MV_StopPlayback( 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 MV_PlayWAV3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority,
int32_t priority, uint32_t callbackval); 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 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 left, int32_t right, int32_t priority, uint32_t callbackval); 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 MV_PlayVOC3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority,
int32_t priority, uint32_t callbackval); 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 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 left, int32_t right, int32_t priority, uint32_t callbackval); 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 MV_PlayVorbis3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority,
int32_t distance, int32_t priority, uint32_t callbackval); 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 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 left, int32_t right, int32_t priority, uint32_t callbackval); 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 MV_PlayFLAC3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority,
int32_t priority, uint32_t callbackval); 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 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 left, int32_t right, int32_t priority, uint32_t callbackval); 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 MV_PlayXA3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority, float volume,
int32_t priority, uint32_t callbackval); 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 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 left, int32_t right, int32_t priority, uint32_t callbackval); 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 MV_PlayXMP3D(char *ptr, uint32_t length, int32_t loophow, int32_t pitchoffset, int32_t angle, int32_t distance, int32_t priority,
int32_t priority, uint32_t callbackval); 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 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 left, int32_t right, int32_t priority, uint32_t callbackval); int32_t priority, float volume, uint32_t callbackval);
int MV_IdentifyXMP(char const *ptr, uint32_t length); int MV_IdentifyXMP(char const *ptr, uint32_t length);

View file

@ -49,13 +49,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define MV_MAXPANPOSITION 127 /* formerly 31 */ #define MV_MAXPANPOSITION 127 /* formerly 31 */
#define MV_NUMPANPOSITIONS ( MV_MAXPANPOSITION + 1 ) #define MV_NUMPANPOSITIONS ( MV_MAXPANPOSITION + 1 )
#define MV_MAXTOTALVOLUME 255 #define MV_MAXTOTALVOLUME 255
#define MV_MAXVOLUME 255 /* formerly 63 */ #define MV_MAXVOLUME 127 /* formerly 63 */
#define MV_NUMVOICES 8 #define MV_NUMVOICES 8
// mirrors FX_MUSIC_PRIORITY from fx_man.h // mirrors FX_MUSIC_PRIORITY from fx_man.h
#define MV_MUSIC_PRIORITY INT_MAX #define MV_MUSIC_PRIORITY INT_MAX
#define MIX_VOLUME(volume) ((max(0, min((volume), 255)) * (MV_MAXVOLUME + 1)) >> 8) #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_MIXBUFFERSIZE 256
#define MV_NUMBEROFBUFFERS 16 #define MV_NUMBEROFBUFFERS 16
@ -77,7 +78,7 @@ typedef struct VoiceNode
playbackstatus (*GetSound)(struct VoiceNode *voice); 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; const char *sound;
@ -94,6 +95,8 @@ typedef struct VoiceNode
char bits; char bits;
char channels; char channels;
float volume;
unsigned LoopCount; unsigned LoopCount;
uint32_t LoopSize; uint32_t LoopSize;
uint32_t BlockLength; uint32_t BlockLength;
@ -178,17 +181,17 @@ void MV_ReleaseXAVoice(VoiceNode *voice);
void MV_ReleaseXMPVoice(VoiceNode *voice); void MV_ReleaseXMPVoice(VoiceNode *voice);
// implemented in mix.c // implemented in mix.c
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);
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);
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);
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);
void MV_16BitReverb( char const *src, char *dest, int16_t *volume, int32_t count ); void MV_16BitReverb( char const *src, char *dest, int16_t *volume, int32_t count );
// implemented in mixst.c // implemented in mixst.c
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);
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);
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);
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);
extern char *MV_MixDestination; // pointer to the next output sample extern char *MV_MixDestination; // pointer to the next output sample
extern uint32_t MV_MixPosition; // return value of where the source pointer got to extern uint32_t MV_MixPosition; // return value of where the source pointer got to

View file

@ -378,14 +378,12 @@ Begin playback of sound data at specified angle and distance
from listener. from listener.
---------------------------------------------------------------------*/ ---------------------------------------------------------------------*/
int32_t MV_PlayFLAC3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, 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 distance, int32_t priority, uint32_t callbackval)
{ {
int32_t left; int32_t left;
int32_t right; int32_t right;
int32_t mid; int32_t mid;
int32_t volume; int32_t vol;
int32_t status; int32_t status;
if (!MV_Installed) 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; angle += MV_NUMPANPOSITIONS / 2;
} }
volume = MIX_VOLUME(distance); vol = MIX_VOLUME(distance);
// Ensure angle is within 0 - 127 // Ensure angle is within 0 - 127
angle &= MV_MAXPANPOSITION; angle &= MV_MAXPANPOSITION;
left = MV_PanTable[angle][volume].left; left = MV_PanTable[angle][vol].left;
right = MV_PanTable[angle][volume].right; right = MV_PanTable[angle][vol].right;
mid = max(0, 255 - distance); 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; return status;
} }
@ -422,9 +420,7 @@ Begin playback of sound data with the given sound levels and
priority. priority.
---------------------------------------------------------------------*/ ---------------------------------------------------------------------*/
int32_t MV_PlayFLAC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, 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 left, int32_t right, int32_t priority, uint32_t callbackval)
{ {
VoiceNode *voice; VoiceNode *voice;
flac_data *fd = 0; 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->ptr = ptr;
fd->pos = 0; fd->pos = 0;
fd->blocksize = 0; fd->blocksize = 0;
fd->length = ptrlength; fd->length = length;
fd->block = NULL; 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; voice->FixedPointBufferSize = (voice->RateScale * MV_MIXBUFFERSIZE) - voice->RateScale;
MV_SetVoiceMixMode(voice); MV_SetVoiceMixMode(voice);
voice->volume = volume;
MV_SetVoiceVolume(voice, vol, left, right); MV_SetVoiceVolume(voice, vol, left, right);
MV_PlayVoice(voice); MV_PlayVoice(voice);
@ -668,7 +666,7 @@ void MV_ReleaseFLACVoice(VoiceNode *voice)
#include "_multivc.h" #include "_multivc.h"
int32_t MV_PlayFLAC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, 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(ptr);
UNREFERENCED_PARAMETER(ptrlength); 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(left);
UNREFERENCED_PARAMETER(right); UNREFERENCED_PARAMETER(right);
UNREFERENCED_PARAMETER(priority); UNREFERENCED_PARAMETER(priority);
UNREFERENCED_PARAMETER(volume);
UNREFERENCED_PARAMETER(callbackval); UNREFERENCED_PARAMETER(callbackval);
MV_Printf("MV_PlayFLAC: FLAC support not included in this binary.\n"); 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 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(ptr);
UNREFERENCED_PARAMETER(ptrlength); 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(angle);
UNREFERENCED_PARAMETER(distance); UNREFERENCED_PARAMETER(distance);
UNREFERENCED_PARAMETER(priority); UNREFERENCED_PARAMETER(priority);
UNREFERENCED_PARAMETER(volume);
UNREFERENCED_PARAMETER(callbackval); UNREFERENCED_PARAMETER(callbackval);
MV_Printf("MV_PlayFLAC: FLAC support not included in this binary.\n"); MV_Printf("MV_PlayFLAC: FLAC support not included in this binary.\n");

View file

@ -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 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) if (!MV_Installed)
return MV_Error; 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; angle += MV_NUMPANPOSITIONS / 2;
} }
int const volume = MIX_VOLUME(distance); int const vol = MIX_VOLUME(distance);
// Ensure angle is within 0 - 127 // Ensure angle is within 0 - 127
angle &= MV_MAXPANPOSITION; angle &= MV_MAXPANPOSITION;
return MV_PlayWAV(ptr, length, loophow, -1, pitchoffset, max(0, 255 - distance), 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 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 left, int32_t right, int32_t priority, float volume, uint32_t callbackval)
{ {
if (!MV_Installed) if (!MV_Installed)
return MV_Error; 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->channels = format.nChannels;
voice->GetSound = MV_GetNextWAVBlock; voice->GetSound = MV_GetNextWAVBlock;
int32_t length = data.size; int32_t blocklen = data.size;
if (voice->bits == 16) if (voice->bits == 16)
{ {
data.size &= ~1; data.size &= ~1;
length /= 2; blocklen /= 2;
} }
if (voice->channels == 2) if (voice->channels == 2)
{ {
data.size &= ~1; data.size &= ~1;
length /= 2; blocklen /= 2;
} }
voice->rawdataptr = (uint8_t *)ptr; voice->rawdataptr = (uint8_t *)ptr;
voice->ptrlength = ptrlength; voice->ptrlength = length;
voice->Playing = TRUE; voice->Playing = TRUE;
voice->Paused = FALSE; voice->Paused = FALSE;
voice->LoopCount = 0; voice->LoopCount = 0;
voice->position = 0; voice->position = 0;
voice->length = 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->NextBlock = (char *)((intptr_t) ptr + sizeof(riff_header) + riff.format_size + sizeof(data_header));
voice->next = NULL; voice->next = NULL;
voice->prev = 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->callbackval = callbackval;
voice->LoopStart = loopstart >= 0 ? voice->NextBlock : NULL; voice->LoopStart = loopstart >= 0 ? voice->NextBlock : NULL;
voice->LoopEnd = 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_SetVoicePitch(voice, format.nSamplesPerSec, pitchoffset);
MV_SetVoiceVolume(voice, vol, left, right); 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; return voice->handle;
} }
int32_t MV_PlayVOC3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, 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 distance, int32_t priority, float volume, uint32_t callbackval)
{ {
if (!MV_Installed) if (!MV_Installed)
return MV_Error; 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; angle += MV_NUMPANPOSITIONS / 2;
} }
int const volume = MIX_VOLUME(distance); int const vol = MIX_VOLUME(distance);
// Ensure angle is within 0 - 127 // Ensure angle is within 0 - 127
angle &= MV_MAXPANPOSITION; angle &= MV_MAXPANPOSITION;
return MV_PlayVOC(ptr, ptrlength, loophow, -1, pitchoffset, max(0, 255 - distance), return MV_PlayVOC(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_PlayVOC(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, int32_t vol, 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 left, int32_t right, int32_t priority, float volume, uint32_t callbackval)
{ {
if (!MV_Installed) if (!MV_Installed)
return MV_Error; 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->rawdataptr = (uint8_t *)ptr;
voice->ptrlength = ptrlength; voice->ptrlength = length;
voice->Playing = TRUE; voice->Playing = TRUE;
voice->Paused = FALSE; voice->Paused = FALSE;
voice->wavetype = FMT_VOC; 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->LoopEnd = NULL;
voice->LoopSize = loopend - loopstart + 1; voice->LoopSize = loopend - loopstart + 1;
voice->volume = volume;
MV_SetVoiceVolume(voice, vol, left, right); MV_SetVoiceVolume(voice, vol, left, right);
MV_PlayVoice(voice); MV_PlayVoice(voice);

View file

@ -134,18 +134,18 @@ static wavefmt_t FX_DetectFormat(char const * const ptr, uint32_t length)
return fmt; return fmt;
} }
int32_t FX_Play(char *ptr, uint32_t length, int32_t loopstart, int32_t loopend, int32_t pitchoffset, 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)
{ {
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 }; { NULL, NULL, MV_PlayVOC, MV_PlayWAV, MV_PlayVorbis, MV_PlayFLAC, MV_PlayXA, MV_PlayXMP };
EDUKE32_STATIC_ASSERT(FMT_MAX == ARRAY_SIZE(func)); 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 = 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) 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; 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 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 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 }; { NULL, NULL, MV_PlayVOC3D, MV_PlayWAV3D, MV_PlayVorbis3D, MV_PlayFLAC3D, MV_PlayXA3D, MV_PlayXMP3D };
EDUKE32_STATIC_ASSERT(FMT_MAX == ARRAY_SIZE(func)); 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 = 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) if (handle <= MV_Ok)
{ {

View file

@ -21,160 +21,137 @@
#include "_multivc.h" #include "_multivc.h"
/* /*
JBF:
position = offset of starting sample in start position = offset of starting sample in start
rate = resampling increment rate = resampling increment
start = sound data start = sound data
length = count of samples to mix length = count of samples to mix
volume = direct volume adjustment, 1.0 = no change
*/ */
// 8-bit mono source, 16-bit mono output // 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; auto const source = (uint8_t const *)start;
int16_t *dest = (int16_t *) MV_MixDestination; int16_t * dest = (int16_t *)MV_MixDestination;
int32_t sample0;
while (length--) { while (length--)
sample0 = source[position >> 16]; {
int const sample0 = MV_VOLUME(source[position >> 16]);
position += rate; position += rate;
sample0 = MV_LeftVolume[sample0] + *dest; *dest = (int16_t)clamp(MV_LeftVolume[sample0] + *dest, INT16_MIN, INT16_MAX);
if (sample0 < -32768) sample0 = -32768; dest += MV_SampleSize >> 1;
else if (sample0 > 32767) sample0 = 32767;
*dest = (int16_t) sample0;
dest += MV_SampleSize / 2;
} }
MV_MixPosition = position; MV_MixPosition = position;
MV_MixDestination = (char *) dest; MV_MixDestination = (char *)dest;
} }
// 8-bit mono source, 16-bit stereo output // 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; auto const source = (uint8_t const *)start;
int16_t *dest = (int16_t *) MV_MixDestination; int16_t * dest = (int16_t *)MV_MixDestination;
int32_t sample0, sample1;
while (length--) { while (length--)
sample0 = source[position >> 16]; {
sample1 = sample0; int const sample0 = MV_VOLUME(source[position >> 16]);
position += rate; position += rate;
sample0 = MV_LeftVolume[sample0] + *dest; *dest = (int16_t)clamp(MV_LeftVolume[sample0] + *dest, INT16_MIN, INT16_MAX);
sample1 = MV_RightVolume[sample1] + *(dest + MV_RightChannelOffset / 2); *(dest + (MV_RightChannelOffset >> 1))
if (sample0 < -32768) sample0 = -32768; = (int16_t)clamp(MV_RightVolume[sample0] + *(dest + (MV_RightChannelOffset >> 1)), INT16_MIN, INT16_MAX);
else if (sample0 > 32767) sample0 = 32767; dest += MV_SampleSize >> 1;
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;
} }
MV_MixPosition = position; MV_MixPosition = position;
MV_MixDestination = (char *) dest; MV_MixDestination = (char *)dest;
} }
// 16-bit mono source, 16-bit mono output // 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; auto const source = (uint16_t const *)start;
int16_t *dest = (int16_t *) MV_MixDestination; int16_t * dest = (int16_t *)MV_MixDestination;
int32_t sample0l, sample0h, sample0;
while (length--) { while (length--)
sample0 = source[position >> 16]; {
int const sample0 = MV_VOLUME(source[position >> 16]);
#ifdef BIGENDIAN #ifdef BIGENDIAN
sample0l = sample0 >> 8; int sample0l = sample0 >> 8;
sample0h = (sample0 & 255) ^ 128; int sample0h = (sample0 & 255) ^ 128;
#else #else
sample0l = sample0 & 255; int sample0l = sample0 & 255;
sample0h = (sample0 >> 8) ^ 128; int sample0h = (sample0 >> 8) ^ 128;
#endif #endif
position += rate; position += rate;
sample0l = MV_LeftVolume[sample0l] >> 8; sample0l = MV_LeftVolume[sample0l] >> 8;
sample0h = MV_LeftVolume[sample0h]; 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_MixPosition = position;
MV_MixDestination = (char *) dest; MV_MixDestination = (char *)dest;
} }
// 16-bit mono source, 16-bit stereo output // 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; auto const source = (uint16_t const *)start;
int16_t *dest = (int16_t *) MV_MixDestination; int16_t * dest = (int16_t *)MV_MixDestination;
int32_t sample0l, sample0h, sample0;
int32_t sample1l, sample1h, sample1;
while (length--) { while (length--)
sample0 = source[position >> 16]; {
#ifdef BIGENDIAN int const sample0 = MV_VOLUME(source[position >> 16]);
sample0l = sample0 >> 8;
sample0h = (sample0 & 255) ^ 128;
#else
sample0l = sample0 & 255;
sample0h = (sample0 >> 8) ^ 128;
#endif
sample1l = sample0l;
sample1h = sample0h;
position += rate; 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; sample0l = MV_LeftVolume[sample0l] >> 8;
sample0h = MV_LeftVolume[sample0h]; 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 = (int16_t)clamp(sample0l + sample0h + 128 + *dest, INT16_MIN, INT16_MAX);
*(dest + MV_RightChannelOffset/2) = (int16_t) sample1; *(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_MixPosition = position;
MV_MixDestination = (char *) dest; MV_MixDestination = (char *)dest;
} }
void MV_16BitReverb(char const *src, char *dest, int16_t *volume, int32_t count) void MV_16BitReverb(char const *src, char *dest, int16_t *volume, int32_t count)
{ {
uint16_t const * input = (uint16_t const *) src; auto input = (uint16_t const *)src;
int16_t * output = (int16_t *) dest; int16_t *output = (int16_t *)dest;
int16_t sample0l, sample0h, sample0;
do { do
sample0 = *input++; {
#if 0 //def BIGENDIAN int const sample0 = *input++;
sample0l = sample0 >> 8; #if 0 // def BIGENDIAN
sample0h = (sample0 & 255) ^ 128; int sample0l = sample0 >> 8;
int sample0h = (sample0 & 255) ^ 128;
#else #else
sample0l = sample0 & 255; int sample0l = sample0 & 255;
sample0h = (sample0 >> 8) ^ 128; int sample0h = (sample0 >> 8) ^ 128;
#endif #endif
sample0l = ((int16_t *) volume)[sample0l] >> 8; sample0l = ((int16_t *)volume)[sample0l] >> 8;
sample0h = ((int16_t *) volume)[sample0h]; sample0h = ((int16_t *)volume)[sample0h];
*output++ = (int16_t) (sample0l + sample0h + 128); *output++ = (int16_t)(sample0l + sample0h + 128);
} while (--count > 0); } while (--count > 0);
} }

View file

@ -20,155 +20,130 @@
#include "_multivc.h" #include "_multivc.h"
/* /*
JBF:
position = offset of starting sample in start position = offset of starting sample in start
rate = resampling increment rate = resampling increment
start = sound data start = sound data
length = count of samples to mix length = count of samples to mix
volume = direct volume adjustment, 1.0 = no change
*/ */
// 8-bit stereo source, 16-bit mono output // 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; auto const source = (uint8_t const *)start;
int16_t *dest = (int16_t *) MV_MixDestination; int16_t * dest = (int16_t *)MV_MixDestination;
int32_t sample0, sample1;
while (length--) { while (length--)
sample0 = source[(position >> 16) << 1]; {
sample1 = source[((position >> 16) << 1) + 1]; int const sample0 = MV_VOLUME(source[(position >> 16) << 1]);
int const sample1 = MV_VOLUME(source[((position >> 16) << 1) + 1]);
position += rate; position += rate;
sample0 = (MV_LeftVolume[sample0] + MV_LeftVolume[sample1]) / 2 + *dest; *dest = (int16_t)clamp(((MV_LeftVolume[sample0] + MV_LeftVolume[sample1]) >> 1) + *dest, INT16_MIN, INT16_MAX);
if (sample0 < -32768) sample0 = -32768; dest += MV_SampleSize >> 1;
else if (sample0 > 32767) sample0 = 32767;
*dest = (int16_t) sample0;
dest += MV_SampleSize / 2;
} }
MV_MixPosition = position; MV_MixPosition = position;
MV_MixDestination = (char *) dest; MV_MixDestination = (char *)dest;
} }
// 8-bit stereo source, 16-bit stereo output // 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; auto const source = (uint8_t const *)start;
int16_t *dest = (int16_t *) MV_MixDestination; int16_t * dest = (int16_t *)MV_MixDestination;
int32_t sample0, sample1;
while (length--) { while (length--)
sample0 = source[(position >> 16) << 1]; {
sample1 = source[((position >> 16) << 1) + 1]; int const sample0 = MV_VOLUME(source[(position >> 16) << 1]);
int const sample1 = MV_VOLUME(source[((position >> 16) << 1) + 1]);
position += rate; position += rate;
sample0 = MV_LeftVolume[sample0] + *dest; *dest = (int16_t)clamp(MV_LeftVolume[sample0] + *dest, INT16_MIN, INT16_MAX);
sample1 = MV_RightVolume[sample1] + *(dest + MV_RightChannelOffset / 2); *(dest + (MV_RightChannelOffset >> 1))
if (sample0 < -32768) sample0 = -32768; = (int16_t)clamp(MV_RightVolume[sample1] + *(dest + (MV_RightChannelOffset >> 1)), INT16_MIN, INT16_MAX);
else if (sample0 > 32767) sample0 = 32767; dest += MV_SampleSize >> 1;
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;
} }
MV_MixPosition = position; MV_MixPosition = position;
MV_MixDestination = (char *) dest; MV_MixDestination = (char *)dest;
} }
// 16-bit stereo source, 16-bit mono output // 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; auto const source = (uint16_t const *)start;
int16_t *dest = (int16_t *) MV_MixDestination; int16_t * dest = (int16_t *)MV_MixDestination;
int32_t sample0l, sample0h, sample0;
int32_t sample1l, sample1h, sample1;
while (length--) { while (length--)
sample0 = source[(position >> 16) << 1]; {
sample1 = source[((position >> 16) << 1) + 1]; int sample0 = MV_VOLUME(source[(position >> 16) << 1]);
int sample1 = MV_VOLUME(source[((position >> 16) << 1) + 1]);
#ifdef BIGENDIAN #ifdef BIGENDIAN
sample0l = sample0 >> 8; int sample0l = sample0 >> 8;
sample0h = (sample0 & 255) ^ 128; int sample0h = (sample0 & 255) ^ 128;
sample1l = sample1 >> 8; int sample1l = sample1 >> 8;
sample1h = (sample1 & 255) ^ 128; int sample1h = (sample1 & 255) ^ 128;
#else #else
sample0l = sample0 & 255; int sample0l = sample0 & 255;
sample0h = (sample0 >> 8) ^ 128; int sample0h = (sample0 >> 8) ^ 128;
sample1l = sample1 & 255; int sample1l = sample1 & 255;
sample1h = (sample1 >> 8) ^ 128; int sample1h = (sample1 >> 8) ^ 128;
#endif #endif
position += rate; position += rate;
sample0l = MV_LeftVolume[sample0l] >> 8; sample0l = MV_LeftVolume[sample0l] >> 8;
sample0h = MV_LeftVolume[sample0h]; sample0h = MV_LeftVolume[sample0h];
sample0 = sample0l + sample0h + 128; sample0 = sample0l + sample0h + 128;
sample1l = MV_LeftVolume[sample1l] >> 8; sample1l = MV_LeftVolume[sample1l] >> 8;
sample1h = MV_LeftVolume[sample1h]; sample1h = MV_LeftVolume[sample1h];
sample1 = sample1l + sample1h + 128; sample1 = sample1l + sample1h + 128;
sample0 = (sample0 + sample1) / 2 + *dest; *dest = (int16_t)clamp(((sample0 + sample1) >> 1) + *dest, INT16_MIN, INT16_MAX);
if (sample0 < -32768) sample0 = -32768; dest += MV_SampleSize >> 1;
else if (sample0 > 32767) sample0 = 32767;
*dest = (int16_t) sample0;
dest += MV_SampleSize / 2;
} }
MV_MixPosition = position; MV_MixPosition = position;
MV_MixDestination = (char *) dest; MV_MixDestination = (char *)dest;
} }
// 16-bit stereo source, 16-bit stereo output // 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; auto const source = (uint16_t const *)start;
int16_t *dest = (int16_t *) MV_MixDestination; int16_t * dest = (int16_t *)MV_MixDestination;
int32_t sample0l, sample0h, sample0;
int32_t sample1l, sample1h, sample1;
while (length--) { while (length--)
sample0 = source[(position >> 16) << 1]; {
sample1 = source[((position >> 16) << 1) + 1]; int sample0 = MV_VOLUME(source[(position >> 16) << 1]);
int sample1 = MV_VOLUME(source[((position >> 16) << 1) + 1]);
#ifdef BIGENDIAN #ifdef BIGENDIAN
sample0l = sample0 >> 8; int sample0l = sample0 >> 8;
sample0h = (sample0 & 255) ^ 128; int sample0h = (sample0 & 255) ^ 128;
sample1l = sample1 >> 8; int sample1l = sample1 >> 8;
sample1h = (sample1 & 255) ^ 128; int sample1h = (sample1 & 255) ^ 128;
#else #else
sample0l = sample0 & 255; int sample0l = sample0 & 255;
sample0h = (sample0 >> 8) ^ 128; int sample0h = (sample0 >> 8) ^ 128;
sample1l = sample1 & 255; int sample1l = sample1 & 255;
sample1h = (sample1 >> 8) ^ 128; int sample1h = (sample1 >> 8) ^ 128;
#endif #endif
position += rate; position += rate;
sample0l = MV_LeftVolume[sample0l] >> 8; sample0l = MV_LeftVolume[sample0l] >> 8;
sample0h = MV_LeftVolume[sample0h]; sample0h = MV_LeftVolume[sample0h];
sample1l = MV_RightVolume[sample1l] >> 8; sample1l = MV_RightVolume[sample1l] >> 8;
sample1h = MV_RightVolume[sample1h]; 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 = (int16_t)clamp(sample0l + sample0h + 128 + *dest, INT16_MIN, INT16_MAX);
*(dest + MV_RightChannelOffset/2) = (int16_t) sample1; *(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_MixPosition = position;
MV_MixDestination = (char *) dest; MV_MixDestination = (char *)dest;
} }

View file

@ -177,7 +177,7 @@ static void MV_Mix(VoiceNode *voice, int const buffer)
voclength = length; voclength = length;
if (voice->mix) if (voice->mix)
voice->mix(position, rate, start, voclength); voice->mix(position, rate, start, voclength, voice->volume);
voice->position = MV_MixPosition; voice->position = MV_MixPosition;

View file

@ -338,8 +338,7 @@ Begin playback of sound data at specified angle and distance
from listener. from listener.
---------------------------------------------------------------------*/ ---------------------------------------------------------------------*/
int32_t MV_PlayVorbis3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, 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 distance, int32_t priority, uint32_t callbackval)
{ {
if (!MV_Installed) 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; angle += MV_NUMPANPOSITIONS / 2;
} }
int const volume = MIX_VOLUME(distance); int const vol = MIX_VOLUME(distance);
// Ensure angle is within 0 - 127 // Ensure angle is within 0 - 127
angle &= MV_MAXPANPOSITION; angle &= MV_MAXPANPOSITION;
return MV_PlayVorbis(ptr, ptrlength, loophow, -1, pitchoffset, max(0, 255 - distance), return MV_PlayVorbis(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);
} }
@ -370,8 +369,7 @@ Begin playback of sound data with the given sound levels and
priority. priority.
---------------------------------------------------------------------*/ ---------------------------------------------------------------------*/
int32_t MV_PlayVorbis(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, 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 vol, int32_t left, int32_t right, int32_t priority, uint32_t callbackval)
{ {
UNREFERENCED_PARAMETER(loopend); 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->ptr = ptr;
vd->pos = 0; vd->pos = 0;
vd->length = ptrlength; vd->length = length;
vd->lastbitstream = -1; vd->lastbitstream = -1;
int32_t status = ov_open_callbacks((void *)vd, &vd->vf, 0, 0, vorbis_callbacks); 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_SetVoicePitch(voice, vi->rate, pitchoffset);
MV_SetVoiceMixMode( voice ); MV_SetVoiceMixMode( voice );
voice->volume = volume;
MV_SetVoiceVolume( voice, vol, left, right ); MV_SetVoiceVolume( voice, vol, left, right );
MV_PlayVoice( voice ); MV_PlayVoice( voice );
@ -482,7 +482,7 @@ void MV_ReleaseVorbisVoice( VoiceNode * voice )
#include "_multivc.h" #include "_multivc.h"
int32_t MV_PlayVorbis(char *ptr, uint32_t ptrlength, int32_t loopstart, int32_t loopend, int32_t pitchoffset, 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(ptr);
UNREFERENCED_PARAMETER(ptrlength); 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(left);
UNREFERENCED_PARAMETER(right); UNREFERENCED_PARAMETER(right);
UNREFERENCED_PARAMETER(priority); UNREFERENCED_PARAMETER(priority);
UNREFERENCED_PARAMETER(volume);
UNREFERENCED_PARAMETER(callbackval); UNREFERENCED_PARAMETER(callbackval);
MV_Printf("MV_PlayVorbis: OggVorbis support not included in this binary.\n"); 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 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(ptr);
UNREFERENCED_PARAMETER(ptrlength); 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(angle);
UNREFERENCED_PARAMETER(distance); UNREFERENCED_PARAMETER(distance);
UNREFERENCED_PARAMETER(priority); UNREFERENCED_PARAMETER(priority);
UNREFERENCED_PARAMETER(volume);
UNREFERENCED_PARAMETER(callbackval); UNREFERENCED_PARAMETER(callbackval);
MV_Printf("MV_PlayVorbis: OggVorbis support not included in this binary.\n"); MV_Printf("MV_PlayVorbis: OggVorbis support not included in this binary.\n");

View file

@ -370,48 +370,39 @@ Begin playback of sound data at specified angle and distance
from listener. from listener.
---------------------------------------------------------------------*/ ---------------------------------------------------------------------*/
int32_t MV_PlayXA3D 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)
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 left; int32_t left;
int32_t right; int32_t right;
int32_t mid; int32_t mid;
int32_t volume; int32_t vol;
int32_t status; int32_t status;
if ( !MV_Installed ) if (!MV_Installed)
{ {
MV_SetErrorCode( MV_NotInstalled ); MV_SetErrorCode(MV_NotInstalled);
return MV_Error; return MV_Error;
} }
if ( distance < 0 ) if (distance < 0)
{ {
distance = -distance; distance = -distance;
angle += MV_NUMPANPOSITIONS / 2; angle += MV_NUMPANPOSITIONS / 2;
} }
volume = MIX_VOLUME( distance ); vol = MIX_VOLUME(distance);
// Ensure angle is within 0 - 127 // Ensure angle is within 0 - 127
angle &= MV_MAXPANPOSITION; angle &= MV_MAXPANPOSITION;
left = MV_PanTable[ angle ][ volume ].left; left = MV_PanTable[angle][vol].left;
right = MV_PanTable[ angle ][ volume ].right; right = MV_PanTable[angle][vol].right;
mid = max( 0, 255 - distance ); 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. priority.
---------------------------------------------------------------------*/ ---------------------------------------------------------------------*/
int32_t MV_PlayXA 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)
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
)
{ {
VoiceNode *voice; VoiceNode *voice;
xa_data * xad = 0; xa_data * xad = 0;
@ -458,7 +437,7 @@ int32_t MV_PlayXA
xad->pos = XA_DATA_START; xad->pos = XA_DATA_START;
xad->t1 = xad->t2 = xad->t1_x = xad->t2_x = 0; xad->t1 = xad->t2 = xad->t1_x = xad->t2_x = 0;
xad->blocksize = 0; xad->blocksize = 0;
xad->length = ptrlength; xad->length = length;
xad->block = NULL; xad->block = NULL;
@ -495,6 +474,8 @@ int32_t MV_PlayXA
voice->LoopEnd = 0; voice->LoopEnd = 0;
voice->LoopSize = (loopstart >= 0 ? 1 : 0); voice->LoopSize = (loopstart >= 0 ? 1 : 0);
voice->volume = volume;
MV_SetVoiceVolume( voice, vol, left, right ); MV_SetVoiceVolume( voice, vol, left, right );
MV_PlayVoice( voice ); MV_PlayVoice( voice );

View file

@ -69,13 +69,12 @@ static playbackstatus MV_GetNextXMPBlock(VoiceNode *voice)
return KeepPlaying; return KeepPlaying;
} }
int32_t MV_PlayXMP3D(char *ptr, uint32_t ptrlength, int32_t loophow, int32_t pitchoffset, int32_t angle, 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 distance, int32_t priority, uint32_t callbackval)
{ {
int32_t left; int32_t left;
int32_t right; int32_t right;
int32_t mid; int32_t mid;
int32_t volume; int32_t vol;
int32_t status; int32_t status;
if (!MV_Installed) 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; angle += MV_NUMPANPOSITIONS / 2;
} }
volume = MIX_VOLUME(distance); vol = MIX_VOLUME(distance);
// Ensure angle is within 0 - 127 // Ensure angle is within 0 - 127
angle &= MV_MAXPANPOSITION; angle &= MV_MAXPANPOSITION;
left = MV_PanTable[angle][volume].left; left = MV_PanTable[angle][vol].left;
right = MV_PanTable[angle][volume].right; right = MV_PanTable[angle][vol].right;
mid = max( 0, 255 - distance ); 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; 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 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)
int32_t left, int32_t right, int32_t priority, uint32_t callbackval)
{ {
VoiceNode *voice; VoiceNode *voice;
xmp_data * xmpd = 0; 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->ptr = ptr;
xmpd->length = ptrlength; xmpd->length = length;
if ((xmpd->context = xmp_create_context()) == NULL) 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; 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); free(xmpd);
MV_Printf("MV_PlayXMP: xmp_load_module_from_memory failed (%i)\n", retval); 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; voice->FixedPointBufferSize = (voice->RateScale * MV_MIXBUFFERSIZE) - voice->RateScale;
MV_SetVoiceMixMode(voice); MV_SetVoiceMixMode(voice);
voice->volume = volume;
MV_SetVoiceVolume(voice, vol, left, right); MV_SetVoiceVolume(voice, vol, left, right);
MV_PlayVoice(voice); 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"; 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 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(ptr);
UNREFERENCED_PARAMETER(ptrlength); 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(left);
UNREFERENCED_PARAMETER(right); UNREFERENCED_PARAMETER(right);
UNREFERENCED_PARAMETER(priority); UNREFERENCED_PARAMETER(priority);
UNREFERENCED_PARAMETER(volume);
UNREFERENCED_PARAMETER(callbackval); UNREFERENCED_PARAMETER(callbackval);
MV_Printf(NoXMP); 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 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(ptr);
UNREFERENCED_PARAMETER(ptrlength); 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(angle);
UNREFERENCED_PARAMETER(distance); UNREFERENCED_PARAMETER(distance);
UNREFERENCED_PARAMETER(priority); UNREFERENCED_PARAMETER(priority);
UNREFERENCED_PARAMETER(volume);
UNREFERENCED_PARAMETER(callbackval); UNREFERENCED_PARAMETER(callbackval);
MV_Printf(NoXMP); MV_Printf(NoXMP);

View file

@ -4464,7 +4464,7 @@ extern int G_StartRTS(int lumpNum, int localPlayer)
if (pData != NULL) 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; g_RTSPlaying = 7;
return 1; return 1;
} }

View file

@ -6136,6 +6136,8 @@ repeatcase:
g_sounds[k].vo = *(g_scriptPtr-1); g_sounds[k].vo = *(g_scriptPtr-1);
g_scriptPtr -= 5; g_scriptPtr -= 5;
g_sounds[k].volume = 1.f;
if (k > g_highestSoundIdx) if (k > g_highestSoundIdx)
g_highestSoundIdx = k; g_highestSoundIdx = k;

View file

@ -254,7 +254,7 @@ static int32_t S_PlayMusic(const char *fn)
int32_t const mvol = MASTER_VOLUME(ud.config.MusicVolume); int32_t const mvol = MASTER_VOLUME(ud.config.MusicVolume);
int MyMusicVoice = FX_Play(MyMusicPtr, MusicLen, 0, 0, int MyMusicVoice = FX_Play(MyMusicPtr, MusicLen, 0, 0,
0, mvol, mvol, mvol, 0, mvol, mvol, mvol,
FX_MUSIC_PRIORITY, MUSIC_ID); FX_MUSIC_PRIORITY, 1.f, MUSIC_ID);
if (MyMusicVoice <= FX_Ok) 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) if (repeatp && !ambsfxp)
{ {
// XXX: why is 'right' 0? // 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); (sndNum * MAXSOUNDINSTANCES) + sndSlot);
} }
else else
{ {
// Ambient MUSICANDSFX always start playing using the 3D routines! // 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); (sndNum * MAXSOUNDINSTANCES) + sndSlot);
} }
@ -782,9 +782,9 @@ int32_t S_PlaySound(int32_t num)
if (snd.m & SF_LOOP) if (snd.m & SF_LOOP)
voice = FX_Play(snd.ptr, snd.soundsiz, 0, -1, pitch, FX_VOLUME(LOUDESTVOLUME), FX_VOLUME(LOUDESTVOLUME), FX_VOLUME(LOUDESTVOLUME), 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 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) if (voice <= FX_Ok)
{ {

View file

@ -255,12 +255,12 @@ int32_t S_PlaySound3D(int32_t num, int32_t i, const vec3_t *pos)
return -1; return -1;
voice = FX_Play(g_sounds[num].ptr, g_sounds[num].soundsiz, 0, -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 else
{ {
voice = FX_Play3D(g_sounds[num].ptr, g_sounds[num].soundsiz, FX_ONESHOT, 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) if (voice >= FX_Ok)
@ -314,12 +314,12 @@ void S_PlaySound(int32_t num)
if (g_sounds[num].m & SF_LOOP) if (g_sounds[num].m & SF_LOOP)
{ {
voice = FX_Play(g_sounds[num].ptr, g_sounds[num].soundsiz, 0, -1, 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 else
{ {
voice = FX_Play3D(g_sounds[num].ptr, g_sounds[num].soundsiz, FX_ONESHOT, 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) if (voice >= FX_Ok)