• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * QEMU Audio subsystem header
3   *
4   * Copyright (c) 2003-2005 Vassili Karpov (malc)
5   *
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  
27  #include "audio/audio.h"
28  
29  #ifdef CONFIG_COREAUDIO
30  #define FLOAT_MIXENG
31  /* #define RECIPROCAL */
32  #endif
33  #include "mixeng.h"
34  
35  struct audio_pcm_ops;
36  
37  typedef enum {
38      AUD_OPT_INT,
39      AUD_OPT_FMT,
40      AUD_OPT_STR,
41      AUD_OPT_BOOL
42  } audio_option_tag_e;
43  
44  struct audio_option {
45      const char *name;
46      audio_option_tag_e tag;
47      void *valp;
48      const char *descr;
49      int *overriddenp;
50      int overridden;
51  };
52  
53  struct audio_callback {
54      void *opaque;
55      audio_callback_fn fn;
56  };
57  
58  struct audio_pcm_info {
59      int bits;
60      int sign;
61      int freq;
62      int nchannels;
63      int align;
64      int shift;
65      int bytes_per_second;
66      int swap_endianness;
67  };
68  
69  typedef struct SWVoiceCap SWVoiceCap;
70  
71  typedef struct HWVoiceOut {
72      int enabled;
73      int poll_mode;
74      int pending_disable;
75      struct audio_pcm_info info;
76  
77      f_sample *clip;
78  
79      int rpos;
80      uint64_t ts_helper;
81  
82      struct st_sample *mix_buf;
83  
84      int samples;
85      QLIST_HEAD (sw_out_listhead, SWVoiceOut) sw_head;
86      QLIST_HEAD (sw_cap_listhead, SWVoiceCap) cap_head;
87      struct audio_pcm_ops *pcm_ops;
88      QLIST_ENTRY (HWVoiceOut) entries;
89  } HWVoiceOut;
90  
91  typedef struct HWVoiceIn {
92      int enabled;
93      int poll_mode;
94      struct audio_pcm_info info;
95  
96      t_sample *conv;
97  
98      int wpos;
99      int total_samples_captured;
100      uint64_t ts_helper;
101  
102      struct st_sample *conv_buf;
103  
104      int samples;
105      QLIST_HEAD (sw_in_listhead, SWVoiceIn) sw_head;
106      struct audio_pcm_ops *pcm_ops;
107      QLIST_ENTRY (HWVoiceIn) entries;
108  } HWVoiceIn;
109  
110  struct SWVoiceOut {
111      QEMUSoundCard *card;
112      struct audio_pcm_info info;
113      t_sample *conv;
114      int64_t ratio;
115      struct st_sample *buf;
116      void *rate;
117      int total_hw_samples_mixed;
118      int active;
119      int empty;
120      HWVoiceOut *hw;
121      char *name;
122      struct mixeng_volume vol;
123      struct audio_callback callback;
124      QLIST_ENTRY (SWVoiceOut) entries;
125  };
126  
127  struct SWVoiceIn {
128      QEMUSoundCard *card;
129      int active;
130      struct audio_pcm_info info;
131      int64_t ratio;
132      void *rate;
133      int total_hw_samples_acquired;
134      struct st_sample *buf;
135      f_sample *clip;
136      HWVoiceIn *hw;
137      char *name;
138      struct mixeng_volume vol;
139      struct audio_callback callback;
140      QLIST_ENTRY (SWVoiceIn) entries;
141  };
142  
143  struct audio_driver {
144      const char *name;
145      const char *descr;
146      struct audio_option *options;
147      void *(*init) (void);
148      void (*fini) (void *);
149      struct audio_pcm_ops *pcm_ops;
150      int can_be_default;
151      int max_voices_out;
152      int max_voices_in;
153      int voice_size_out;
154      int voice_size_in;
155  };
156  
157  struct audio_pcm_ops {
158      int  (*init_out)(HWVoiceOut *hw, struct audsettings *as);
159      void (*fini_out)(HWVoiceOut *hw);
160      int  (*run_out) (HWVoiceOut *hw, int live);
161      int  (*write)   (SWVoiceOut *sw, void *buf, int size);
162      int  (*ctl_out) (HWVoiceOut *hw, int cmd, ...);
163  
164      int  (*init_in) (HWVoiceIn *hw, struct audsettings *as);
165      void (*fini_in) (HWVoiceIn *hw);
166      int  (*run_in)  (HWVoiceIn *hw);
167      int  (*read)    (SWVoiceIn *sw, void *buf, int size);
168      int  (*ctl_in)  (HWVoiceIn *hw, int cmd, ...);
169  };
170  
171  struct capture_callback {
172      struct audio_capture_ops ops;
173      void *opaque;
174      QLIST_ENTRY (capture_callback) entries;
175  };
176  
177  struct CaptureVoiceOut {
178      HWVoiceOut hw;
179      void *buf;
180      QLIST_HEAD (cb_listhead, capture_callback) cb_head;
181      QLIST_ENTRY (CaptureVoiceOut) entries;
182  };
183  
184  struct SWVoiceCap {
185      SWVoiceOut sw;
186      CaptureVoiceOut *cap;
187      QLIST_ENTRY (SWVoiceCap) entries;
188  };
189  
190  struct AudioState {
191      struct audio_driver *drv;
192      void *drv_opaque;
193  
194      QEMUTimer *ts;
195      QLIST_HEAD (card_listhead, QEMUSoundCard) card_head;
196      QLIST_HEAD (hw_in_listhead, HWVoiceIn) hw_head_in;
197      QLIST_HEAD (hw_out_listhead, HWVoiceOut) hw_head_out;
198      QLIST_HEAD (cap_listhead, CaptureVoiceOut) cap_head;
199      int nb_hw_voices_out;
200      int nb_hw_voices_in;
201      int vm_running;
202  };
203  
204  extern struct audio_driver no_audio_driver;
205  extern struct audio_driver oss_audio_driver;
206  extern struct audio_driver sdl_audio_driver;
207  extern struct audio_driver win_audio_driver;
208  extern struct audio_driver wav_audio_driver;
209  extern struct audio_driver fmod_audio_driver;
210  extern struct audio_driver alsa_audio_driver;
211  extern struct audio_driver coreaudio_audio_driver;
212  extern struct audio_driver dsound_audio_driver;
213  extern struct audio_driver esd_audio_driver;
214  extern struct audio_driver pa_audio_driver;
215  extern struct audio_driver winwave_audio_driver;
216  extern struct mixeng_volume nominal_volume;
217  
218  void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as);
219  void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len);
220  
221  int  audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int len);
222  int  audio_pcm_hw_get_live_in (HWVoiceIn *hw);
223  
224  int  audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int len);
225  
226  int audio_pcm_hw_clip_out (HWVoiceOut *hw, void *pcm_buf,
227                             int live, int pending);
228  
229  int audio_bug (const char *funcname, int cond);
230  void *audio_calloc (const char *funcname, int nmemb, size_t size);
231  
232  void audio_run (const char *msg);
233  
234  #define VOICE_ENABLE 1
235  #define VOICE_DISABLE 2
236  
audio_ring_dist(int dst,int src,int len)237  static inline int audio_ring_dist (int dst, int src, int len)
238  {
239      return (dst >= src) ? (dst - src) : (len - src + dst);
240  }
241  
242  #if defined __GNUC__
243  #define INIT_FIELD(f) . f
244  #else
245  #define INIT_FIELD(f) /**/
246  #endif
247  
dolog(const char * fmt,...)248  static void GCC_ATTR dolog (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  
257  #ifdef DEBUG
ldebug(const char * fmt,...)258  static void GCC_ATTR ldebug (const char *fmt, ...)
259  {
260      va_list ap;
261  
262      va_start (ap, fmt);
263      AUD_vlog (AUDIO_CAP, fmt, ap);
264      va_end (ap);
265  }
266  #else
267  #if defined NDEBUG && defined __GNUC__
268  #define ldebug(...)
269  #elif defined NDEBUG && defined _MSC_VER
270  #define ldebug __noop
271  #else
ldebug(const char * fmt,...)272  static void GCC_ATTR ldebug (const char *fmt, ...)
273  {
274      (void) fmt;
275  }
276  #endif
277  #endif
278  
279  #undef GCC_ATTR
280  
281  #define AUDIO_STRINGIFY_(n) #n
282  #define AUDIO_STRINGIFY(n) AUDIO_STRINGIFY_(n)
283  
284  #if defined _MSC_VER || defined __GNUC__
285  #define AUDIO_FUNC __FUNCTION__
286  #else
287  #define AUDIO_FUNC __FILE__ ":" AUDIO_STRINGIFY (__LINE__)
288  #endif
289  
290  #endif /* audio_int.h */
291