1 /*
2  * UAE - The Un*x Amiga Emulator
3  *
4  * Sound emulation stuff
5  *
6  * Copyright 1995, 1996, 1997 Bernd Schmidt
7  */
8 
9 #ifndef UAE_AUDIO_H
10 #define UAE_AUDIO_H
11 
12 #include "uae/types.h"
13 #ifdef FSUAE
14 #include "uae/inline.h"
15 #endif
16 
17 #ifdef FSUAE
18 // FIXME: changed PERIOD_MAX from ULONG_MAX
19 #define PERIOD_MAX UINT_MAX
20 #else
21 #define PERIOD_MAX ULONG_MAX
22 #endif
23 #define MAX_EV ~0u
24 
25 void aud0_handler (void);
26 void aud1_handler (void);
27 void aud2_handler (void);
28 void aud3_handler (void);
29 
30 void AUDxDAT (int nr, uae_u16 value);
31 void AUDxDAT (int nr, uae_u16 value, uaecptr addr);
32 void AUDxVOL (int nr, uae_u16 value);
33 void AUDxPER (int nr, uae_u16 value);
34 void AUDxLCH (int nr, uae_u16 value);
35 void AUDxLCL (int nr, uae_u16 value);
36 void AUDxLEN (int nr, uae_u16 value);
37 
38 uae_u16 audio_dmal (void);
39 void audio_state_machine (void);
40 uaecptr audio_getpt (int nr, bool reset);
41 int init_audio (void);
42 void ahi_install (void);
43 void audio_reset (void);
44 void update_audio (void);
45 void audio_evhandler (void);
46 void audio_hsync (void);
47 void audio_update_adkmasks (void);
48 void update_sound (double clk);
49 void update_cda_sound (double clk);
50 void led_filter_audio (void);
51 void set_audio (void);
52 int audio_activate (void);
53 void audio_deactivate (void);
54 void audio_vsync (void);
55 void audio_sampleripper(int);
56 void write_wavheader (struct zfile *wavfile, uae_u32 size, uae_u32 freq);
57 
58 extern int sampleripper_enabled;
59 
60 extern void audio_update_sndboard(unsigned int);
61 extern void audio_enable_sndboard(bool);
62 extern void audio_state_sndboard(int);
63 extern void audio_state_sndboard_state(int, int, unsigned int);
64 
65 typedef void (*CDA_CALLBACK)(int);
66 extern void audio_cda_new_buffer(uae_s16 *buffer, int length, int userdata, CDA_CALLBACK next_cd_audio_buffer_callback);
67 extern void audio_cda_volume(int left, int right);
68 
69 extern int sound_cd_volume[2];
70 extern int sound_paula_volume[2];
71 
72 #define AUDIO_CHANNELS_PAULA 4
73 #define AUDIO_CHANNELS_MAX 8
74 #define AUDIO_CHANNEL_SNDBOARD_LEFT 4
75 #define AUDIO_CHANNEL_SNDBOARD_RIGHT 5
76 #define AUDIO_CHANNEL_CDA_LEFT 6
77 #define AUDIO_CHANNEL_CDA_RIGHT 7
78 
79 enum {
80 	SND_MONO,
81 	SND_STEREO,
82 	SND_4CH_CLONEDSTEREO,
83 	SND_4CH,
84 	SND_6CH_CLONEDSTEREO,
85 	SND_6CH,
86 	SND_NONE
87 };
88 
get_audio_stereomode(int channels)89 static inline int get_audio_stereomode (int channels)
90 {
91 	switch (channels)
92 	{
93 	case 1:
94 		return SND_MONO;
95 	case 2:
96 		return SND_STEREO;
97 	case 4:
98 		return SND_4CH;
99 	case 6:
100 		return SND_6CH;
101 	}
102 	return SND_STEREO;
103 }
104 
get_audio_nativechannels(int stereomode)105 STATIC_INLINE int get_audio_nativechannels (int stereomode)
106 {
107 	int ch[] = { 1, 2, 4, 4, 6, 6, 0 };
108 	return ch[stereomode];
109 }
110 
get_audio_amigachannels(int stereomode)111 STATIC_INLINE int get_audio_amigachannels (int stereomode)
112 {
113 	int ch[] = { 1, 2, 2, 4, 2, 4, 0 };
114 	return ch[stereomode];
115 }
116 
get_audio_ismono(int stereomode)117 STATIC_INLINE int get_audio_ismono (int stereomode)
118 {
119 	return stereomode == 0;
120 }
121 
122 #define SOUND_MAX_DELAY_BUFFER 1024
123 #define SOUND_MAX_LOG_DELAY 10
124 #define MIXED_STEREO_MAX 16
125 #define MIXED_STEREO_SCALE 32
126 
127 #endif /* UAE_AUDIO_H */
128