|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Support for DOS
5: *
1.1.1.2 root 6: * Copyright 1997, 1998 Gustavo Goedert
1.1 root 7: */
8:
1.1.1.3 root 9: /****** This file is broken. The sample handlers have to go. ******/
10:
1.1 root 11: #include "sysconfig.h"
12: #include "sysdeps.h"
13:
14: #include "config.h"
15: #include "options.h"
16: #include "memory.h"
17: #include "custom.h"
18: #include "audio.h"
19: #include "gensound.h"
20: #include "sounddep/sound.h"
21: #include "events.h"
22:
23: #include <go32.h>
24: #include <sys/farptr.h>
25: #include <time.h>
26:
27: #include "sound/sb.h"
1.1.1.2 root 28:
29: typedef uae_s8 sample8_t;
30: #define DO_CHANNEL_1(v, c) do { (v) *= audio_channel[c].vol; } while (0)
31: #define SBASEVAL8(logn) ((logn) == 1 ? SOUND8_BASE_VAL << 7 : SOUND8_BASE_VAL << 8)
32: #define SBASEVAL16(logn) ((logn) == 1 ? SOUND16_BASE_VAL >> 1 : SOUND16_BASE_VAL)
33: #define FINISH_DATA(b,logn) do { if (14 - (b) + (logn) > 0) data >>= 14 - (b) + (logn); else data <<= (b) - 14 - (logn); } while (0);
1.1 root 34:
35: uae_u16 sndbuffer[44100];
36: uae_u16 *sndbufpt;
37: int sndbufsize;
38: extern int sound_table[256][64];
39: int dspbits;
40:
41: int sound_curfreq;
42:
1.1.1.2 root 43: void (*SND_DirectWrite)(unsigned int size, int freq); // Pointer to function that plays data on card
44: #define SND_DirectWrite SB_DirectWrite
1.1 root 45: volatile int IsPlaying = 0;
46: int CurrentBuffer = 0;
47: unsigned int direct_buffers[2], direct_sndbufpt;
48:
49: void direct_mono_sample16_handler(void);
50: void direct_mono_sample8_handler(void);
51: void direct_stereo_sample16_handler(void);
52: void direct_stereo_sample8_handler(void);
53: void interpol_freq(int new_freq);
54: void direct_check_sound_buffers(void);
55:
56: #define INTERPOL_SIZE 8
57: int freq_buf[INTERPOL_SIZE];
58: int buf_tot, buf_pos=0;
59:
60: inline void interpol_freq(int new_freq) {
61: buf_tot = buf_tot - freq_buf[buf_pos] + new_freq;
62: freq_buf[buf_pos] = new_freq;
63: buf_pos++;
64: if (buf_pos == INTERPOL_SIZE) buf_pos = 0;
65: sound_curfreq = buf_tot/INTERPOL_SIZE;
66: if (sound_curfreq<currprefs.sound_freq) {
67: sound_curfreq |= 0xff;
68: if (sound_curfreq<5512)
69: sound_curfreq = 5512;
70: }
71: if (sound_curfreq>currprefs.sound_freq)
72: sound_curfreq = currprefs.sound_freq;
73: }
74:
75: unsigned int sound_bytes = 0, last_clock = 0;
76:
77: inline void direct_check_sound_buffers(void) {
78: int played_size = direct_sndbufpt - direct_buffers[CurrentBuffer];
79:
80: sound_bytes++;
81: if ((!IsPlaying) && played_size >= currprefs.sound_minbsiz) {
82: SND_DirectWrite(played_size, sound_curfreq);
83: if (currprefs.sound_adjust) {
84: unsigned int cur_clock, new_freq;
85:
86: if (last_clock == 0)
87: last_clock = uclock();
88: else {
89: cur_clock = uclock();
90: new_freq = (unsigned long long) sound_bytes * UCLOCKS_PER_SEC / (cur_clock-last_clock);
91: interpol_freq(new_freq);
92: last_clock = cur_clock;
93: }
94: sound_bytes = 0;
95: }
96: CurrentBuffer = !CurrentBuffer;
97: direct_sndbufpt = direct_buffers[CurrentBuffer];
98: } else if (played_size >= currprefs.sound_maxbsiz) {
99: if (currprefs.sound_adjust)
100: interpol_freq(currprefs.sound_freq);
101: while(IsPlaying);
102: SND_DirectWrite(currprefs.sound_maxbsiz, sound_curfreq);
103: CurrentBuffer = !CurrentBuffer;
104: direct_sndbufpt = direct_buffers[CurrentBuffer];
105: last_clock=0;
106: }
107: }
108:
109: void direct_mono_sample16_handler(void)
110: {
1.1.1.2 root 111: uae_u32 data0 = audio_channel[0].current_sample;
112: uae_u32 data1 = audio_channel[1].current_sample;
113: uae_u32 data2 = audio_channel[2].current_sample;
114: uae_u32 data3 = audio_channel[3].current_sample;
115: DO_CHANNEL_1 (data0, 0);
116: DO_CHANNEL_1 (data1, 1);
117: DO_CHANNEL_1 (data2, 2);
118: DO_CHANNEL_1 (data3, 3);
119: data0 &= audio_channel[0].adk_mask;
120: data1 &= audio_channel[1].adk_mask;
121: data2 &= audio_channel[2].adk_mask;
122: data3 &= audio_channel[3].adk_mask;
123: data0 += data1;
124: data0 += data2;
125: data0 += data3;
126: {
127: uae_u32 data = SBASEVAL16(2) + data0;
128: FINISH_DATA(16, 2);
129: _farnspokew(direct_sndbufpt, data);
130: direct_sndbufpt += 2;
131: }
132:
133: direct_check_sound_buffers();
1.1 root 134:
135: eventtab[ev_sample].evtime = cycles + sample_evtime;
136: eventtab[ev_sample].oldcycles = cycles;
137: }
138:
139: void direct_mono_sample8_handler(void)
140: {
1.1.1.2 root 141: uae_u32 data0 = audio_channel[0].current_sample;
142: uae_u32 data1 = audio_channel[1].current_sample;
143: uae_u32 data2 = audio_channel[2].current_sample;
144: uae_u32 data3 = audio_channel[3].current_sample;
145: DO_CHANNEL_1 (data0, 0);
146: DO_CHANNEL_1 (data1, 1);
147: DO_CHANNEL_1 (data2, 2);
148: DO_CHANNEL_1 (data3, 3);
149: data0 &= audio_channel[0].adk_mask;
150: data1 &= audio_channel[1].adk_mask;
151: data2 &= audio_channel[2].adk_mask;
152: data3 &= audio_channel[3].adk_mask;
153: data0 += data1;
154: data0 += data2;
155: data0 += data3;
156: {
157: uae_u32 data = SBASEVAL8(2) + data0;
158: FINISH_DATA(8, 2);
159: _farnspokeb(direct_sndbufpt++, data);
160: }
1.1 root 161:
162: direct_check_sound_buffers();
163:
164: eventtab[ev_sample].evtime = cycles + sample_evtime;
165: eventtab[ev_sample].oldcycles = cycles;
166: }
167:
1.1.1.2 root 168: void direct_stereo_sample16_handler(void)
1.1 root 169: {
1.1.1.2 root 170: uae_u32 data0 = audio_channel[0].current_sample;
171: uae_u32 data1 = audio_channel[1].current_sample;
172: uae_u32 data2 = audio_channel[2].current_sample;
173: uae_u32 data3 = audio_channel[3].current_sample;
174: DO_CHANNEL_1 (data0, 0);
175: DO_CHANNEL_1 (data1, 1);
176: DO_CHANNEL_1 (data2, 2);
177: DO_CHANNEL_1 (data3, 3);
178:
179: data0 &= audio_channel[0].adk_mask;
180: data1 &= audio_channel[1].adk_mask;
181: data2 &= audio_channel[2].adk_mask;
182: data3 &= audio_channel[3].adk_mask;
183:
184: data0 += data3;
185: {
186: uae_u32 data = SBASEVAL16(1) + data0;
187: FINISH_DATA (16, 1);
188: _farnspokew(direct_sndbufpt, data);
189: direct_sndbufpt += 2;
190: }
1.1 root 191:
1.1.1.2 root 192: data1 += data2;
193: {
194: uae_u32 data = SBASEVAL16(1) + data1;
195: FINISH_DATA (16, 1);
196: _farnspokew(direct_sndbufpt, data);
197: direct_sndbufpt += 2;
198: }
1.1 root 199:
200: direct_check_sound_buffers();
201:
202: eventtab[ev_sample].evtime = cycles + sample_evtime;
203: eventtab[ev_sample].oldcycles = cycles;
204: }
205:
1.1.1.2 root 206: void direct_stereo_sample8_handler(void)
1.1 root 207: {
1.1.1.2 root 208: uae_u32 data0 = audio_channel[0].current_sample;
209: uae_u32 data1 = audio_channel[1].current_sample;
210: uae_u32 data2 = audio_channel[2].current_sample;
211: uae_u32 data3 = audio_channel[3].current_sample;
212: DO_CHANNEL_1 (data0, 0);
213: DO_CHANNEL_1 (data1, 1);
214: DO_CHANNEL_1 (data2, 2);
215: DO_CHANNEL_1 (data3, 3);
216:
217: data0 &= audio_channel[0].adk_mask;
218: data1 &= audio_channel[1].adk_mask;
219: data2 &= audio_channel[2].adk_mask;
220: data3 &= audio_channel[3].adk_mask;
221:
222: data0 += data3;
223: {
224: uae_u32 data = SBASEVAL8(1) + data0;
225: FINISH_DATA (8, 1);
226: _farnspokeb(direct_sndbufpt++, data);
227: }
228: data1 += data2;
229: {
230: uae_u32 data = SBASEVAL8(1) + data1;
231: FINISH_DATA (8, 1);
232: _farnspokeb(direct_sndbufpt++, data);
233: }
234:
235: direct_check_sound_buffers();
1.1 root 236:
237: eventtab[ev_sample].evtime = cycles + sample_evtime;
238: eventtab[ev_sample].oldcycles = cycles;
239: }
240:
241: int init_sound (void)
242: {
243: int tmp;
244: int rate;
245: int i;
246:
247: if (currprefs.sound_minbsiz > currprefs.sound_maxbsiz) {
248: fprintf(stderr, "Minimum sound buffer size bigger then maximum, exchanging.\n");
249: tmp = currprefs.sound_minbsiz;
250: currprefs.sound_minbsiz = currprefs.sound_maxbsiz;
251: currprefs.sound_maxbsiz = tmp;
252: }
253:
254: dspbits = currprefs.sound_bits;
255: rate = currprefs.sound_freq;
256: sndbufsize = currprefs.sound_maxbsiz;
257:
1.1.1.2 root 258: if (SB_DetectInitSound(&dspbits, &rate, &sndbufsize, direct_buffers, &currprefs.stereo));
1.1 root 259: else if (0/*OTHER_CARD_DETECT_ROUTINE*/);
260: else
261: return 0;
262:
263: currprefs.sound_freq = rate;
264: currprefs.sound_minbsiz = (currprefs.sound_minbsiz>>2)<<2;
265: currprefs.sound_maxbsiz = sndbufsize;
266:
1.1.1.4 ! root 267: sample_evtime = (long)MAXHPOS_PAL * MAXVPOS_PAL * VBLANK_HZ_PAL / rate;
1.1 root 268:
269: if (dspbits == 16) {
270: init_sound_table16 ();
1.1.1.2 root 271: if (currprefs.stereo)
272: eventtab[ev_sample].handler = direct_stereo_sample16_handler;
273: else
274: eventtab[ev_sample].handler = direct_mono_sample16_handler;
1.1 root 275: } else {
276: init_sound_table8 ();
1.1.1.2 root 277: if (currprefs.stereo)
278: eventtab[ev_sample].handler = direct_stereo_sample8_handler;
279: else
280: eventtab[ev_sample].handler = direct_mono_sample8_handler;
1.1 root 281: }
282: printf ("Sound driver found and configured for %d bits at %d Hz, buffer is %d:%d bytes\n",
283: dspbits, rate, currprefs.sound_minbsiz, currprefs.sound_maxbsiz);
284: sndbufpt = sndbuffer;
285: direct_sndbufpt = direct_buffers[0];
286:
287: sound_curfreq = currprefs.sound_freq;
288: for (i=0; i<INTERPOL_SIZE; i++)
289: freq_buf[i] = sound_curfreq;
290: buf_tot = sound_curfreq * INTERPOL_SIZE;
291:
1.1.1.2 root 292: #ifdef FRAME_RATE_HACK
293: vsynctime = vsynctime * 9 / 10;
294: #endif
295:
1.1 root 296: return 1;
297: }
1.1.1.2 root 298:
299: int setup_sound (void)
300: {
301: sound_available = 1;
302: return 1;
303: }
304:
305: void close_sound(void)
306: {
307: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.