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