2 * QEMU Audio subsystem header
4 * Copyright (c) 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
26 #define NAME "playback"
27 #define HWBUF hw->mix_buf
32 #define NAME "capture"
36 #define HWBUF hw->conv_buf
39 static void glue (audio_init_nb_voices_
, TYPE
) (struct audio_driver
*drv
)
41 AudioState
*s
= &glob_audio_state
;
42 int max_voices
= glue (drv
->max_voices_
, TYPE
);
43 int voice_size
= glue (drv
->voice_size_
, TYPE
);
45 if (glue (s
->nb_hw_voices_
, TYPE
) > max_voices
) {
48 dolog ("Driver `%s' does not support " NAME
"\n", drv
->name
);
52 dolog ("Driver `%s' does not support %d " NAME
" voices, max %d\n",
54 glue (s
->nb_hw_voices_
, TYPE
),
57 glue (s
->nb_hw_voices_
, TYPE
) = max_voices
;
60 if (audio_bug (AUDIO_FUNC
, !voice_size
&& max_voices
)) {
61 dolog ("drv=`%s' voice_size=0 max_voices=%d\n",
62 drv
->name
, max_voices
);
63 glue (s
->nb_hw_voices_
, TYPE
) = 0;
66 if (audio_bug (AUDIO_FUNC
, voice_size
&& !max_voices
)) {
67 dolog ("drv=`%s' voice_size=%d max_voices=0\n",
68 drv
->name
, voice_size
);
72 static void glue (audio_pcm_hw_free_resources_
, TYPE
) (HW
*hw
)
81 static int glue (audio_pcm_hw_alloc_resources_
, TYPE
) (HW
*hw
)
83 HWBUF
= audio_calloc (AUDIO_FUNC
, hw
->samples
, sizeof (struct st_sample
));
85 dolog ("Could not allocate " NAME
" buffer (%d samples)\n",
93 static void glue (audio_pcm_sw_free_resources_
, TYPE
) (SW
*sw
)
100 st_rate_stop (sw
->rate
);
107 static int glue (audio_pcm_sw_alloc_resources_
, TYPE
) (SW
*sw
)
112 samples
= sw
->hw
->samples
;
114 samples
= ((int64_t) sw
->hw
->samples
<< 32) / sw
->ratio
;
117 sw
->buf
= audio_calloc (AUDIO_FUNC
, samples
, sizeof (struct st_sample
));
119 dolog ("Could not allocate buffer for `%s' (%d samples)\n",
120 SW_NAME (sw
), samples
);
125 sw
->rate
= st_rate_start (sw
->info
.freq
, sw
->hw
->info
.freq
);
127 sw
->rate
= st_rate_start (sw
->hw
->info
.freq
, sw
->info
.freq
);
137 static int glue (audio_pcm_sw_init_
, TYPE
) (
141 struct audsettings
*as
146 audio_pcm_init_info (&sw
->info
, as
);
150 sw
->ratio
= ((int64_t) sw
->hw
->info
.freq
<< 32) / sw
->info
.freq
;
151 sw
->total_hw_samples_mixed
= 0;
154 sw
->ratio
= ((int64_t) sw
->info
.freq
<< 32) / sw
->hw
->info
.freq
;
158 sw
->conv
= mixeng_conv
160 sw
->clip
= mixeng_clip
162 [sw
->info
.nchannels
== 2]
164 [sw
->info
.swap_endianness
]
165 [audio_bits_to_index (sw
->info
.bits
)];
167 sw
->name
= qemu_strdup (name
);
168 err
= glue (audio_pcm_sw_alloc_resources_
, TYPE
) (sw
);
170 qemu_free (sw
->name
);
176 static void glue (audio_pcm_sw_fini_
, TYPE
) (SW
*sw
)
178 glue (audio_pcm_sw_free_resources_
, TYPE
) (sw
);
180 qemu_free (sw
->name
);
185 static void glue (audio_pcm_hw_add_sw_
, TYPE
) (HW
*hw
, SW
*sw
)
187 QLIST_INSERT_HEAD (&hw
->sw_head
, sw
, entries
);
190 static void glue (audio_pcm_hw_del_sw_
, TYPE
) (SW
*sw
)
192 QLIST_REMOVE (sw
, entries
);
195 static void glue (audio_pcm_hw_gc_
, TYPE
) (HW
**hwp
)
197 AudioState
*s
= &glob_audio_state
;
200 if (!hw
->sw_head
.lh_first
) {
202 audio_detach_capture (hw
);
204 QLIST_REMOVE (hw
, entries
);
205 glue (s
->nb_hw_voices_
, TYPE
) += 1;
206 glue (audio_pcm_hw_free_resources_
,TYPE
) (hw
);
207 glue (hw
->pcm_ops
->fini_
, TYPE
) (hw
);
213 static HW
*glue (audio_pcm_hw_find_any_
, TYPE
) (HW
*hw
)
215 AudioState
*s
= &glob_audio_state
;
216 return hw
? hw
->entries
.le_next
: glue (s
->hw_head_
, TYPE
).lh_first
;
219 static HW
*glue (audio_pcm_hw_find_any_enabled_
, TYPE
) (HW
*hw
)
221 while ((hw
= glue (audio_pcm_hw_find_any_
, TYPE
) (hw
))) {
229 static HW
*glue (audio_pcm_hw_find_specific_
, TYPE
) (
231 struct audsettings
*as
234 while ((hw
= glue (audio_pcm_hw_find_any_
, TYPE
) (hw
))) {
235 if (audio_pcm_info_eq (&hw
->info
, as
)) {
242 static HW
*glue (audio_pcm_hw_add_new_
, TYPE
) (struct audsettings
*as
)
245 AudioState
*s
= &glob_audio_state
;
246 struct audio_driver
*drv
= s
->drv
;
248 if (!glue (s
->nb_hw_voices_
, TYPE
)) {
252 if (audio_bug (AUDIO_FUNC
, !drv
)) {
253 dolog ("No host audio driver\n");
257 if (audio_bug (AUDIO_FUNC
, !drv
->pcm_ops
)) {
258 dolog ("Host audio driver without pcm_ops\n");
262 hw
= audio_calloc (AUDIO_FUNC
, 1, glue (drv
->voice_size_
, TYPE
));
264 dolog ("Can not allocate voice `%s' size %d\n",
265 drv
->name
, glue (drv
->voice_size_
, TYPE
));
269 hw
->pcm_ops
= drv
->pcm_ops
;
270 QLIST_INIT (&hw
->sw_head
);
272 QLIST_INIT (&hw
->cap_head
);
274 if (glue (hw
->pcm_ops
->init_
, TYPE
) (hw
, as
)) {
278 if (audio_bug (AUDIO_FUNC
, hw
->samples
<= 0)) {
279 dolog ("hw->samples=%d\n", hw
->samples
);
284 hw
->clip
= mixeng_clip
286 hw
->conv
= mixeng_conv
288 [hw
->info
.nchannels
== 2]
290 [hw
->info
.swap_endianness
]
291 [audio_bits_to_index (hw
->info
.bits
)];
293 if (glue (audio_pcm_hw_alloc_resources_
, TYPE
) (hw
)) {
297 QLIST_INSERT_HEAD (&s
->glue (hw_head_
, TYPE
), hw
, entries
);
298 glue (s
->nb_hw_voices_
, TYPE
) -= 1;
300 audio_attach_capture (hw
);
305 glue (hw
->pcm_ops
->fini_
, TYPE
) (hw
);
311 static HW
*glue (audio_pcm_hw_add_
, TYPE
) (struct audsettings
*as
)
315 if (glue (conf
.fixed_
, TYPE
).enabled
&& glue (conf
.fixed_
, TYPE
).greedy
) {
316 hw
= glue (audio_pcm_hw_add_new_
, TYPE
) (as
);
322 hw
= glue (audio_pcm_hw_find_specific_
, TYPE
) (NULL
, as
);
327 hw
= glue (audio_pcm_hw_add_new_
, TYPE
) (as
);
332 return glue (audio_pcm_hw_find_any_
, TYPE
) (NULL
);
335 static SW
*glue (audio_pcm_create_voice_pair_
, TYPE
) (
337 struct audsettings
*as
342 struct audsettings hw_as
;
344 if (glue (conf
.fixed_
, TYPE
).enabled
) {
345 hw_as
= glue (conf
.fixed_
, TYPE
).settings
;
351 sw
= audio_calloc (AUDIO_FUNC
, 1, sizeof (*sw
));
353 dolog ("Could not allocate soft voice `%s' (%zu bytes)\n",
354 sw_name
? sw_name
: "unknown", sizeof (*sw
));
358 hw
= glue (audio_pcm_hw_add_
, TYPE
) (&hw_as
);
363 glue (audio_pcm_hw_add_sw_
, TYPE
) (hw
, sw
);
365 if (glue (audio_pcm_sw_init_
, TYPE
) (sw
, hw
, sw_name
, as
)) {
372 glue (audio_pcm_hw_del_sw_
, TYPE
) (sw
);
373 glue (audio_pcm_hw_gc_
, TYPE
) (&hw
);
380 static void glue (audio_close_
, TYPE
) (SW
*sw
)
382 glue (audio_pcm_sw_fini_
, TYPE
) (sw
);
383 glue (audio_pcm_hw_del_sw_
, TYPE
) (sw
);
384 glue (audio_pcm_hw_gc_
, TYPE
) (&sw
->hw
);
388 void glue (AUD_close_
, TYPE
) (QEMUSoundCard
*card
, SW
*sw
)
391 if (audio_bug (AUDIO_FUNC
, !card
)) {
392 dolog ("card=%p\n", card
);
396 glue (audio_close_
, TYPE
) (sw
);
400 SW
*glue (AUD_open_
, TYPE
) (
404 void *callback_opaque
,
405 audio_callback_fn callback_fn
,
406 struct audsettings
*as
409 AudioState
*s
= &glob_audio_state
;
415 ldebug ("open %s, freq %d, nchannels %d, fmt %d\n",
416 name
, as
->freq
, as
->nchannels
, as
->fmt
);
418 if (audio_bug (AUDIO_FUNC
, !card
|| !name
|| !callback_fn
|| !as
)) {
419 dolog ("card=%p name=%p callback_fn=%p as=%p\n",
420 card
, name
, callback_fn
, as
);
424 if (audio_bug (AUDIO_FUNC
, audio_validate_settings (as
))) {
425 audio_print_settings (as
);
429 if (audio_bug (AUDIO_FUNC
, !s
->drv
)) {
430 dolog ("Can not open `%s' (no host audio driver)\n", name
);
434 if (sw
&& audio_pcm_info_eq (&sw
->info
, as
)) {
439 if (conf
.plive
&& sw
&& (!sw
->active
&& !sw
->empty
)) {
440 live
= sw
->total_hw_samples_mixed
;
443 dolog ("Replacing voice %s with %d live samples\n", SW_NAME (sw
), live
);
444 dolog ("Old %s freq %d, bits %d, channels %d\n",
445 SW_NAME (sw
), sw
->info
.freq
, sw
->info
.bits
, sw
->info
.nchannels
);
446 dolog ("New %s freq %d, bits %d, channels %d\n",
449 (fmt
== AUD_FMT_S16
|| fmt
== AUD_FMT_U16
) ? 16 : 8,
455 old_sw
->callback
.fn
= NULL
;
461 if (!glue (conf
.fixed_
, TYPE
).enabled
&& sw
) {
462 glue (AUD_close_
, TYPE
) (card
, sw
);
470 dolog ("Internal logic error voice `%s' has no hardware store\n",
475 glue (audio_pcm_sw_fini_
, TYPE
) (sw
);
476 if (glue (audio_pcm_sw_init_
, TYPE
) (sw
, hw
, name
, as
)) {
481 sw
= glue (audio_pcm_create_voice_pair_
, TYPE
) (name
, as
);
483 dolog ("Failed to create voice `%s'\n", name
);
490 sw
->vol
= nominal_volume
;
491 sw
->callback
.fn
= callback_fn
;
492 sw
->callback
.opaque
= callback_opaque
;
497 (live
<< old_sw
->info
.shift
)
498 * old_sw
->info
.bytes_per_second
499 / sw
->info
.bytes_per_second
;
502 dolog ("Silence will be mixed %d\n", mixed
);
504 sw
->total_hw_samples_mixed
+= mixed
;
509 dolog ("%s\n", name
);
510 audio_pcm_print_info ("hw", &sw
->hw
->info
);
511 audio_pcm_print_info ("sw", &sw
->info
);
518 glue (AUD_close_
, TYPE
) (card
, sw
);
522 int glue (AUD_is_active_
, TYPE
) (SW
*sw
)
524 return sw
? sw
->active
: 0;
527 void glue (AUD_init_time_stamp_
, TYPE
) (SW
*sw
, QEMUAudioTimeStamp
*ts
)
533 ts
->old_ts
= sw
->hw
->ts_helper
;
536 uint64_t glue (AUD_get_elapsed_usec_
, TYPE
) (SW
*sw
, QEMUAudioTimeStamp
*ts
)
538 uint64_t delta
, cur_ts
, old_ts
;
544 cur_ts
= sw
->hw
->ts_helper
;
546 /* dolog ("cur %lld old %lld\n", cur_ts, old_ts); */
548 if (cur_ts
>= old_ts
) {
549 delta
= cur_ts
- old_ts
;
552 delta
= UINT64_MAX
- old_ts
+ cur_ts
;
559 return muldiv64 (delta
, sw
->hw
->info
.freq
, 1000000);