]> git.proxmox.com Git - mirror_qemu.git/blame - audio/audio_int.h
Improve handling of gdb's single-step / continue arguments.
[mirror_qemu.git] / audio / audio_int.h
CommitLineData
fb065187
FB
1/*
2 * QEMU Audio subsystem header
1d14ffa9
FB
3 *
4 * Copyright (c) 2003-2005 Vassili Karpov (malc)
5 *
fb065187
FB
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:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
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.
23 */
24#ifndef QEMU_AUDIO_INT_H
25#define QEMU_AUDIO_INT_H
26
1d14ffa9
FB
27#ifdef CONFIG_COREAUDIO
28#define FLOAT_MIXENG
29/* #define RECIPROCAL */
30#endif
31#include "mixeng.h"
32
1d14ffa9
FB
33struct audio_pcm_ops;
34
35typedef enum {
36 AUD_OPT_INT,
37 AUD_OPT_FMT,
38 AUD_OPT_STR,
39 AUD_OPT_BOOL
40} audio_option_tag_e;
41
42struct audio_option {
43 const char *name;
44 audio_option_tag_e tag;
45 void *valp;
46 const char *descr;
47 int *overridenp;
48 int overriden;
49};
50
51struct audio_callback {
52 void *opaque;
53 audio_callback_fn_t fn;
54};
fb065187 55
1d14ffa9
FB
56struct audio_pcm_info {
57 int bits;
58 int sign;
59 int freq;
60 int nchannels;
61 int align;
62 int shift;
63 int bytes_per_second;
d929eba5 64 int swap_endianness;
1d14ffa9 65};
fb065187 66
ec36b695
FB
67typedef struct SWVoiceCap SWVoiceCap;
68
1d14ffa9 69typedef struct HWVoiceOut {
fb065187
FB
70 int enabled;
71 int pending_disable;
1d14ffa9 72 struct audio_pcm_info info;
fb065187
FB
73
74 f_sample *clip;
fb065187
FB
75
76 int rpos;
1d14ffa9 77 uint64_t ts_helper;
fb065187 78
fb065187
FB
79 st_sample_t *mix_buf;
80
81 int samples;
1d14ffa9 82 LIST_HEAD (sw_out_listhead, SWVoiceOut) sw_head;
ec36b695 83 LIST_HEAD (sw_cap_listhead, SWVoiceCap) cap_head;
1d14ffa9
FB
84 struct audio_pcm_ops *pcm_ops;
85 LIST_ENTRY (HWVoiceOut) entries;
86} HWVoiceOut;
fb065187 87
1d14ffa9
FB
88typedef struct HWVoiceIn {
89 int enabled;
1d14ffa9
FB
90 struct audio_pcm_info info;
91
92 t_sample *conv;
7372f88d 93
1d14ffa9 94 int wpos;
1d14ffa9
FB
95 int total_samples_captured;
96 uint64_t ts_helper;
fb065187 97
1d14ffa9 98 st_sample_t *conv_buf;
fb065187 99
1d14ffa9
FB
100 int samples;
101 LIST_HEAD (sw_in_listhead, SWVoiceIn) sw_head;
102 struct audio_pcm_ops *pcm_ops;
103 LIST_ENTRY (HWVoiceIn) entries;
104} HWVoiceIn;
fb065187 105
1d14ffa9
FB
106struct SWVoiceOut {
107 struct audio_pcm_info info;
fb065187 108 t_sample *conv;
fb065187
FB
109 int64_t ratio;
110 st_sample_t *buf;
111 void *rate;
1d14ffa9
FB
112 int total_hw_samples_mixed;
113 int active;
114 int empty;
115 HWVoiceOut *hw;
116 char *name;
117 volume_t vol;
118 struct audio_callback callback;
119 LIST_ENTRY (SWVoiceOut) entries;
120};
fb065187 121
1d14ffa9 122struct SWVoiceIn {
fb065187 123 int active;
1d14ffa9
FB
124 struct audio_pcm_info info;
125 int64_t ratio;
126 void *rate;
127 int total_hw_samples_acquired;
571ec3d6 128 st_sample_t *buf;
1d14ffa9
FB
129 f_sample *clip;
130 HWVoiceIn *hw;
fb065187 131 char *name;
1d14ffa9
FB
132 volume_t vol;
133 struct audio_callback callback;
134 LIST_ENTRY (SWVoiceIn) entries;
fb065187
FB
135};
136
c0fe3827
FB
137struct audio_driver {
138 const char *name;
139 const char *descr;
140 struct audio_option *options;
141 void *(*init) (void);
142 void (*fini) (void *);
143 struct audio_pcm_ops *pcm_ops;
144 int can_be_default;
145 int max_voices_out;
146 int max_voices_in;
147 int voice_size_out;
148 int voice_size_in;
149};
150
1d14ffa9 151struct audio_pcm_ops {
c0fe3827 152 int (*init_out)(HWVoiceOut *hw, audsettings_t *as);
1d14ffa9
FB
153 void (*fini_out)(HWVoiceOut *hw);
154 int (*run_out) (HWVoiceOut *hw);
155 int (*write) (SWVoiceOut *sw, void *buf, int size);
156 int (*ctl_out) (HWVoiceOut *hw, int cmd, ...);
157
c0fe3827 158 int (*init_in) (HWVoiceIn *hw, audsettings_t *as);
1d14ffa9
FB
159 void (*fini_in) (HWVoiceIn *hw);
160 int (*run_in) (HWVoiceIn *hw);
161 int (*read) (SWVoiceIn *sw, void *buf, int size);
162 int (*ctl_in) (HWVoiceIn *hw, int cmd, ...);
fb065187
FB
163};
164
8ead62cf
FB
165struct capture_callback {
166 struct audio_capture_ops ops;
167 void *opaque;
168 LIST_ENTRY (capture_callback) entries;
169};
170
ec36b695 171struct CaptureVoiceOut {
8ead62cf
FB
172 HWVoiceOut hw;
173 void *buf;
174 LIST_HEAD (cb_listhead, capture_callback) cb_head;
175 LIST_ENTRY (CaptureVoiceOut) entries;
ec36b695
FB
176};
177
178struct SWVoiceCap {
179 SWVoiceOut sw;
180 CaptureVoiceOut *cap;
181 LIST_ENTRY (SWVoiceCap) entries;
182};
8ead62cf 183
c0fe3827
FB
184struct AudioState {
185 struct audio_driver *drv;
186 void *drv_opaque;
187
188 QEMUTimer *ts;
8ead62cf 189 LIST_HEAD (card_listhead, QEMUSoundCard) card_head;
c0fe3827
FB
190 LIST_HEAD (hw_in_listhead, HWVoiceIn) hw_head_in;
191 LIST_HEAD (hw_out_listhead, HWVoiceOut) hw_head_out;
8ead62cf 192 LIST_HEAD (cap_listhead, CaptureVoiceOut) cap_head;
c0fe3827
FB
193 int nb_hw_voices_out;
194 int nb_hw_voices_in;
195};
196
197extern struct audio_driver no_audio_driver;
198extern struct audio_driver oss_audio_driver;
199extern struct audio_driver sdl_audio_driver;
200extern struct audio_driver wav_audio_driver;
201extern struct audio_driver fmod_audio_driver;
202extern struct audio_driver alsa_audio_driver;
203extern struct audio_driver coreaudio_audio_driver;
204extern struct audio_driver dsound_audio_driver;
205extern volume_t nominal_volume;
206
d929eba5 207void audio_pcm_init_info (struct audio_pcm_info *info, audsettings_t *as);
1d14ffa9
FB
208void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len);
209
210int audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int len);
211int audio_pcm_hw_get_live_in (HWVoiceIn *hw);
212
213int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int len);
214int audio_pcm_hw_get_live_out (HWVoiceOut *hw);
215int audio_pcm_hw_get_live_out2 (HWVoiceOut *hw, int *nb_live);
fb065187 216
c0fe3827
FB
217int audio_bug (const char *funcname, int cond);
218void *audio_calloc (const char *funcname, int nmemb, size_t size);
219
fb065187
FB
220#define VOICE_ENABLE 1
221#define VOICE_DISABLE 2
222
1d14ffa9
FB
223static inline int audio_ring_dist (int dst, int src, int len)
224{
225 return (dst >= src) ? (dst - src) : (len - src + dst);
226}
227
1d14ffa9
FB
228#if defined __GNUC__
229#define GCC_ATTR __attribute__ ((__unused__, __format__ (__printf__, 1, 2)))
230#define INIT_FIELD(f) . f
4787c71d 231#define GCC_FMT_ATTR(n, m) __attribute__ ((__format__ (__printf__, n, m)))
1d14ffa9
FB
232#else
233#define GCC_ATTR /**/
234#define INIT_FIELD(f) /**/
235#define GCC_FMT_ATTR(n, m)
236#endif
237
238static void GCC_ATTR dolog (const char *fmt, ...)
239{
240 va_list ap;
241
242 va_start (ap, fmt);
243 AUD_vlog (AUDIO_CAP, fmt, ap);
244 va_end (ap);
245}
246
247#ifdef DEBUG
248static void GCC_ATTR ldebug (const char *fmt, ...)
249{
250 va_list ap;
251
252 va_start (ap, fmt);
253 AUD_vlog (AUDIO_CAP, fmt, ap);
254 va_end (ap);
255}
256#else
257#if defined NDEBUG && defined __GNUC__
258#define ldebug(...)
259#elif defined NDEBUG && defined _MSC_VER
260#define ldebug __noop
261#else
262static void GCC_ATTR ldebug (const char *fmt, ...)
263{
264 (void) fmt;
265}
266#endif
267#endif
268
269#undef GCC_ATTR
270
271#define AUDIO_STRINGIFY_(n) #n
272#define AUDIO_STRINGIFY(n) AUDIO_STRINGIFY_(n)
273
274#if defined _MSC_VER || defined __GNUC__
275#define AUDIO_FUNC __FUNCTION__
276#else
277#define AUDIO_FUNC __FILE__ ":" AUDIO_STRINGIFY (__LINE__)
278#endif
279
fb065187 280#endif /* audio_int.h */