]> Shamusworld >> Repos - virtualjaguar/blob - src/dsound_dummy.cpp
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes.
[virtualjaguar] / src / dsound_dummy.cpp
1 ////////////////////////////////////////////////////////////////////////////////\r
2 // Audio\r
3 ////////////////////////////////////////////////////////////////////////////////\r
4 \r
5 #include "include/jaguar.h"\r
6 #include "include/dsnd.h"\r
7 \r
8 int ym2413_enable;\r
9 \r
10 int FREQUENCE=44100;\r
11 \r
12 void dsound_reset(void);\r
13 \r
14 #define LEFT 0\r
15 #define RIGHT 1\r
16 #define SOUND_BUFFER    (0.16)          //Seconds\r
17 #define UNDEFINED               0xFFFFFF\r
18 \r
19 int chipBufferLength;   //Number of bytes to hold SOUND_BUFFER seconds.\r
20 \r
21 int lastChipWrite  =0;\r
22 int chipWrite =UNDEFINED;       //Write Cursor\r
23 \r
24 INT16* buf1;\r
25 \r
26 ////////////////////////////////////////////////////////////////////////////////\r
27 //\r
28 ////////////////////////////////////////////////////////////////////////////////\r
29 \r
30 void ws_write_state(int fp)\r
31 {\r
32 }\r
33 \r
34 \r
35 void ws_read_state(int fp)\r
36 {\r
37 }\r
38 \r
39 \r
40 \r
41 \r
42 ////////////////////////////////////////////////////////////////////////////////\r
43 //\r
44 ////////////////////////////////////////////////////////////////////////////////\r
45 void ws_audio_init(void)\r
46 {\r
47 #ifdef _EMULATE_SOUND\r
48         dsound_init(GetForegroundWindow(),1,FREQUENCE);\r
49 //      ws_audio_reset();\r
50 #endif\r
51 }\r
52 ////////////////////////////////////////////////////////////////////////////////\r
53 //\r
54 ////////////////////////////////////////////////////////////////////////////////\r
55 void ws_audio_reset(void)\r
56 {\r
57 #ifdef _EMULATE_SOUND\r
58  int i;\r
59  dsound_reset();\r
60 \r
61          chipWrite=UNDEFINED;\r
62 \r
63         for (i=0;i<4;i++)\r
64         {\r
65          ws_audio_stop_channel(i);\r
66          ws_audio_play_channel(i);\r
67          ws_audio_clear_channel(i);\r
68         }\r
69 \r
70          IDirectSoundBuffer_SetPan(chipBuffer,0);\r
71          IDirectSoundBuffer_SetVolume(chipBuffer,0);\r
72 #endif\r
73 }\r
74 \r
75 \r
76 ////////////////////////////////////////////////////////////////////////////////\r
77 //\r
78 ////////////////////////////////////////////////////////////////////////////////\r
79 void ws_audio_done(void)\r
80 {\r
81 #ifdef _EMULATE_SOUND\r
82         system_sound_shutdown();\r
83 #endif\r
84 }\r
85 \r
86 \r
87 ////////////////////////////////////////////////////////////////////////////////\r
88 //\r
89 ////////////////////////////////////////////////////////////////////////////////\r
90 void ws_audio_clear_channel(int Channel)\r
91 {\r
92 #ifdef _EMULATE_SOUND\r
93 \r
94  switch (Channel)\r
95  {\r
96  case 0:\r
97  case 1:\r
98           memset(buf1,0,sizeof(buf1));\r
99           chipWrite = UNDEFINED;\r
100           break;\r
101 \r
102  case 2:\r
103  case 3:\r
104             break;\r
105 \r
106  }\r
107 #endif\r
108 }\r
109 \r
110 \r
111 \r
112 ////////////////////////////////////////////////////////////////////////////////\r
113 // start playing a channel\r
114 ////////////////////////////////////////////////////////////////////////////////\r
115 int ws_audio_play_channel(int Channel)\r
116 {\r
117 #ifdef _EMULATE_SOUND\r
118         switch (Channel)\r
119         {\r
120         case 0:\r
121         case 1:\r
122 //              if (psg_on)\r
123                 IDirectSoundBuffer_Play(chipBuffer,0,0, DSBPLAY_LOOPING);\r
124                 break;\r
125         case 2:\r
126         case 3:\r
127                 break;\r
128         }\r
129 #endif\r
130         return 0;\r
131 }\r
132 \r
133 \r
134 ////////////////////////////////////////////////////////////////////////////////\r
135 // stop playing a channel\r
136 ////////////////////////////////////////////////////////////////////////////////\r
137 int ws_audio_stop_channel(int Channel)\r
138 {\r
139 #ifdef _EMULATE_SOUND\r
140         switch (Channel)\r
141         {\r
142         case 0:\r
143         case 1:\r
144                 IDirectSoundBuffer_Stop(chipBuffer);\r
145                 chipWrite=UNDEFINED;\r
146                 break;\r
147 \r
148         case 2:\r
149         case 3:\r
150                 break;\r
151         }\r
152 #endif\r
153         return(0);\r
154 }\r
155 \r
156 \r
157 \r
158 void dsound_reset(void)\r
159 {\r
160 #ifdef _EMULATE_SOUND\r
161         BYTE    *ppvAudioPtr1, *ppvAudioPtr2;\r
162         DWORD   pdwAudioBytes1, pdwAudioBytes2;\r
163 \r
164 \r
165          chipWrite = UNDEFINED;\r
166          if (chipBuffer)\r
167          {\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
172                 {\r
173                         if (ppvAudioPtr1 && pdwAudioBytes1)\r
174                                 memset(ppvAudioPtr1, 0, pdwAudioBytes1);\r
175 \r
176                         if (ppvAudioPtr2 && pdwAudioBytes2)\r
177                                 memset(ppvAudioPtr2, 0, pdwAudioBytes2);\r
178                         \r
179                         IDirectSoundBuffer_Unlock(chipBuffer, \r
180                                 ppvAudioPtr1, pdwAudioBytes1, ppvAudioPtr2, pdwAudioBytes2);\r
181                 }\r
182 \r
183                 //Start playing\r
184 //              if (psg_on)\r
185                         IDirectSoundBuffer_Play(chipBuffer, 0,0, DSBPLAY_LOOPING );\r
186          }\r
187 IDirectSoundBuffer_Play(chipBuffer, 0,0, DSBPLAY_LOOPING );\r
188 #endif\r
189 }\r
190 \r
191 \r
192 \r
193 void system_sound_shutdown(void)\r
194 {\r
195 #ifdef _EMULATE_SOUND\r
196          if (chipBuffer)        IDirectSoundBuffer_Stop(chipBuffer);\r
197          if (chipBuffer)        IDirectSoundBuffer_Release(chipBuffer);\r
198 \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
203 #endif\r
204 }\r
205 \r
206 \r
207 void system_sound_update(void)\r
208 {\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
214 \r
215          // UNDEFINED write cursors\r
216          IDirectSoundBuffer_GetCurrentPosition(chipBuffer, 0, (LPDWORD)&Write);\r
217          if ((chipWrite == UNDEFINED) )\r
218          {\r
219                 lastChipWrite = chipWrite= Write - 128;\r
220                 return; //Wait a frame to accumulate length.\r
221          }\r
222 \r
223         \r
224                 //SN76496 Sound Chips\r
225 \r
226                  if (Write < lastChipWrite)     //Wrap?\r
227                         lastChipWrite -= chipBufferLength;\r
228 \r
229                 LengthSamples = (Write - lastChipWrite) / 2; \r
230                 lastChipWrite = Write;\r
231 \r
232 /*              if (psg_on)*/ {\r
233                 pcm_updateOne(0,buf1,LengthSamples>>1);\r
234 \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
239                  {\r
240                          __asm {\r
241                                         cld\r
242                                         mov eax,buf1\r
243                                         mov ebx,buf1\r
244                                         mov edi,chipPtr1\r
245                                         mov ecx,pdwAudioBytes1\r
246                                         shr ecx,2\r
247                                         \r
248 Copie1:                         mov esi,eax\r
249                                         movsw\r
250                                         add eax,2\r
251                                         mov esi,ebx\r
252                                         movsw\r
253                                         add ebx,2\r
254                                         loop Copie1\r
255                         \r
256                                         mov edi,chipPtr2\r
257                                         cmp edi,0\r
258                                         je End\r
259                                         mov ecx,pdwAudioBytes2\r
260                                         shr ecx,2\r
261 \r
262 Copie2:                         \r
263                                         mov esi,eax\r
264                                         movsw\r
265                                         add eax,2\r
266                                         mov esi,ebx\r
267                                         movsw\r
268                                         add ebx,2\r
269                                         loop Copie2\r
270 \r
271 End:                            }\r
272                                 \r
273 \r
274                          IDirectSoundBuffer_Unlock(chipBuffer,\r
275                                 chipPtr1, pdwAudioBytes1, chipPtr2, pdwAudioBytes2);\r
276 \r
277                         chipWrite+= (LengthSamples * 2);\r
278                         if (chipWrite> chipBufferLength)\r
279                                 chipWrite-= chipBufferLength;\r
280                 }\r
281                 else\r
282                 {\r
283                         DWORD status;\r
284                         chipWrite= UNDEFINED;\r
285                         IDirectSoundBuffer_GetStatus(chipBuffer, &status);\r
286                         if (status & DSBSTATUS_BUFFERLOST)\r
287                         {\r
288                                 if (IDirectSoundBuffer_Restore(chipBuffer) != DS_OK) return;\r
289                                 /*if (psg_on)*/ IDirectSoundBuffer_Play(chipBuffer, 0, 0, DSBPLAY_LOOPING);\r
290                         }\r
291           }\r
292          }\r
293 #endif\r
294 }\r