audio: unify input and output mixeng buffer management
[qemu/ar7.git] / audio / audio_int.h
blob20021df9e8bedc4bc6624f4ed924069e6eed28c1
1 /*
2 * QEMU Audio subsystem header
4 * Copyright (c) 2003-2005 Vassili Karpov (malc)
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
25 #ifndef QEMU_AUDIO_INT_H
26 #define QEMU_AUDIO_INT_H
28 #ifdef CONFIG_AUDIO_COREAUDIO
29 #define FLOAT_MIXENG
30 /* #define RECIPROCAL */
31 #endif
32 #include "mixeng.h"
34 struct audio_pcm_ops;
36 struct audio_callback {
37 void *opaque;
38 audio_callback_fn fn;
41 struct audio_pcm_info {
42 int bits;
43 int sign;
44 int freq;
45 int nchannels;
46 int align;
47 int shift;
48 int bytes_per_second;
49 int swap_endianness;
52 typedef struct AudioState AudioState;
53 typedef struct SWVoiceCap SWVoiceCap;
55 typedef struct STSampleBuffer {
56 size_t pos, size;
57 st_sample samples[];
58 } STSampleBuffer;
60 typedef struct HWVoiceOut {
61 AudioState *s;
62 int enabled;
63 int poll_mode;
64 int pending_disable;
65 struct audio_pcm_info info;
67 f_sample *clip;
68 uint64_t ts_helper;
70 STSampleBuffer *mix_buf;
71 void *buf_emul;
72 size_t pos_emul, pending_emul, size_emul;
74 size_t samples;
75 QLIST_HEAD (sw_out_listhead, SWVoiceOut) sw_head;
76 QLIST_HEAD (sw_cap_listhead, SWVoiceCap) cap_head;
77 int ctl_caps;
78 struct audio_pcm_ops *pcm_ops;
79 QLIST_ENTRY (HWVoiceOut) entries;
80 } HWVoiceOut;
82 typedef struct HWVoiceIn {
83 AudioState *s;
84 int enabled;
85 int poll_mode;
86 struct audio_pcm_info info;
88 t_sample *conv;
90 size_t total_samples_captured;
91 uint64_t ts_helper;
93 STSampleBuffer *conv_buf;
94 void *buf_emul;
95 size_t pos_emul, pending_emul, size_emul;
97 size_t samples;
98 QLIST_HEAD (sw_in_listhead, SWVoiceIn) sw_head;
99 int ctl_caps;
100 struct audio_pcm_ops *pcm_ops;
101 QLIST_ENTRY (HWVoiceIn) entries;
102 } HWVoiceIn;
104 struct SWVoiceOut {
105 QEMUSoundCard *card;
106 AudioState *s;
107 struct audio_pcm_info info;
108 t_sample *conv;
109 int64_t ratio;
110 struct st_sample *buf;
111 void *rate;
112 size_t total_hw_samples_mixed;
113 int active;
114 int empty;
115 HWVoiceOut *hw;
116 char *name;
117 struct mixeng_volume vol;
118 struct audio_callback callback;
119 QLIST_ENTRY (SWVoiceOut) entries;
122 struct SWVoiceIn {
123 QEMUSoundCard *card;
124 AudioState *s;
125 int active;
126 struct audio_pcm_info info;
127 int64_t ratio;
128 void *rate;
129 size_t total_hw_samples_acquired;
130 struct st_sample *buf;
131 f_sample *clip;
132 HWVoiceIn *hw;
133 char *name;
134 struct mixeng_volume vol;
135 struct audio_callback callback;
136 QLIST_ENTRY (SWVoiceIn) entries;
139 typedef struct audio_driver audio_driver;
140 struct audio_driver {
141 const char *name;
142 const char *descr;
143 void *(*init) (Audiodev *);
144 void (*fini) (void *);
145 struct audio_pcm_ops *pcm_ops;
146 int can_be_default;
147 int max_voices_out;
148 int max_voices_in;
149 int voice_size_out;
150 int voice_size_in;
151 int ctl_caps;
152 QLIST_ENTRY(audio_driver) next;
155 struct audio_pcm_ops {
156 int (*init_out)(HWVoiceOut *hw, audsettings *as, void *drv_opaque);
157 void (*fini_out)(HWVoiceOut *hw);
158 size_t (*write) (HWVoiceOut *hw, void *buf, size_t size);
160 * get a buffer that after later can be passed to put_buffer_out; optional
161 * returns the buffer, and writes it's size to size (in bytes)
162 * this is unrelated to the above buffer_size_out function
164 void *(*get_buffer_out)(HWVoiceOut *hw, size_t *size);
166 * put back the buffer returned by get_buffer_out; optional
167 * buf must be equal the pointer returned by get_buffer_out,
168 * size may be smaller
170 size_t (*put_buffer_out)(HWVoiceOut *hw, void *buf, size_t size);
171 int (*ctl_out) (HWVoiceOut *hw, int cmd, ...);
173 int (*init_in) (HWVoiceIn *hw, audsettings *as, void *drv_opaque);
174 void (*fini_in) (HWVoiceIn *hw);
175 size_t (*read) (HWVoiceIn *hw, void *buf, size_t size);
176 void *(*get_buffer_in)(HWVoiceIn *hw, size_t *size);
177 void (*put_buffer_in)(HWVoiceIn *hw, void *buf, size_t size);
178 int (*ctl_in) (HWVoiceIn *hw, int cmd, ...);
181 void *audio_generic_get_buffer_in(HWVoiceIn *hw, size_t *size);
182 void audio_generic_put_buffer_in(HWVoiceIn *hw, void *buf, size_t size);
183 void *audio_generic_get_buffer_out(HWVoiceOut *hw, size_t *size);
184 size_t audio_generic_put_buffer_out(HWVoiceOut *hw, void *buf, size_t size);
185 size_t audio_generic_put_buffer_out_nowrite(HWVoiceOut *hw, void *buf,
186 size_t size);
187 size_t audio_generic_write(HWVoiceOut *hw, void *buf, size_t size);
188 size_t audio_generic_read(HWVoiceIn *hw, void *buf, size_t size);
190 struct capture_callback {
191 struct audio_capture_ops ops;
192 void *opaque;
193 QLIST_ENTRY (capture_callback) entries;
196 struct CaptureVoiceOut {
197 HWVoiceOut hw;
198 void *buf;
199 QLIST_HEAD (cb_listhead, capture_callback) cb_head;
200 QLIST_ENTRY (CaptureVoiceOut) entries;
203 struct SWVoiceCap {
204 SWVoiceOut sw;
205 CaptureVoiceOut *cap;
206 QLIST_ENTRY (SWVoiceCap) entries;
209 typedef struct AudioState {
210 struct audio_driver *drv;
211 Audiodev *dev;
212 void *drv_opaque;
214 QEMUTimer *ts;
215 QLIST_HEAD (card_listhead, QEMUSoundCard) card_head;
216 QLIST_HEAD (hw_in_listhead, HWVoiceIn) hw_head_in;
217 QLIST_HEAD (hw_out_listhead, HWVoiceOut) hw_head_out;
218 QLIST_HEAD (cap_listhead, CaptureVoiceOut) cap_head;
219 int nb_hw_voices_out;
220 int nb_hw_voices_in;
221 int vm_running;
222 int64_t period_ticks;
224 bool timer_running;
225 uint64_t timer_last;
227 QTAILQ_ENTRY(AudioState) list;
228 } AudioState;
230 extern const struct mixeng_volume nominal_volume;
232 extern const char *audio_prio_list[];
234 void audio_driver_register(audio_driver *drv);
235 audio_driver *audio_driver_lookup(const char *name);
237 void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as);
238 void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len);
240 int audio_bug (const char *funcname, int cond);
241 void *audio_calloc (const char *funcname, int nmemb, size_t size);
243 void audio_run(AudioState *s, const char *msg);
245 #define VOICE_ENABLE 1
246 #define VOICE_DISABLE 2
247 #define VOICE_VOLUME 3
249 #define VOICE_VOLUME_CAP (1 << VOICE_VOLUME)
251 static inline size_t audio_ring_dist(size_t dst, size_t src, size_t len)
253 return (dst >= src) ? (dst - src) : (len - src + dst);
256 #define dolog(fmt, ...) AUD_log(AUDIO_CAP, fmt, ## __VA_ARGS__)
258 #ifdef DEBUG
259 #define ldebug(fmt, ...) AUD_log(AUDIO_CAP, fmt, ## __VA_ARGS__)
260 #else
261 #define ldebug(fmt, ...) (void)0
262 #endif
264 #define AUDIO_STRINGIFY_(n) #n
265 #define AUDIO_STRINGIFY(n) AUDIO_STRINGIFY_(n)
267 typedef struct AudiodevListEntry {
268 Audiodev *dev;
269 QSIMPLEQ_ENTRY(AudiodevListEntry) next;
270 } AudiodevListEntry;
272 typedef QSIMPLEQ_HEAD(, AudiodevListEntry) AudiodevListHead;
273 AudiodevListHead audio_handle_legacy_opts(void);
275 void audio_free_audiodev_list(AudiodevListHead *head);
277 void audio_create_pdos(Audiodev *dev);
278 AudiodevPerDirectionOptions *audio_get_pdo_in(Audiodev *dev);
279 AudiodevPerDirectionOptions *audio_get_pdo_out(Audiodev *dev);
281 #endif /* QEMU_AUDIO_INT_H */