1 /*
2 * UAE - The Un*x Amiga Emulator
3 *
4 * Support for Linux/USS sound
5 *
6 * Copyright 1997 Bernd Schmidt
7 */
8
9 #define SOUNDSTUFF 1
10
11 extern int sound_fd;
12 extern uae_u16 paula_sndbuffer[];
13 extern uae_u16 *paula_sndbufpt;
14 extern int paula_sndbufsize;
15
16 struct sound_data
17 {
18 int waiting_for_buffer;
19 int devicetype;
20 int obtainedfreq;
21 int paused;
22 int mute;
23 int channels;
24 int freq;
25 int samplesize;
26 int paula_sndbufsize;
27 void *data;
28 };
29
check_sound_buffers(void)30 STATIC_INLINE void check_sound_buffers (void)
31 {
32 #if SOUNDSTUFF > 1
33 int len;
34 #endif
35
36 if (currprefs.sound_stereo == SND_4CH_CLONEDSTEREO) {
37 ((uae_u16*)paula_sndbufpt)[0] = ((uae_u16*)paula_sndbufpt)[-2];
38 ((uae_u16*)paula_sndbufpt)[1] = ((uae_u16*)paula_sndbufpt)[-1];
39 paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 2 * 2);
40 } else if (currprefs.sound_stereo == SND_6CH_CLONEDSTEREO) {
41 uae_s16 *p = ((uae_s16*)paula_sndbufpt);
42 uae_s32 sum;
43 p[2] = p[-2];
44 p[3] = p[-1];
45 sum = (uae_s32)(p[-2]) + (uae_s32)(p[-1]) + (uae_s32)(p[2]) + (uae_s32)(p[3]);
46 p[0] = sum / 8;
47 p[1] = sum / 8;
48 paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 4 * 2);
49 }
50 #if SOUNDSTUFF > 1
51 if (outputsample == 0)
52 return;
53 len = paula_sndbufpt - paula_sndbufpt_start;
54 if (outputsample < 0) {
55 int i;
56 uae_s16 *p1 = (uae_s16*)paula_sndbufpt_prev;
57 uae_s16 *p2 = (uae_s16*)paula_sndbufpt_start;
58 for (i = 0; i < len; i++) {
59 *p1 = (*p1 + *p2) / 2;
60 }
61 paula_sndbufpt = paula_sndbufpt_start;
62 }
63 #endif
64 if ((uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer >= paula_sndbufsize) {
65 int size = (char *)paula_sndbufpt - (char *)paula_sndbuffer;
66 finish_sound_buffer ();
67 write (sound_fd, paula_sndbuffer, size);
68 paula_sndbufpt = paula_sndbuffer;
69 }
70 #if SOUNDSTUFF > 1
71 while (doublesample-- > 0) {
72 memcpy (paula_sndbufpt, paula_sndbufpt_start, len * 2);
73 paula_sndbufpt += len;
74 if ((uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer >= paula_sndbufsize) {
75 finish_sound_buffer ();
76 paula_sndbufpt = paula_sndbuffer;
77 }
78 }
79 #endif
80 }
81
clear_sound_buffers(void)82 STATIC_INLINE void clear_sound_buffers (void)
83 {
84 memset (paula_sndbuffer, 0, paula_sndbufsize);
85 paula_sndbufpt = paula_sndbuffer;
86 }
87
set_sound_buffers(void)88 STATIC_INLINE void set_sound_buffers (void)
89 {
90 }
91
92 #define AUDIO_NAME "oss"
93
94 #define PUT_SOUND_WORD(b) do { *(uae_u16 *)paula_sndbufpt = b; paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 2); } while (0)
95 #define PUT_SOUND_WORD_LEFT(b) do { if (currprefs.sound_filter) b = filter (b, &sound_filter_state[0]); PUT_SOUND_WORD(b); } while (0)
96 #define PUT_SOUND_WORD_RIGHT(b) do { if (currprefs.sound_filter) b = filter (b, &sound_filter_state[1]); PUT_SOUND_WORD(b); } while (0)
97 #define PUT_SOUND_WORD_LEFT2(b) do { if (currprefs.sound_filter) b = filter (b, &sound_filter_state[2]); PUT_SOUND_WORD(b); } while (0)
98 #define PUT_SOUND_WORD_RIGHT2(b) do { if (currprefs.sound_filter) b = filter (b, &sound_filter_state[3]); PUT_SOUND_WORD(b); } while (0)
99
100 #define PUT_SOUND_WORD_MONO(b) PUT_SOUND_WORD_LEFT(b)
101 #define SOUND16_BASE_VAL 0
102 #define SOUND8_BASE_VAL 128
103
104 #define DEFAULT_SOUND_MAXB 16384
105 #define DEFAULT_SOUND_MINB 16384
106 #define DEFAULT_SOUND_BITS 16
107 #define DEFAULT_SOUND_FREQ 44100
108 #define HAVE_STEREO_SUPPORT
109
110 #define FILTER_SOUND_OFF 0
111 #define FILTER_SOUND_EMUL 1
112 #define FILTER_SOUND_ON 2
113
114 #define FILTER_SOUND_TYPE_A500 0
115 #define FILTER_SOUND_TYPE_A1200 1
116