1 ////////////////////////////////////////////////////////////////////////////////
\r
3 ////////////////////////////////////////////////////////////////////////////////
\r
5 #include "include/jaguar.h"
\r
6 #include "include/dsnd.h"
\r
10 int FREQUENCE=44100;
\r
12 void dsound_reset(void);
\r
16 #define SOUND_BUFFER (0.16) //Seconds
\r
17 #define UNDEFINED 0xFFFFFF
\r
19 int chipBufferLength; //Number of bytes to hold SOUND_BUFFER seconds.
\r
21 int lastChipWrite =0;
\r
22 int chipWrite =UNDEFINED; //Write Cursor
\r
26 ////////////////////////////////////////////////////////////////////////////////
\r
28 ////////////////////////////////////////////////////////////////////////////////
\r
30 void ws_write_state(int fp)
\r
35 void ws_read_state(int fp)
\r
42 ////////////////////////////////////////////////////////////////////////////////
\r
44 ////////////////////////////////////////////////////////////////////////////////
\r
45 void ws_audio_init(void)
\r
47 #ifdef _EMULATE_SOUND
\r
48 dsound_init(GetForegroundWindow(),1,FREQUENCE);
\r
49 // ws_audio_reset();
\r
52 ////////////////////////////////////////////////////////////////////////////////
\r
54 ////////////////////////////////////////////////////////////////////////////////
\r
55 void ws_audio_reset(void)
\r
57 #ifdef _EMULATE_SOUND
\r
61 chipWrite=UNDEFINED;
\r
65 ws_audio_stop_channel(i);
\r
66 ws_audio_play_channel(i);
\r
67 ws_audio_clear_channel(i);
\r
70 IDirectSoundBuffer_SetPan(chipBuffer,0);
\r
71 IDirectSoundBuffer_SetVolume(chipBuffer,0);
\r
76 ////////////////////////////////////////////////////////////////////////////////
\r
78 ////////////////////////////////////////////////////////////////////////////////
\r
79 void ws_audio_done(void)
\r
81 #ifdef _EMULATE_SOUND
\r
82 system_sound_shutdown();
\r
87 ////////////////////////////////////////////////////////////////////////////////
\r
89 ////////////////////////////////////////////////////////////////////////////////
\r
90 void ws_audio_clear_channel(int Channel)
\r
92 #ifdef _EMULATE_SOUND
\r
98 memset(buf1,0,sizeof(buf1));
\r
99 chipWrite = UNDEFINED;
\r
112 ////////////////////////////////////////////////////////////////////////////////
\r
113 // start playing a channel
\r
114 ////////////////////////////////////////////////////////////////////////////////
\r
115 int ws_audio_play_channel(int Channel)
\r
117 #ifdef _EMULATE_SOUND
\r
123 IDirectSoundBuffer_Play(chipBuffer,0,0, DSBPLAY_LOOPING);
\r
134 ////////////////////////////////////////////////////////////////////////////////
\r
135 // stop playing a channel
\r
136 ////////////////////////////////////////////////////////////////////////////////
\r
137 int ws_audio_stop_channel(int Channel)
\r
139 #ifdef _EMULATE_SOUND
\r
144 IDirectSoundBuffer_Stop(chipBuffer);
\r
145 chipWrite=UNDEFINED;
\r
158 void dsound_reset(void)
\r
160 #ifdef _EMULATE_SOUND
\r
161 BYTE *ppvAudioPtr1, *ppvAudioPtr2;
\r
162 DWORD pdwAudioBytes1, pdwAudioBytes2;
\r
165 chipWrite = UNDEFINED;
\r
168 IDirectSoundBuffer_Stop(chipBuffer);
\r
169 // Fill the sound buffer
\r
170 if SUCCEEDED(IDirectSoundBuffer_Lock(chipBuffer,0,0,
\r
171 (LPVOID*)&ppvAudioPtr1, &pdwAudioBytes1, (LPVOID*)&ppvAudioPtr2, &pdwAudioBytes2, DSBLOCK_ENTIREBUFFER))
\r
173 if (ppvAudioPtr1 && pdwAudioBytes1)
\r
174 memset(ppvAudioPtr1, 0, pdwAudioBytes1);
\r
176 if (ppvAudioPtr2 && pdwAudioBytes2)
\r
177 memset(ppvAudioPtr2, 0, pdwAudioBytes2);
\r
179 IDirectSoundBuffer_Unlock(chipBuffer,
\r
180 ppvAudioPtr1, pdwAudioBytes1, ppvAudioPtr2, pdwAudioBytes2);
\r
185 IDirectSoundBuffer_Play(chipBuffer, 0,0, DSBPLAY_LOOPING );
\r
187 IDirectSoundBuffer_Play(chipBuffer, 0,0, DSBPLAY_LOOPING );
\r
193 void system_sound_shutdown(void)
\r
195 #ifdef _EMULATE_SOUND
\r
196 if (chipBuffer) IDirectSoundBuffer_Stop(chipBuffer);
\r
197 if (chipBuffer) IDirectSoundBuffer_Release(chipBuffer);
\r
199 if (primaryBuffer) IDirectSoundBuffer_Stop(primaryBuffer);
\r
200 if (primaryBuffer) IDirectSoundBuffer_Release(primaryBuffer);
\r
201 if (ds) IDirectSound_Release(ds);
\r
202 if (buf1) free(buf1);
\r
207 void system_sound_update(void)
\r
209 #ifdef _EMULATE_SOUND
\r
210 LPDWORD null_ptr=NULL;
\r
211 int pdwAudioBytes1, pdwAudioBytes2;
\r
212 int Write, LengthSamples;
\r
213 UINT16 *chipPtr1, *chipPtr2;
\r
215 // UNDEFINED write cursors
\r
216 IDirectSoundBuffer_GetCurrentPosition(chipBuffer, 0, (LPDWORD)&Write);
\r
217 if ((chipWrite == UNDEFINED) )
\r
219 lastChipWrite = chipWrite= Write - 128;
\r
220 return; //Wait a frame to accumulate length.
\r
224 //SN76496 Sound Chips
\r
226 if (Write < lastChipWrite) //Wrap?
\r
227 lastChipWrite -= chipBufferLength;
\r
229 LengthSamples = (Write - lastChipWrite) / 2;
\r
230 lastChipWrite = Write;
\r
233 pcm_updateOne(0,buf1,LengthSamples>>1);
\r
235 if SUCCEEDED(IDirectSoundBuffer_Lock(
\r
236 chipBuffer, chipWrite, LengthSamples*2,
\r
237 (LPVOID*)&chipPtr1, (LPDWORD)&pdwAudioBytes1,
\r
238 (LPVOID*)&chipPtr2, (LPDWORD)&pdwAudioBytes2, 0))
\r
245 mov ecx,pdwAudioBytes1
\r
248 Copie1: mov esi,eax
\r
259 mov ecx,pdwAudioBytes2
\r
274 IDirectSoundBuffer_Unlock(chipBuffer,
\r
275 chipPtr1, pdwAudioBytes1, chipPtr2, pdwAudioBytes2);
\r
277 chipWrite+= (LengthSamples * 2);
\r
278 if (chipWrite> chipBufferLength)
\r
279 chipWrite-= chipBufferLength;
\r
284 chipWrite= UNDEFINED;
\r
285 IDirectSoundBuffer_GetStatus(chipBuffer, &status);
\r
286 if (status & DSBSTATUS_BUFFERLOST)
\r
288 if (IDirectSoundBuffer_Restore(chipBuffer) != DS_OK) return;
\r
289 /*if (psg_on)*/ IDirectSoundBuffer_Play(chipBuffer, 0, 0, DSBPLAY_LOOPING);
\r