|
|
1.1 root 1: #include "main.h"
2: #include "dialog.h"
3: #include "configuration.h"
4: #include "m68000.h"
5: #include "sysdeps.h"
6: #include "audio.h"
7: #include "dma.h"
8: #include "snd.h"
9:
10: #include <SDL.h>
11:
12:
13: /* Sound emulation SDL interface */
14: SDL_AudioDeviceID Audio_Input_Device;
15: SDL_AudioDeviceID Audio_Output_Device;
16:
17: int nAudioFrequency = 44100; /* Sound playback frequency */
18: bool bSoundOutputWorking = false; /* Is sound output OK */
19: bool bSoundInputWorking = false; /* Is sound input OK */
20: volatile bool bPlayingBuffer = false; /* Is playing buffer? */
21: volatile bool bRecordingBuffer = false; /* Is recording buffer? */
22:
23:
24: /*-----------------------------------------------------------------------*/
25: /**
26: * SDL audio callback functions - move sound between emulation and audio system.
27: * Note: These functions will run in a separate thread.
28: */
29: static void Audio_Output_CallBack(void *userdata, Uint8 *stream, int len)
30: {
31: //printf("AUDIO CALLBACK, size = %i\n",len);
32: sndout_queue_poll(stream, len);
33: }
34:
35: static void Audio_Input_CallBack(void *userdata, Uint8 *stream, int len)
36: {
37: /* FIXME: send data to emulator */
38: }
39:
40:
41: /*-----------------------------------------------------------------------*/
42: /**
43: * Initialize the audio subsystem. Return true if all OK.
44: */
45: void Audio_Output_Init(void)
46: {
47: SDL_AudioSpec request; /* We fill in the desired SDL audio options here */
48: SDL_AudioSpec granted;
49:
50: /* Init the SDL's audio subsystem: */
51: if (SDL_WasInit(SDL_INIT_AUDIO) == 0)
52: {
53: if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
54: {
55: Log_Printf(LOG_WARN, "Could not init audio output: %s\n", SDL_GetError());
56: DlgAlert_Notice("Error: Can't open SDL audio subsystem.");
57: bSoundOutputWorking = false;
58: return;
59: }
60: }
61:
62: /* Set up SDL audio: */
63: request.freq = 44100; /* 44,1 kHz */
64: request.format = AUDIO_S16MSB; /* 16-Bit signed, big endian */
65: request.channels = 2; /* stereo */
66: request.callback = Audio_Output_CallBack;
67: request.userdata = NULL;
68: request.samples = 1024; /* buffer size in samples (4096 byte) */
69:
70: Audio_Output_Device = SDL_OpenAudioDevice(NULL, 0, &request, &granted, 0);
71: if (Audio_Output_Device==0) /* Open audio device */
72: {
73: Log_Printf(LOG_WARN, "Can't use audio: %s\n", SDL_GetError());
74: DlgAlert_Notice("Error: Can't open audio output device. No sound output.");
75: bSoundOutputWorking = false;
76: return;
77: }
78:
79: /* All OK */
80: bSoundOutputWorking = true;
81: }
82:
83: void Audio_Input_Init(void)
84: {
85: SDL_AudioSpec request; /* We fill in the desired SDL audio options here */
86: SDL_AudioSpec granted;
87:
88: /* Init the SDL's audio subsystem: */
89: if (SDL_WasInit(SDL_INIT_AUDIO) == 0)
90: {
91: if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
92: {
93: Log_Printf(LOG_WARN, "Could not init audio input: %s\n", SDL_GetError());
94: DlgAlert_Notice("Error: Can't open SDL audio subsystem.");
95: bSoundInputWorking = false;
96: return;
97: }
98: }
99:
100: /* Set up SDL audio: */
101: request.freq = 8000;
102: request.format = AUDIO_S16MSB; /* 16-Bit signed, big endian */
103: request.channels = 1; /* mono */
104: request.callback = Audio_Input_CallBack;
105: request.userdata = NULL;
106: request.samples = 1024; /* buffer size in samples (2048 byte) */
107:
108: Audio_Input_Device = SDL_OpenAudioDevice(NULL, 0, &request, &granted, 0);
109: if (Audio_Input_Device==0) /* Open audio device */
110: {
111: Log_Printf(LOG_WARN, "Can't use audio: %s\n", SDL_GetError());
112: DlgAlert_Notice("Error: Can't open audio input device. No sound recording.");
113: bSoundInputWorking = false;
114: return;
115: }
116:
117: /* All OK */
118: bSoundInputWorking = true;
119: }
120:
121:
122: /*-----------------------------------------------------------------------*/
123: /**
124: * Free audio subsystem
125: */
126: void Audio_Output_UnInit(void)
127: {
128: if (bSoundOutputWorking)
129: {
130: /* Stop */
131: Audio_Output_Enable(false);
132:
133: SDL_CloseAudioDevice(Audio_Output_Device);
134:
135: bSoundOutputWorking = false;
136: }
137: }
138:
139: void Audio_Input_UnInit(void)
140: {
141: if (bSoundInputWorking)
142: {
143: /* Stop */
144: Audio_Input_Enable(false);
145:
146: SDL_CloseAudioDevice(Audio_Input_Device);
147:
148: bSoundInputWorking = false;
149: }
150: }
151:
152:
153: /*-----------------------------------------------------------------------*/
154: /**
155: * Lock the audio sub system so that the callback function will not be called.
156: */
157: void Audio_Output_Lock(void)
158: {
159: SDL_LockAudioDevice(Audio_Output_Device);
160: }
161:
162: void Audio_Input_Lock(void)
163: {
164: SDL_LockAudioDevice(Audio_Input_Device);
165: }
166:
167:
168: /*-----------------------------------------------------------------------*/
169: /**
170: * Unlock the audio sub system so that the callback function will be called again.
171: */
172: void Audio_Output_Unlock(void)
173: {
174: SDL_UnlockAudioDevice(Audio_Output_Device);
175: }
176:
177: void Audio_Input_Unlock(void)
178: {
179: SDL_UnlockAudioDevice(Audio_Input_Device);
180: }
181:
182:
183: /*-----------------------------------------------------------------------*/
184: /**
185: * Set audio playback frequency variable, pass as PLAYBACK_xxxx
186: */
187: void Audio_Output_SetFreq(int nNewFrequency)
188: {
189: /* Do not reset sound system if nothing has changed! */
190: if (nNewFrequency != nAudioFrequency)
191: {
192: Log_Printf(LOG_WARN, "[SDL Audio] Changing frequency from %i Hz to %i Hz",
193: nAudioFrequency,nNewFrequency);
194: /* Set new frequency */
195: nAudioFrequency = nNewFrequency;
196:
197: /* Re-open SDL audio interface if necessary: */
198: if (bSoundOutputWorking)
199: {
200: Audio_Output_UnInit();
201: Audio_Output_Init();
202: }
203: }
204: }
205:
206:
207: /*-----------------------------------------------------------------------*/
208: /**
209: * Start/Stop sound buffer
210: */
211: void Audio_Output_Enable(bool bEnable)
212: {
213: if (bEnable && !bPlayingBuffer)
214: {
215: /* Start playing */
216: SDL_PauseAudioDevice(Audio_Output_Device, false);
217: bPlayingBuffer = true;
218: }
219: else if (!bEnable && bPlayingBuffer)
220: {
221: /* Stop from playing */
222: SDL_PauseAudioDevice(Audio_Output_Device, true);
223: bPlayingBuffer = false;
224: }
225: }
226:
227: void Audio_Input_Enable(bool bEnable)
228: {
229: if (bEnable && !bRecordingBuffer)
230: {
231: /* Start playing */
232: SDL_PauseAudioDevice(Audio_Input_Device, false);
233: bRecordingBuffer = true;
234: }
235: else if (!bEnable && bPlayingBuffer)
236: {
237: /* Stop from playing */
238: SDL_PauseAudioDevice(Audio_Input_Device, true);
239: bRecordingBuffer = false;
240: }
241: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.