version 1.2 | | version 1.3 |
---|
| | |
#include <mmsystem.h> | | #include <mmsystem.h> |
#include <dsound.h> | | #include <dsound.h> |
| | |
| | #include <math.h> |
| | |
#include "error.h" | | #include "error.h" |
#include "mono.h" | | #include "mono.h" |
#include "fix.h" | | #include "fix.h" |
| | |
int digi_last_midi_song_loop = 0; | | int digi_last_midi_song_loop = 0; |
| | |
static int digi_initialised = 0; | | static int digi_initialised = 0; |
| | static int digi_atexit_initialised=0; |
| | |
static int digi_sounds_initialized = 0; | | static int digi_sounds_initialized = 0; |
| | |
| | |
{ | | { |
HRESULT hr; | | HRESULT hr; |
| | |
| | if (!digi_initialised && g_hWnd){ |
| | |
memset(&waveformat, 0, sizeof(waveformat)); | | memset(&waveformat, 0, sizeof(waveformat)); |
waveformat.wFormatTag=WAVE_FORMAT_PCM; | | waveformat.wFormatTag=WAVE_FORMAT_PCM; |
waveformat.wBitsPerSample=8; | | waveformat.wBitsPerSample=8; |
| | |
waveformat.nAvgBytesPerSec = | | waveformat.nAvgBytesPerSec = |
waveformat.nSamplesPerSec * waveformat.nBlockAlign; | | waveformat.nSamplesPerSec * waveformat.nBlockAlign; |
| | |
| | |
if ((hr = DirectSoundCreate(NULL, &lpds, NULL)) != DS_OK) | | if ((hr = DirectSoundCreate(NULL, &lpds, NULL)) != DS_OK) |
return -1; | | return -1; |
| | |
| | |
dsbd.lpwfxFormat = &waveformat; | | dsbd.lpwfxFormat = &waveformat; |
| | |
digi_initialised = 1; | | digi_initialised = 1; |
| | } |
| | |
| | if (!digi_atexit_initialised){ |
atexit(digi_close); | | atexit(digi_close); |
| | digi_atexit_initialised=1; |
| | } |
return 0; | | return 0; |
} | | } |
| | |
| | |
return -1; | | return -1; |
} | | } |
| | |
| | int D1vol2DSvol(fix d1v){ |
| | //multiplying by 1.5 doesn't help. DirectSound uses dB for volume, rather than a linear scale like d1 wants. |
| | //I had to pull out a math book, but here is the code to fix it :) -Matt Mueller |
| | //log x=y <==> x=a^y |
| | // a |
| | if (d1v<=0) |
| | return -10000; |
| | else |
| | // return log2(f2fl(d1v))*1000;//no log2? hm. |
| | return log(f2fl(d1v))/log(2)*1000.0; |
| | } |
| | |
int digi_start_sound(int soundnum, fix volume, fix pan) | | int digi_start_sound(int soundnum, fix volume, fix pan) |
{ | | { |
int ntries; | | int ntries; |
| | |
IDirectSoundBuffer_Unlock(SoundSlots[slot].lpsb, ptr1, len1, ptr2, len2); | | IDirectSoundBuffer_Unlock(SoundSlots[slot].lpsb, ptr1, len1, ptr2, len2); |
} | | } |
IDirectSoundBuffer_SetPan(SoundSlots[slot].lpsb, ((int)(f2fl(pan) * 20000.0))-10000); | | IDirectSoundBuffer_SetPan(SoundSlots[slot].lpsb, ((int)(f2fl(pan) * 20000.0))-10000); |
/* The actual volume (attenuation) scale is 0 - -10000, but we scale the volume | | // IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb, MIN(((int)(f2fl(SoundSlots[slot].volume) * 15000.0)) - 10000, 0));//nope |
up by 1.5 x because otherwise sounds fall off too quickly. */ | | IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb, D1vol2DSvol(SoundSlots[slot].volume)); |
IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb, MIN(((int)(f2fl(SoundSlots[slot].volume) * 15000.0)) - 10000, 0)); | | |
IDirectSoundBuffer_Play(SoundSlots[slot].lpsb, 0, 0, 0); | | IDirectSoundBuffer_Play(SoundSlots[slot].lpsb, 0, 0, 0); |
| | |
//added on 980905 by adb to add sound kill system from original sos digi.c | | //added on 980905 by adb to add sound kill system from original sos digi.c |
| | |
IDirectSoundBuffer_Unlock(SoundSlots[slot].lpsb, (void *)ptr1, len1, (void *)ptr2, len2); | | IDirectSoundBuffer_Unlock(SoundSlots[slot].lpsb, (void *)ptr1, len1, (void *)ptr2, len2); |
} | | } |
IDirectSoundBuffer_SetPan(SoundSlots[slot].lpsb, ((int)(f2fl(SoundSlots[slot].pan) * 20000))-10000); | | IDirectSoundBuffer_SetPan(SoundSlots[slot].lpsb, ((int)(f2fl(SoundSlots[slot].pan) * 20000))-10000); |
IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb, MIN(((int)(f2fl(SoundSlots[slot].volume) * 15000.0)) - 10000, 0)); | | // IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb, MIN(((int)(f2fl(SoundSlots[slot].volume) * 15000.0)) - 10000, 0));//nope |
| | IDirectSoundBuffer_SetVolume(SoundSlots[slot].lpsb,D1vol2DSvol(SoundSlots[slot].volume)); |
IDirectSoundBuffer_Play(SoundSlots[slot].lpsb, 0, 0, SoundSlots[slot].looped?DSBPLAY_LOOPING:0); | | IDirectSoundBuffer_Play(SoundSlots[slot].lpsb, 0, 0, SoundSlots[slot].looped?DSBPLAY_LOOPING:0); |
| | |
SoundObjects[obj].signature = next_signature++; | | SoundObjects[obj].signature = next_signature++; |