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