Statistics
| Branch: | Revision:

root / audio / audio.c @ 13917bee

History | View | Annotate | Download (50.5 kB)

1 85571bc7 bellard
/*
2 85571bc7 bellard
 * QEMU Audio subsystem
3 1d14ffa9 bellard
 *
4 1d14ffa9 bellard
 * Copyright (c) 2003-2005 Vassili Karpov (malc)
5 1d14ffa9 bellard
 *
6 85571bc7 bellard
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 85571bc7 bellard
 * of this software and associated documentation files (the "Software"), to deal
8 85571bc7 bellard
 * in the Software without restriction, including without limitation the rights
9 85571bc7 bellard
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 85571bc7 bellard
 * copies of the Software, and to permit persons to whom the Software is
11 85571bc7 bellard
 * furnished to do so, subject to the following conditions:
12 85571bc7 bellard
 *
13 85571bc7 bellard
 * The above copyright notice and this permission notice shall be included in
14 85571bc7 bellard
 * all copies or substantial portions of the Software.
15 85571bc7 bellard
 *
16 85571bc7 bellard
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 85571bc7 bellard
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 85571bc7 bellard
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 85571bc7 bellard
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 85571bc7 bellard
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 85571bc7 bellard
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 85571bc7 bellard
 * THE SOFTWARE.
23 85571bc7 bellard
 */
24 87ecb68b pbrook
#include "hw/hw.h"
25 87ecb68b pbrook
#include "audio.h"
26 376253ec aliguori
#include "monitor.h"
27 87ecb68b pbrook
#include "qemu-timer.h"
28 87ecb68b pbrook
#include "sysemu.h"
29 85571bc7 bellard
30 1d14ffa9 bellard
#define AUDIO_CAP "audio"
31 1d14ffa9 bellard
#include "audio_int.h"
32 85571bc7 bellard
33 1d14ffa9 bellard
/* #define DEBUG_PLIVE */
34 1d14ffa9 bellard
/* #define DEBUG_LIVE */
35 1d14ffa9 bellard
/* #define DEBUG_OUT */
36 8ead62cf bellard
/* #define DEBUG_CAPTURE */
37 713a98f8 malc
/* #define DEBUG_POLL */
38 85571bc7 bellard
39 c0fe3827 bellard
#define SW_NAME(sw) (sw)->name ? (sw)->name : "unknown"
40 c0fe3827 bellard
41 2358a494 Juan Quintela
42 2358a494 Juan Quintela
/* Order of CONFIG_AUDIO_DRIVERS is import.
43 2358a494 Juan Quintela
   The 1st one is the one used by default, that is the reason
44 2358a494 Juan Quintela
    that we generate the list.
45 2358a494 Juan Quintela
*/
46 1d14ffa9 bellard
static struct audio_driver *drvtab[] = {
47 2358a494 Juan Quintela
    CONFIG_AUDIO_DRIVERS
48 1d14ffa9 bellard
    &no_audio_driver,
49 1d14ffa9 bellard
    &wav_audio_driver
50 1d14ffa9 bellard
};
51 85571bc7 bellard
52 c0fe3827 bellard
struct fixed_settings {
53 c0fe3827 bellard
    int enabled;
54 c0fe3827 bellard
    int nb_voices;
55 c0fe3827 bellard
    int greedy;
56 1ea879e5 malc
    struct audsettings settings;
57 c0fe3827 bellard
};
58 c0fe3827 bellard
59 c0fe3827 bellard
static struct {
60 c0fe3827 bellard
    struct fixed_settings fixed_out;
61 c0fe3827 bellard
    struct fixed_settings fixed_in;
62 c0fe3827 bellard
    union {
63 c310de86 malc
        int hertz;
64 c0fe3827 bellard
        int64_t ticks;
65 c0fe3827 bellard
    } period;
66 c0fe3827 bellard
    int plive;
67 541e0844 bellard
    int log_to_monitor;
68 713a98f8 malc
    int try_poll_in;
69 713a98f8 malc
    int try_poll_out;
70 c0fe3827 bellard
} conf = {
71 14658cd1 Juan Quintela
    .fixed_out = { /* DAC fixed settings */
72 14658cd1 Juan Quintela
        .enabled = 1,
73 14658cd1 Juan Quintela
        .nb_voices = 1,
74 14658cd1 Juan Quintela
        .greedy = 1,
75 14658cd1 Juan Quintela
        .settings = {
76 14658cd1 Juan Quintela
            .freq = 44100,
77 14658cd1 Juan Quintela
            .nchannels = 2,
78 14658cd1 Juan Quintela
            .fmt = AUD_FMT_S16,
79 14658cd1 Juan Quintela
            .endianness =  AUDIO_HOST_ENDIANNESS,
80 c0fe3827 bellard
        }
81 c0fe3827 bellard
    },
82 c0fe3827 bellard
83 14658cd1 Juan Quintela
    .fixed_in = { /* ADC fixed settings */
84 14658cd1 Juan Quintela
        .enabled = 1,
85 14658cd1 Juan Quintela
        .nb_voices = 1,
86 14658cd1 Juan Quintela
        .greedy = 1,
87 14658cd1 Juan Quintela
        .settings = {
88 14658cd1 Juan Quintela
            .freq = 44100,
89 14658cd1 Juan Quintela
            .nchannels = 2,
90 14658cd1 Juan Quintela
            .fmt = AUD_FMT_S16,
91 14658cd1 Juan Quintela
            .endianness = AUDIO_HOST_ENDIANNESS,
92 c0fe3827 bellard
        }
93 c0fe3827 bellard
    },
94 c0fe3827 bellard
95 aea86747 malc
    .period = { .hertz = 250 },
96 14658cd1 Juan Quintela
    .plive = 0,
97 14658cd1 Juan Quintela
    .log_to_monitor = 0,
98 713a98f8 malc
    .try_poll_in = 1,
99 713a98f8 malc
    .try_poll_out = 1,
100 1d14ffa9 bellard
};
101 1d14ffa9 bellard
102 c0fe3827 bellard
static AudioState glob_audio_state;
103 c0fe3827 bellard
104 1ea879e5 malc
struct mixeng_volume nominal_volume = {
105 14658cd1 Juan Quintela
    .mute = 0,
106 1d14ffa9 bellard
#ifdef FLOAT_MIXENG
107 14658cd1 Juan Quintela
    .r = 1.0,
108 14658cd1 Juan Quintela
    .l = 1.0,
109 1d14ffa9 bellard
#else
110 14658cd1 Juan Quintela
    .r = 1ULL << 32,
111 14658cd1 Juan Quintela
    .l = 1ULL << 32,
112 1d14ffa9 bellard
#endif
113 85571bc7 bellard
};
114 85571bc7 bellard
115 1d14ffa9 bellard
#ifdef AUDIO_IS_FLAWLESS_AND_NO_CHECKS_ARE_REQURIED
116 1d14ffa9 bellard
#error No its not
117 1d14ffa9 bellard
#else
118 1d14ffa9 bellard
int audio_bug (const char *funcname, int cond)
119 85571bc7 bellard
{
120 1d14ffa9 bellard
    if (cond) {
121 1d14ffa9 bellard
        static int shown;
122 1d14ffa9 bellard
123 8ead62cf bellard
        AUD_log (NULL, "A bug was just triggered in %s\n", funcname);
124 1d14ffa9 bellard
        if (!shown) {
125 1d14ffa9 bellard
            shown = 1;
126 1d14ffa9 bellard
            AUD_log (NULL, "Save all your work and restart without audio\n");
127 155a8ad3 malc
            AUD_log (NULL, "Please send bug report to av1474@comtv.ru\n");
128 1d14ffa9 bellard
            AUD_log (NULL, "I am sorry\n");
129 1d14ffa9 bellard
        }
130 1d14ffa9 bellard
        AUD_log (NULL, "Context:\n");
131 1d14ffa9 bellard
132 1d14ffa9 bellard
#if defined AUDIO_BREAKPOINT_ON_BUG
133 1d14ffa9 bellard
#  if defined HOST_I386
134 1d14ffa9 bellard
#    if defined __GNUC__
135 1d14ffa9 bellard
        __asm__ ("int3");
136 1d14ffa9 bellard
#    elif defined _MSC_VER
137 1d14ffa9 bellard
        _asm _emit 0xcc;
138 1d14ffa9 bellard
#    else
139 1d14ffa9 bellard
        abort ();
140 1d14ffa9 bellard
#    endif
141 1d14ffa9 bellard
#  else
142 1d14ffa9 bellard
        abort ();
143 1d14ffa9 bellard
#  endif
144 1d14ffa9 bellard
#endif
145 85571bc7 bellard
    }
146 85571bc7 bellard
147 1d14ffa9 bellard
    return cond;
148 85571bc7 bellard
}
149 1d14ffa9 bellard
#endif
150 85571bc7 bellard
151 f941aa25 ths
static inline int audio_bits_to_index (int bits)
152 f941aa25 ths
{
153 f941aa25 ths
    switch (bits) {
154 f941aa25 ths
    case 8:
155 f941aa25 ths
        return 0;
156 f941aa25 ths
157 f941aa25 ths
    case 16:
158 f941aa25 ths
        return 1;
159 f941aa25 ths
160 f941aa25 ths
    case 32:
161 f941aa25 ths
        return 2;
162 f941aa25 ths
163 f941aa25 ths
    default:
164 f941aa25 ths
        audio_bug ("bits_to_index", 1);
165 f941aa25 ths
        AUD_log (NULL, "invalid bits %d\n", bits);
166 f941aa25 ths
        return 0;
167 f941aa25 ths
    }
168 f941aa25 ths
}
169 f941aa25 ths
170 c0fe3827 bellard
void *audio_calloc (const char *funcname, int nmemb, size_t size)
171 c0fe3827 bellard
{
172 c0fe3827 bellard
    int cond;
173 c0fe3827 bellard
    size_t len;
174 c0fe3827 bellard
175 c0fe3827 bellard
    len = nmemb * size;
176 c0fe3827 bellard
    cond = !nmemb || !size;
177 c0fe3827 bellard
    cond |= nmemb < 0;
178 c0fe3827 bellard
    cond |= len < size;
179 c0fe3827 bellard
180 c0fe3827 bellard
    if (audio_bug ("audio_calloc", cond)) {
181 c0fe3827 bellard
        AUD_log (NULL, "%s passed invalid arguments to audio_calloc\n",
182 c0fe3827 bellard
                 funcname);
183 541e0844 bellard
        AUD_log (NULL, "nmemb=%d size=%zu (len=%zu)\n", nmemb, size, len);
184 c0fe3827 bellard
        return NULL;
185 c0fe3827 bellard
    }
186 c0fe3827 bellard
187 c0fe3827 bellard
    return qemu_mallocz (len);
188 c0fe3827 bellard
}
189 c0fe3827 bellard
190 1d14ffa9 bellard
static char *audio_alloc_prefix (const char *s)
191 85571bc7 bellard
{
192 1d14ffa9 bellard
    const char qemu_prefix[] = "QEMU_";
193 090f1fa3 aliguori
    size_t len, i;
194 090f1fa3 aliguori
    char *r, *u;
195 85571bc7 bellard
196 1d14ffa9 bellard
    if (!s) {
197 1d14ffa9 bellard
        return NULL;
198 1d14ffa9 bellard
    }
199 85571bc7 bellard
200 1d14ffa9 bellard
    len = strlen (s);
201 a3772d4d blueswir1
    r = qemu_malloc (len + sizeof (qemu_prefix));
202 85571bc7 bellard
203 090f1fa3 aliguori
    u = r + sizeof (qemu_prefix) - 1;
204 85571bc7 bellard
205 090f1fa3 aliguori
    pstrcpy (r, len + sizeof (qemu_prefix), qemu_prefix);
206 090f1fa3 aliguori
    pstrcat (r, len + sizeof (qemu_prefix), s);
207 1d14ffa9 bellard
208 090f1fa3 aliguori
    for (i = 0; i < len; ++i) {
209 090f1fa3 aliguori
        u[i] = qemu_toupper(u[i]);
210 85571bc7 bellard
    }
211 090f1fa3 aliguori
212 1d14ffa9 bellard
    return r;
213 85571bc7 bellard
}
214 85571bc7 bellard
215 9596ebb7 pbrook
static const char *audio_audfmt_to_string (audfmt_e fmt)
216 85571bc7 bellard
{
217 1d14ffa9 bellard
    switch (fmt) {
218 1d14ffa9 bellard
    case AUD_FMT_U8:
219 1d14ffa9 bellard
        return "U8";
220 85571bc7 bellard
221 1d14ffa9 bellard
    case AUD_FMT_U16:
222 1d14ffa9 bellard
        return "U16";
223 85571bc7 bellard
224 85571bc7 bellard
    case AUD_FMT_S8:
225 1d14ffa9 bellard
        return "S8";
226 85571bc7 bellard
227 85571bc7 bellard
    case AUD_FMT_S16:
228 1d14ffa9 bellard
        return "S16";
229 f941aa25 ths
230 f941aa25 ths
    case AUD_FMT_U32:
231 f941aa25 ths
        return "U32";
232 f941aa25 ths
233 f941aa25 ths
    case AUD_FMT_S32:
234 f941aa25 ths
        return "S32";
235 85571bc7 bellard
    }
236 85571bc7 bellard
237 1d14ffa9 bellard
    dolog ("Bogus audfmt %d returning S16\n", fmt);
238 1d14ffa9 bellard
    return "S16";
239 85571bc7 bellard
}
240 85571bc7 bellard
241 9596ebb7 pbrook
static audfmt_e audio_string_to_audfmt (const char *s, audfmt_e defval,
242 9596ebb7 pbrook
                                        int *defaultp)
243 85571bc7 bellard
{
244 1d14ffa9 bellard
    if (!strcasecmp (s, "u8")) {
245 1d14ffa9 bellard
        *defaultp = 0;
246 1d14ffa9 bellard
        return AUD_FMT_U8;
247 1d14ffa9 bellard
    }
248 1d14ffa9 bellard
    else if (!strcasecmp (s, "u16")) {
249 1d14ffa9 bellard
        *defaultp = 0;
250 1d14ffa9 bellard
        return AUD_FMT_U16;
251 1d14ffa9 bellard
    }
252 f941aa25 ths
    else if (!strcasecmp (s, "u32")) {
253 f941aa25 ths
        *defaultp = 0;
254 f941aa25 ths
        return AUD_FMT_U32;
255 f941aa25 ths
    }
256 1d14ffa9 bellard
    else if (!strcasecmp (s, "s8")) {
257 1d14ffa9 bellard
        *defaultp = 0;
258 1d14ffa9 bellard
        return AUD_FMT_S8;
259 1d14ffa9 bellard
    }
260 1d14ffa9 bellard
    else if (!strcasecmp (s, "s16")) {
261 1d14ffa9 bellard
        *defaultp = 0;
262 1d14ffa9 bellard
        return AUD_FMT_S16;
263 1d14ffa9 bellard
    }
264 f941aa25 ths
    else if (!strcasecmp (s, "s32")) {
265 f941aa25 ths
        *defaultp = 0;
266 f941aa25 ths
        return AUD_FMT_S32;
267 f941aa25 ths
    }
268 1d14ffa9 bellard
    else {
269 1d14ffa9 bellard
        dolog ("Bogus audio format `%s' using %s\n",
270 1d14ffa9 bellard
               s, audio_audfmt_to_string (defval));
271 1d14ffa9 bellard
        *defaultp = 1;
272 1d14ffa9 bellard
        return defval;
273 1d14ffa9 bellard
    }
274 85571bc7 bellard
}
275 85571bc7 bellard
276 1d14ffa9 bellard
static audfmt_e audio_get_conf_fmt (const char *envname,
277 1d14ffa9 bellard
                                    audfmt_e defval,
278 1d14ffa9 bellard
                                    int *defaultp)
279 85571bc7 bellard
{
280 1d14ffa9 bellard
    const char *var = getenv (envname);
281 1d14ffa9 bellard
    if (!var) {
282 1d14ffa9 bellard
        *defaultp = 1;
283 1d14ffa9 bellard
        return defval;
284 85571bc7 bellard
    }
285 1d14ffa9 bellard
    return audio_string_to_audfmt (var, defval, defaultp);
286 85571bc7 bellard
}
287 85571bc7 bellard
288 1d14ffa9 bellard
static int audio_get_conf_int (const char *key, int defval, int *defaultp)
289 85571bc7 bellard
{
290 1d14ffa9 bellard
    int val;
291 1d14ffa9 bellard
    char *strval;
292 85571bc7 bellard
293 1d14ffa9 bellard
    strval = getenv (key);
294 1d14ffa9 bellard
    if (strval) {
295 1d14ffa9 bellard
        *defaultp = 0;
296 1d14ffa9 bellard
        val = atoi (strval);
297 1d14ffa9 bellard
        return val;
298 1d14ffa9 bellard
    }
299 1d14ffa9 bellard
    else {
300 1d14ffa9 bellard
        *defaultp = 1;
301 1d14ffa9 bellard
        return defval;
302 1d14ffa9 bellard
    }
303 85571bc7 bellard
}
304 85571bc7 bellard
305 1d14ffa9 bellard
static const char *audio_get_conf_str (const char *key,
306 1d14ffa9 bellard
                                       const char *defval,
307 1d14ffa9 bellard
                                       int *defaultp)
308 85571bc7 bellard
{
309 1d14ffa9 bellard
    const char *val = getenv (key);
310 1d14ffa9 bellard
    if (!val) {
311 1d14ffa9 bellard
        *defaultp = 1;
312 1d14ffa9 bellard
        return defval;
313 1d14ffa9 bellard
    }
314 1d14ffa9 bellard
    else {
315 1d14ffa9 bellard
        *defaultp = 0;
316 1d14ffa9 bellard
        return val;
317 85571bc7 bellard
    }
318 85571bc7 bellard
}
319 85571bc7 bellard
320 541e0844 bellard
void AUD_vlog (const char *cap, const char *fmt, va_list ap)
321 85571bc7 bellard
{
322 541e0844 bellard
    if (conf.log_to_monitor) {
323 541e0844 bellard
        if (cap) {
324 376253ec aliguori
            monitor_printf(cur_mon, "%s: ", cap);
325 541e0844 bellard
        }
326 541e0844 bellard
327 376253ec aliguori
        monitor_vprintf(cur_mon, fmt, ap);
328 541e0844 bellard
    }
329 541e0844 bellard
    else {
330 541e0844 bellard
        if (cap) {
331 541e0844 bellard
            fprintf (stderr, "%s: ", cap);
332 541e0844 bellard
        }
333 541e0844 bellard
334 541e0844 bellard
        vfprintf (stderr, fmt, ap);
335 85571bc7 bellard
    }
336 85571bc7 bellard
}
337 85571bc7 bellard
338 541e0844 bellard
void AUD_log (const char *cap, const char *fmt, ...)
339 85571bc7 bellard
{
340 541e0844 bellard
    va_list ap;
341 541e0844 bellard
342 541e0844 bellard
    va_start (ap, fmt);
343 541e0844 bellard
    AUD_vlog (cap, fmt, ap);
344 541e0844 bellard
    va_end (ap);
345 85571bc7 bellard
}
346 85571bc7 bellard
347 1d14ffa9 bellard
static void audio_print_options (const char *prefix,
348 1d14ffa9 bellard
                                 struct audio_option *opt)
349 85571bc7 bellard
{
350 1d14ffa9 bellard
    char *uprefix;
351 1d14ffa9 bellard
352 1d14ffa9 bellard
    if (!prefix) {
353 1d14ffa9 bellard
        dolog ("No prefix specified\n");
354 1d14ffa9 bellard
        return;
355 1d14ffa9 bellard
    }
356 1d14ffa9 bellard
357 1d14ffa9 bellard
    if (!opt) {
358 1d14ffa9 bellard
        dolog ("No options\n");
359 85571bc7 bellard
        return;
360 1d14ffa9 bellard
    }
361 85571bc7 bellard
362 1d14ffa9 bellard
    uprefix = audio_alloc_prefix (prefix);
363 85571bc7 bellard
364 1d14ffa9 bellard
    for (; opt->name; opt++) {
365 1d14ffa9 bellard
        const char *state = "default";
366 1d14ffa9 bellard
        printf ("  %s_%s: ", uprefix, opt->name);
367 85571bc7 bellard
368 fe8f096b ths
        if (opt->overriddenp && *opt->overriddenp) {
369 1d14ffa9 bellard
            state = "current";
370 1d14ffa9 bellard
        }
371 85571bc7 bellard
372 1d14ffa9 bellard
        switch (opt->tag) {
373 1d14ffa9 bellard
        case AUD_OPT_BOOL:
374 1d14ffa9 bellard
            {
375 1d14ffa9 bellard
                int *intp = opt->valp;
376 1d14ffa9 bellard
                printf ("boolean, %s = %d\n", state, *intp ? 1 : 0);
377 1d14ffa9 bellard
            }
378 1d14ffa9 bellard
            break;
379 1d14ffa9 bellard
380 1d14ffa9 bellard
        case AUD_OPT_INT:
381 1d14ffa9 bellard
            {
382 1d14ffa9 bellard
                int *intp = opt->valp;
383 1d14ffa9 bellard
                printf ("integer, %s = %d\n", state, *intp);
384 1d14ffa9 bellard
            }
385 1d14ffa9 bellard
            break;
386 1d14ffa9 bellard
387 1d14ffa9 bellard
        case AUD_OPT_FMT:
388 1d14ffa9 bellard
            {
389 1d14ffa9 bellard
                audfmt_e *fmtp = opt->valp;
390 1d14ffa9 bellard
                printf (
391 ca9cc28c balrog
                    "format, %s = %s, (one of: U8 S8 U16 S16 U32 S32)\n",
392 1d14ffa9 bellard
                    state,
393 1d14ffa9 bellard
                    audio_audfmt_to_string (*fmtp)
394 1d14ffa9 bellard
                    );
395 1d14ffa9 bellard
            }
396 1d14ffa9 bellard
            break;
397 1d14ffa9 bellard
398 1d14ffa9 bellard
        case AUD_OPT_STR:
399 1d14ffa9 bellard
            {
400 1d14ffa9 bellard
                const char **strp = opt->valp;
401 1d14ffa9 bellard
                printf ("string, %s = %s\n",
402 1d14ffa9 bellard
                        state,
403 1d14ffa9 bellard
                        *strp ? *strp : "(not set)");
404 85571bc7 bellard
            }
405 1d14ffa9 bellard
            break;
406 1d14ffa9 bellard
407 1d14ffa9 bellard
        default:
408 1d14ffa9 bellard
            printf ("???\n");
409 1d14ffa9 bellard
            dolog ("Bad value tag for option %s_%s %d\n",
410 1d14ffa9 bellard
                   uprefix, opt->name, opt->tag);
411 1d14ffa9 bellard
            break;
412 85571bc7 bellard
        }
413 1d14ffa9 bellard
        printf ("    %s\n", opt->descr);
414 85571bc7 bellard
    }
415 1d14ffa9 bellard
416 1d14ffa9 bellard
    qemu_free (uprefix);
417 85571bc7 bellard
}
418 85571bc7 bellard
419 1d14ffa9 bellard
static void audio_process_options (const char *prefix,
420 1d14ffa9 bellard
                                   struct audio_option *opt)
421 85571bc7 bellard
{
422 1d14ffa9 bellard
    char *optname;
423 1d14ffa9 bellard
    const char qemu_prefix[] = "QEMU_";
424 363a37d5 blueswir1
    size_t preflen, optlen;
425 85571bc7 bellard
426 1d14ffa9 bellard
    if (audio_bug (AUDIO_FUNC, !prefix)) {
427 1d14ffa9 bellard
        dolog ("prefix = NULL\n");
428 1d14ffa9 bellard
        return;
429 1d14ffa9 bellard
    }
430 85571bc7 bellard
431 1d14ffa9 bellard
    if (audio_bug (AUDIO_FUNC, !opt)) {
432 1d14ffa9 bellard
        dolog ("opt = NULL\n");
433 1d14ffa9 bellard
        return;
434 85571bc7 bellard
    }
435 85571bc7 bellard
436 1d14ffa9 bellard
    preflen = strlen (prefix);
437 85571bc7 bellard
438 1d14ffa9 bellard
    for (; opt->name; opt++) {
439 1d14ffa9 bellard
        size_t len, i;
440 1d14ffa9 bellard
        int def;
441 1d14ffa9 bellard
442 1d14ffa9 bellard
        if (!opt->valp) {
443 1d14ffa9 bellard
            dolog ("Option value pointer for `%s' is not set\n",
444 1d14ffa9 bellard
                   opt->name);
445 1d14ffa9 bellard
            continue;
446 1d14ffa9 bellard
        }
447 1d14ffa9 bellard
448 1d14ffa9 bellard
        len = strlen (opt->name);
449 c0fe3827 bellard
        /* len of opt->name + len of prefix + size of qemu_prefix
450 c0fe3827 bellard
         * (includes trailing zero) + zero + underscore (on behalf of
451 c0fe3827 bellard
         * sizeof) */
452 363a37d5 blueswir1
        optlen = len + preflen + sizeof (qemu_prefix) + 1;
453 363a37d5 blueswir1
        optname = qemu_malloc (optlen);
454 1d14ffa9 bellard
455 363a37d5 blueswir1
        pstrcpy (optname, optlen, qemu_prefix);
456 c0fe3827 bellard
457 c0fe3827 bellard
        /* copy while upper-casing, including trailing zero */
458 1d14ffa9 bellard
        for (i = 0; i <= preflen; ++i) {
459 cd390083 blueswir1
            optname[i + sizeof (qemu_prefix) - 1] = qemu_toupper(prefix[i]);
460 1d14ffa9 bellard
        }
461 363a37d5 blueswir1
        pstrcat (optname, optlen, "_");
462 363a37d5 blueswir1
        pstrcat (optname, optlen, opt->name);
463 1d14ffa9 bellard
464 1d14ffa9 bellard
        def = 1;
465 1d14ffa9 bellard
        switch (opt->tag) {
466 1d14ffa9 bellard
        case AUD_OPT_BOOL:
467 1d14ffa9 bellard
        case AUD_OPT_INT:
468 1d14ffa9 bellard
            {
469 1d14ffa9 bellard
                int *intp = opt->valp;
470 1d14ffa9 bellard
                *intp = audio_get_conf_int (optname, *intp, &def);
471 1d14ffa9 bellard
            }
472 1d14ffa9 bellard
            break;
473 1d14ffa9 bellard
474 1d14ffa9 bellard
        case AUD_OPT_FMT:
475 1d14ffa9 bellard
            {
476 1d14ffa9 bellard
                audfmt_e *fmtp = opt->valp;
477 1d14ffa9 bellard
                *fmtp = audio_get_conf_fmt (optname, *fmtp, &def);
478 1d14ffa9 bellard
            }
479 1d14ffa9 bellard
            break;
480 1d14ffa9 bellard
481 1d14ffa9 bellard
        case AUD_OPT_STR:
482 1d14ffa9 bellard
            {
483 1d14ffa9 bellard
                const char **strp = opt->valp;
484 1d14ffa9 bellard
                *strp = audio_get_conf_str (optname, *strp, &def);
485 1d14ffa9 bellard
            }
486 1d14ffa9 bellard
            break;
487 1d14ffa9 bellard
488 1d14ffa9 bellard
        default:
489 1d14ffa9 bellard
            dolog ("Bad value tag for option `%s' - %d\n",
490 1d14ffa9 bellard
                   optname, opt->tag);
491 85571bc7 bellard
            break;
492 85571bc7 bellard
        }
493 85571bc7 bellard
494 fe8f096b ths
        if (!opt->overriddenp) {
495 fe8f096b ths
            opt->overriddenp = &opt->overridden;
496 1d14ffa9 bellard
        }
497 fe8f096b ths
        *opt->overriddenp = !def;
498 1d14ffa9 bellard
        qemu_free (optname);
499 1d14ffa9 bellard
    }
500 85571bc7 bellard
}
501 85571bc7 bellard
502 1ea879e5 malc
static void audio_print_settings (struct audsettings *as)
503 c0fe3827 bellard
{
504 c0fe3827 bellard
    dolog ("frequency=%d nchannels=%d fmt=", as->freq, as->nchannels);
505 c0fe3827 bellard
506 c0fe3827 bellard
    switch (as->fmt) {
507 c0fe3827 bellard
    case AUD_FMT_S8:
508 c0fe3827 bellard
        AUD_log (NULL, "S8");
509 c0fe3827 bellard
        break;
510 c0fe3827 bellard
    case AUD_FMT_U8:
511 c0fe3827 bellard
        AUD_log (NULL, "U8");
512 c0fe3827 bellard
        break;
513 c0fe3827 bellard
    case AUD_FMT_S16:
514 c0fe3827 bellard
        AUD_log (NULL, "S16");
515 c0fe3827 bellard
        break;
516 c0fe3827 bellard
    case AUD_FMT_U16:
517 c0fe3827 bellard
        AUD_log (NULL, "U16");
518 c0fe3827 bellard
        break;
519 d50997f9 malc
    case AUD_FMT_S32:
520 d50997f9 malc
        AUD_log (NULL, "S32");
521 d50997f9 malc
        break;
522 d50997f9 malc
    case AUD_FMT_U32:
523 d50997f9 malc
        AUD_log (NULL, "U32");
524 d50997f9 malc
        break;
525 c0fe3827 bellard
    default:
526 c0fe3827 bellard
        AUD_log (NULL, "invalid(%d)", as->fmt);
527 c0fe3827 bellard
        break;
528 c0fe3827 bellard
    }
529 ec36b695 bellard
530 ec36b695 bellard
    AUD_log (NULL, " endianness=");
531 d929eba5 bellard
    switch (as->endianness) {
532 d929eba5 bellard
    case 0:
533 d929eba5 bellard
        AUD_log (NULL, "little");
534 d929eba5 bellard
        break;
535 d929eba5 bellard
    case 1:
536 d929eba5 bellard
        AUD_log (NULL, "big");
537 d929eba5 bellard
        break;
538 d929eba5 bellard
    default:
539 d929eba5 bellard
        AUD_log (NULL, "invalid");
540 d929eba5 bellard
        break;
541 d929eba5 bellard
    }
542 c0fe3827 bellard
    AUD_log (NULL, "\n");
543 c0fe3827 bellard
}
544 c0fe3827 bellard
545 1ea879e5 malc
static int audio_validate_settings (struct audsettings *as)
546 c0fe3827 bellard
{
547 c0fe3827 bellard
    int invalid;
548 c0fe3827 bellard
549 c0fe3827 bellard
    invalid = as->nchannels != 1 && as->nchannels != 2;
550 d929eba5 bellard
    invalid |= as->endianness != 0 && as->endianness != 1;
551 c0fe3827 bellard
552 c0fe3827 bellard
    switch (as->fmt) {
553 c0fe3827 bellard
    case AUD_FMT_S8:
554 c0fe3827 bellard
    case AUD_FMT_U8:
555 c0fe3827 bellard
    case AUD_FMT_S16:
556 c0fe3827 bellard
    case AUD_FMT_U16:
557 f941aa25 ths
    case AUD_FMT_S32:
558 f941aa25 ths
    case AUD_FMT_U32:
559 c0fe3827 bellard
        break;
560 c0fe3827 bellard
    default:
561 c0fe3827 bellard
        invalid = 1;
562 c0fe3827 bellard
        break;
563 c0fe3827 bellard
    }
564 c0fe3827 bellard
565 c0fe3827 bellard
    invalid |= as->freq <= 0;
566 d929eba5 bellard
    return invalid ? -1 : 0;
567 c0fe3827 bellard
}
568 c0fe3827 bellard
569 1ea879e5 malc
static int audio_pcm_info_eq (struct audio_pcm_info *info, struct audsettings *as)
570 85571bc7 bellard
{
571 1d14ffa9 bellard
    int bits = 8, sign = 0;
572 85571bc7 bellard
573 c0fe3827 bellard
    switch (as->fmt) {
574 1d14ffa9 bellard
    case AUD_FMT_S8:
575 1d14ffa9 bellard
        sign = 1;
576 1d14ffa9 bellard
    case AUD_FMT_U8:
577 1d14ffa9 bellard
        break;
578 1d14ffa9 bellard
579 1d14ffa9 bellard
    case AUD_FMT_S16:
580 1d14ffa9 bellard
        sign = 1;
581 1d14ffa9 bellard
    case AUD_FMT_U16:
582 1d14ffa9 bellard
        bits = 16;
583 1d14ffa9 bellard
        break;
584 f941aa25 ths
585 f941aa25 ths
    case AUD_FMT_S32:
586 f941aa25 ths
        sign = 1;
587 f941aa25 ths
    case AUD_FMT_U32:
588 f941aa25 ths
        bits = 32;
589 f941aa25 ths
        break;
590 85571bc7 bellard
    }
591 c0fe3827 bellard
    return info->freq == as->freq
592 c0fe3827 bellard
        && info->nchannels == as->nchannels
593 1d14ffa9 bellard
        && info->sign == sign
594 d929eba5 bellard
        && info->bits == bits
595 d929eba5 bellard
        && info->swap_endianness == (as->endianness != AUDIO_HOST_ENDIANNESS);
596 1d14ffa9 bellard
}
597 85571bc7 bellard
598 1ea879e5 malc
void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as)
599 1d14ffa9 bellard
{
600 f941aa25 ths
    int bits = 8, sign = 0, shift = 0;
601 1d14ffa9 bellard
602 c0fe3827 bellard
    switch (as->fmt) {
603 85571bc7 bellard
    case AUD_FMT_S8:
604 85571bc7 bellard
        sign = 1;
605 85571bc7 bellard
    case AUD_FMT_U8:
606 85571bc7 bellard
        break;
607 85571bc7 bellard
608 85571bc7 bellard
    case AUD_FMT_S16:
609 85571bc7 bellard
        sign = 1;
610 85571bc7 bellard
    case AUD_FMT_U16:
611 85571bc7 bellard
        bits = 16;
612 f941aa25 ths
        shift = 1;
613 f941aa25 ths
        break;
614 f941aa25 ths
615 f941aa25 ths
    case AUD_FMT_S32:
616 f941aa25 ths
        sign = 1;
617 f941aa25 ths
    case AUD_FMT_U32:
618 f941aa25 ths
        bits = 32;
619 f941aa25 ths
        shift = 2;
620 85571bc7 bellard
        break;
621 85571bc7 bellard
    }
622 85571bc7 bellard
623 c0fe3827 bellard
    info->freq = as->freq;
624 1d14ffa9 bellard
    info->bits = bits;
625 1d14ffa9 bellard
    info->sign = sign;
626 c0fe3827 bellard
    info->nchannels = as->nchannels;
627 f941aa25 ths
    info->shift = (as->nchannels == 2) + shift;
628 1d14ffa9 bellard
    info->align = (1 << info->shift) - 1;
629 1d14ffa9 bellard
    info->bytes_per_second = info->freq << info->shift;
630 d929eba5 bellard
    info->swap_endianness = (as->endianness != AUDIO_HOST_ENDIANNESS);
631 85571bc7 bellard
}
632 85571bc7 bellard
633 1d14ffa9 bellard
void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len)
634 85571bc7 bellard
{
635 1d14ffa9 bellard
    if (!len) {
636 1d14ffa9 bellard
        return;
637 1d14ffa9 bellard
    }
638 1d14ffa9 bellard
639 1d14ffa9 bellard
    if (info->sign) {
640 e2f909be bellard
        memset (buf, 0x00, len << info->shift);
641 85571bc7 bellard
    }
642 85571bc7 bellard
    else {
643 f941aa25 ths
        switch (info->bits) {
644 f941aa25 ths
        case 8:
645 e2f909be bellard
            memset (buf, 0x80, len << info->shift);
646 f941aa25 ths
            break;
647 1d14ffa9 bellard
648 f941aa25 ths
        case 16:
649 f941aa25 ths
            {
650 f941aa25 ths
                int i;
651 f941aa25 ths
                uint16_t *p = buf;
652 f941aa25 ths
                int shift = info->nchannels - 1;
653 f941aa25 ths
                short s = INT16_MAX;
654 f941aa25 ths
655 f941aa25 ths
                if (info->swap_endianness) {
656 f941aa25 ths
                    s = bswap16 (s);
657 f941aa25 ths
                }
658 f941aa25 ths
659 f941aa25 ths
                for (i = 0; i < len << shift; i++) {
660 f941aa25 ths
                    p[i] = s;
661 f941aa25 ths
                }
662 1d14ffa9 bellard
            }
663 f941aa25 ths
            break;
664 f941aa25 ths
665 f941aa25 ths
        case 32:
666 f941aa25 ths
            {
667 f941aa25 ths
                int i;
668 f941aa25 ths
                uint32_t *p = buf;
669 f941aa25 ths
                int shift = info->nchannels - 1;
670 f941aa25 ths
                int32_t s = INT32_MAX;
671 f941aa25 ths
672 f941aa25 ths
                if (info->swap_endianness) {
673 f941aa25 ths
                    s = bswap32 (s);
674 f941aa25 ths
                }
675 1d14ffa9 bellard
676 f941aa25 ths
                for (i = 0; i < len << shift; i++) {
677 f941aa25 ths
                    p[i] = s;
678 f941aa25 ths
                }
679 1d14ffa9 bellard
            }
680 f941aa25 ths
            break;
681 f941aa25 ths
682 f941aa25 ths
        default:
683 f941aa25 ths
            AUD_log (NULL, "audio_pcm_info_clear_buf: invalid bits %d\n",
684 f941aa25 ths
                     info->bits);
685 f941aa25 ths
            break;
686 1d14ffa9 bellard
        }
687 85571bc7 bellard
    }
688 85571bc7 bellard
}
689 85571bc7 bellard
690 1d14ffa9 bellard
/*
691 8ead62cf bellard
 * Capture
692 8ead62cf bellard
 */
693 1ea879e5 malc
static void noop_conv (struct st_sample *dst, const void *src,
694 1ea879e5 malc
                       int samples, struct mixeng_volume *vol)
695 8ead62cf bellard
{
696 8ead62cf bellard
    (void) src;
697 8ead62cf bellard
    (void) dst;
698 8ead62cf bellard
    (void) samples;
699 8ead62cf bellard
    (void) vol;
700 8ead62cf bellard
}
701 8ead62cf bellard
702 8ead62cf bellard
static CaptureVoiceOut *audio_pcm_capture_find_specific (
703 1ea879e5 malc
    struct audsettings *as
704 8ead62cf bellard
    )
705 8ead62cf bellard
{
706 8ead62cf bellard
    CaptureVoiceOut *cap;
707 1a7dafce malc
    AudioState *s = &glob_audio_state;
708 8ead62cf bellard
709 8ead62cf bellard
    for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
710 d929eba5 bellard
        if (audio_pcm_info_eq (&cap->hw.info, as)) {
711 8ead62cf bellard
            return cap;
712 8ead62cf bellard
        }
713 8ead62cf bellard
    }
714 8ead62cf bellard
    return NULL;
715 8ead62cf bellard
}
716 8ead62cf bellard
717 ec36b695 bellard
static void audio_notify_capture (CaptureVoiceOut *cap, audcnotification_e cmd)
718 8ead62cf bellard
{
719 ec36b695 bellard
    struct capture_callback *cb;
720 ec36b695 bellard
721 ec36b695 bellard
#ifdef DEBUG_CAPTURE
722 ec36b695 bellard
    dolog ("notification %d sent\n", cmd);
723 ec36b695 bellard
#endif
724 ec36b695 bellard
    for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
725 ec36b695 bellard
        cb->ops.notify (cb->opaque, cmd);
726 ec36b695 bellard
    }
727 ec36b695 bellard
}
728 8ead62cf bellard
729 ec36b695 bellard
static void audio_capture_maybe_changed (CaptureVoiceOut *cap, int enabled)
730 ec36b695 bellard
{
731 ec36b695 bellard
    if (cap->hw.enabled != enabled) {
732 ec36b695 bellard
        audcnotification_e cmd;
733 8ead62cf bellard
        cap->hw.enabled = enabled;
734 ec36b695 bellard
        cmd = enabled ? AUD_CNOTIFY_ENABLE : AUD_CNOTIFY_DISABLE;
735 ec36b695 bellard
        audio_notify_capture (cap, cmd);
736 8ead62cf bellard
    }
737 8ead62cf bellard
}
738 8ead62cf bellard
739 8ead62cf bellard
static void audio_recalc_and_notify_capture (CaptureVoiceOut *cap)
740 8ead62cf bellard
{
741 8ead62cf bellard
    HWVoiceOut *hw = &cap->hw;
742 8ead62cf bellard
    SWVoiceOut *sw;
743 8ead62cf bellard
    int enabled = 0;
744 8ead62cf bellard
745 ec36b695 bellard
    for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
746 8ead62cf bellard
        if (sw->active) {
747 8ead62cf bellard
            enabled = 1;
748 8ead62cf bellard
            break;
749 8ead62cf bellard
        }
750 8ead62cf bellard
    }
751 ec36b695 bellard
    audio_capture_maybe_changed (cap, enabled);
752 8ead62cf bellard
}
753 8ead62cf bellard
754 8ead62cf bellard
static void audio_detach_capture (HWVoiceOut *hw)
755 8ead62cf bellard
{
756 ec36b695 bellard
    SWVoiceCap *sc = hw->cap_head.lh_first;
757 ec36b695 bellard
758 ec36b695 bellard
    while (sc) {
759 ec36b695 bellard
        SWVoiceCap *sc1 = sc->entries.le_next;
760 ec36b695 bellard
        SWVoiceOut *sw = &sc->sw;
761 ec36b695 bellard
        CaptureVoiceOut *cap = sc->cap;
762 ec36b695 bellard
        int was_active = sw->active;
763 8ead62cf bellard
764 8ead62cf bellard
        if (sw->rate) {
765 8ead62cf bellard
            st_rate_stop (sw->rate);
766 8ead62cf bellard
            sw->rate = NULL;
767 8ead62cf bellard
        }
768 8ead62cf bellard
769 72cf2d4f Blue Swirl
        QLIST_REMOVE (sw, entries);
770 72cf2d4f Blue Swirl
        QLIST_REMOVE (sc, entries);
771 ec36b695 bellard
        qemu_free (sc);
772 ec36b695 bellard
        if (was_active) {
773 ec36b695 bellard
            /* We have removed soft voice from the capture:
774 ec36b695 bellard
               this might have changed the overall status of the capture
775 ec36b695 bellard
               since this might have been the only active voice */
776 ec36b695 bellard
            audio_recalc_and_notify_capture (cap);
777 ec36b695 bellard
        }
778 ec36b695 bellard
        sc = sc1;
779 8ead62cf bellard
    }
780 8ead62cf bellard
}
781 8ead62cf bellard
782 1a7dafce malc
static int audio_attach_capture (HWVoiceOut *hw)
783 8ead62cf bellard
{
784 1a7dafce malc
    AudioState *s = &glob_audio_state;
785 8ead62cf bellard
    CaptureVoiceOut *cap;
786 8ead62cf bellard
787 8ead62cf bellard
    audio_detach_capture (hw);
788 8ead62cf bellard
    for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
789 ec36b695 bellard
        SWVoiceCap *sc;
790 8ead62cf bellard
        SWVoiceOut *sw;
791 ec36b695 bellard
        HWVoiceOut *hw_cap = &cap->hw;
792 8ead62cf bellard
793 ec36b695 bellard
        sc = audio_calloc (AUDIO_FUNC, 1, sizeof (*sc));
794 ec36b695 bellard
        if (!sc) {
795 8ead62cf bellard
            dolog ("Could not allocate soft capture voice (%zu bytes)\n",
796 ec36b695 bellard
                   sizeof (*sc));
797 8ead62cf bellard
            return -1;
798 8ead62cf bellard
        }
799 8ead62cf bellard
800 ec36b695 bellard
        sc->cap = cap;
801 ec36b695 bellard
        sw = &sc->sw;
802 8ead62cf bellard
        sw->hw = hw_cap;
803 ec36b695 bellard
        sw->info = hw->info;
804 8ead62cf bellard
        sw->empty = 1;
805 8ead62cf bellard
        sw->active = hw->enabled;
806 8ead62cf bellard
        sw->conv = noop_conv;
807 8ead62cf bellard
        sw->ratio = ((int64_t) hw_cap->info.freq << 32) / sw->info.freq;
808 8ead62cf bellard
        sw->rate = st_rate_start (sw->info.freq, hw_cap->info.freq);
809 8ead62cf bellard
        if (!sw->rate) {
810 8ead62cf bellard
            dolog ("Could not start rate conversion for `%s'\n", SW_NAME (sw));
811 8ead62cf bellard
            qemu_free (sw);
812 8ead62cf bellard
            return -1;
813 8ead62cf bellard
        }
814 72cf2d4f Blue Swirl
        QLIST_INSERT_HEAD (&hw_cap->sw_head, sw, entries);
815 72cf2d4f Blue Swirl
        QLIST_INSERT_HEAD (&hw->cap_head, sc, entries);
816 ec36b695 bellard
#ifdef DEBUG_CAPTURE
817 ec36b695 bellard
        asprintf (&sw->name, "for %p %d,%d,%d",
818 ec36b695 bellard
                  hw, sw->info.freq, sw->info.bits, sw->info.nchannels);
819 ec36b695 bellard
        dolog ("Added %s active = %d\n", sw->name, sw->active);
820 ec36b695 bellard
#endif
821 8ead62cf bellard
        if (sw->active) {
822 ec36b695 bellard
            audio_capture_maybe_changed (cap, 1);
823 8ead62cf bellard
        }
824 8ead62cf bellard
    }
825 8ead62cf bellard
    return 0;
826 8ead62cf bellard
}
827 8ead62cf bellard
828 8ead62cf bellard
/*
829 1d14ffa9 bellard
 * Hard voice (capture)
830 1d14ffa9 bellard
 */
831 c0fe3827 bellard
static int audio_pcm_hw_find_min_in (HWVoiceIn *hw)
832 85571bc7 bellard
{
833 1d14ffa9 bellard
    SWVoiceIn *sw;
834 1d14ffa9 bellard
    int m = hw->total_samples_captured;
835 1d14ffa9 bellard
836 1d14ffa9 bellard
    for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
837 1d14ffa9 bellard
        if (sw->active) {
838 1d14ffa9 bellard
            m = audio_MIN (m, sw->total_hw_samples_acquired);
839 1d14ffa9 bellard
        }
840 85571bc7 bellard
    }
841 1d14ffa9 bellard
    return m;
842 85571bc7 bellard
}
843 85571bc7 bellard
844 1d14ffa9 bellard
int audio_pcm_hw_get_live_in (HWVoiceIn *hw)
845 85571bc7 bellard
{
846 1d14ffa9 bellard
    int live = hw->total_samples_captured - audio_pcm_hw_find_min_in (hw);
847 1d14ffa9 bellard
    if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
848 1d14ffa9 bellard
        dolog ("live=%d hw->samples=%d\n", live, hw->samples);
849 1d14ffa9 bellard
        return 0;
850 85571bc7 bellard
    }
851 1d14ffa9 bellard
    return live;
852 85571bc7 bellard
}
853 85571bc7 bellard
854 ddabec73 malc
int audio_pcm_hw_clip_out (HWVoiceOut *hw, void *pcm_buf,
855 ddabec73 malc
                           int live, int pending)
856 ddabec73 malc
{
857 ddabec73 malc
    int left = hw->samples - pending;
858 ddabec73 malc
    int len = audio_MIN (left, live);
859 ddabec73 malc
    int clipped = 0;
860 ddabec73 malc
861 ddabec73 malc
    while (len) {
862 ddabec73 malc
        struct st_sample *src = hw->mix_buf + hw->rpos;
863 ddabec73 malc
        uint8_t *dst = advance (pcm_buf, hw->rpos << hw->info.shift);
864 ddabec73 malc
        int samples_till_end_of_buf = hw->samples - hw->rpos;
865 ddabec73 malc
        int samples_to_clip = audio_MIN (len, samples_till_end_of_buf);
866 ddabec73 malc
867 ddabec73 malc
        hw->clip (dst, src, samples_to_clip);
868 ddabec73 malc
869 ddabec73 malc
        hw->rpos = (hw->rpos + samples_to_clip) % hw->samples;
870 ddabec73 malc
        len -= samples_to_clip;
871 ddabec73 malc
        clipped += samples_to_clip;
872 ddabec73 malc
    }
873 ddabec73 malc
    return clipped;
874 ddabec73 malc
}
875 ddabec73 malc
876 1d14ffa9 bellard
/*
877 1d14ffa9 bellard
 * Soft voice (capture)
878 1d14ffa9 bellard
 */
879 1d14ffa9 bellard
static int audio_pcm_sw_get_rpos_in (SWVoiceIn *sw)
880 1d14ffa9 bellard
{
881 1d14ffa9 bellard
    HWVoiceIn *hw = sw->hw;
882 1d14ffa9 bellard
    int live = hw->total_samples_captured - sw->total_hw_samples_acquired;
883 1d14ffa9 bellard
    int rpos;
884 1d14ffa9 bellard
885 1d14ffa9 bellard
    if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
886 1d14ffa9 bellard
        dolog ("live=%d hw->samples=%d\n", live, hw->samples);
887 1d14ffa9 bellard
        return 0;
888 1d14ffa9 bellard
    }
889 1d14ffa9 bellard
890 1d14ffa9 bellard
    rpos = hw->wpos - live;
891 1d14ffa9 bellard
    if (rpos >= 0) {
892 1d14ffa9 bellard
        return rpos;
893 85571bc7 bellard
    }
894 85571bc7 bellard
    else {
895 1d14ffa9 bellard
        return hw->samples + rpos;
896 85571bc7 bellard
    }
897 85571bc7 bellard
}
898 85571bc7 bellard
899 1d14ffa9 bellard
int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int size)
900 85571bc7 bellard
{
901 1d14ffa9 bellard
    HWVoiceIn *hw = sw->hw;
902 1d14ffa9 bellard
    int samples, live, ret = 0, swlim, isamp, osamp, rpos, total = 0;
903 1ea879e5 malc
    struct st_sample *src, *dst = sw->buf;
904 1d14ffa9 bellard
905 1d14ffa9 bellard
    rpos = audio_pcm_sw_get_rpos_in (sw) % hw->samples;
906 1d14ffa9 bellard
907 1d14ffa9 bellard
    live = hw->total_samples_captured - sw->total_hw_samples_acquired;
908 1d14ffa9 bellard
    if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
909 1d14ffa9 bellard
        dolog ("live_in=%d hw->samples=%d\n", live, hw->samples);
910 1d14ffa9 bellard
        return 0;
911 1d14ffa9 bellard
    }
912 1d14ffa9 bellard
913 1d14ffa9 bellard
    samples = size >> sw->info.shift;
914 1d14ffa9 bellard
    if (!live) {
915 1d14ffa9 bellard
        return 0;
916 1d14ffa9 bellard
    }
917 85571bc7 bellard
918 1d14ffa9 bellard
    swlim = (live * sw->ratio) >> 32;
919 1d14ffa9 bellard
    swlim = audio_MIN (swlim, samples);
920 85571bc7 bellard
921 1d14ffa9 bellard
    while (swlim) {
922 1d14ffa9 bellard
        src = hw->conv_buf + rpos;
923 1d14ffa9 bellard
        isamp = hw->wpos - rpos;
924 1d14ffa9 bellard
        /* XXX: <= ? */
925 1d14ffa9 bellard
        if (isamp <= 0) {
926 1d14ffa9 bellard
            isamp = hw->samples - rpos;
927 1d14ffa9 bellard
        }
928 85571bc7 bellard
929 1d14ffa9 bellard
        if (!isamp) {
930 1d14ffa9 bellard
            break;
931 1d14ffa9 bellard
        }
932 1d14ffa9 bellard
        osamp = swlim;
933 85571bc7 bellard
934 1d14ffa9 bellard
        if (audio_bug (AUDIO_FUNC, osamp < 0)) {
935 1d14ffa9 bellard
            dolog ("osamp=%d\n", osamp);
936 c0fe3827 bellard
            return 0;
937 1d14ffa9 bellard
        }
938 85571bc7 bellard
939 1d14ffa9 bellard
        st_rate_flow (sw->rate, src, dst, &isamp, &osamp);
940 1d14ffa9 bellard
        swlim -= osamp;
941 1d14ffa9 bellard
        rpos = (rpos + isamp) % hw->samples;
942 1d14ffa9 bellard
        dst += osamp;
943 1d14ffa9 bellard
        ret += osamp;
944 1d14ffa9 bellard
        total += isamp;
945 1d14ffa9 bellard
    }
946 85571bc7 bellard
947 571ec3d6 bellard
    sw->clip (buf, sw->buf, ret);
948 1d14ffa9 bellard
    sw->total_hw_samples_acquired += total;
949 1d14ffa9 bellard
    return ret << sw->info.shift;
950 85571bc7 bellard
}
951 85571bc7 bellard
952 1d14ffa9 bellard
/*
953 1d14ffa9 bellard
 * Hard voice (playback)
954 1d14ffa9 bellard
 */
955 c0fe3827 bellard
static int audio_pcm_hw_find_min_out (HWVoiceOut *hw, int *nb_livep)
956 1d14ffa9 bellard
{
957 c0fe3827 bellard
    SWVoiceOut *sw;
958 c0fe3827 bellard
    int m = INT_MAX;
959 c0fe3827 bellard
    int nb_live = 0;
960 85571bc7 bellard
961 c0fe3827 bellard
    for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
962 c0fe3827 bellard
        if (sw->active || !sw->empty) {
963 c0fe3827 bellard
            m = audio_MIN (m, sw->total_hw_samples_mixed);
964 c0fe3827 bellard
            nb_live += 1;
965 c0fe3827 bellard
        }
966 85571bc7 bellard
    }
967 c0fe3827 bellard
968 c0fe3827 bellard
    *nb_livep = nb_live;
969 c0fe3827 bellard
    return m;
970 1d14ffa9 bellard
}
971 85571bc7 bellard
972 bdff253c malc
static int audio_pcm_hw_get_live_out (HWVoiceOut *hw, int *nb_live)
973 1d14ffa9 bellard
{
974 1d14ffa9 bellard
    int smin;
975 bdff253c malc
    int nb_live1;
976 85571bc7 bellard
977 bdff253c malc
    smin = audio_pcm_hw_find_min_out (hw, &nb_live1);
978 bdff253c malc
    if (nb_live) {
979 bdff253c malc
        *nb_live = nb_live1;
980 85571bc7 bellard
    }
981 bdff253c malc
982 bdff253c malc
    if (nb_live1) {
983 1d14ffa9 bellard
        int live = smin;
984 1d14ffa9 bellard
985 1d14ffa9 bellard
        if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
986 1d14ffa9 bellard
            dolog ("live=%d hw->samples=%d\n", live, hw->samples);
987 1d14ffa9 bellard
            return 0;
988 85571bc7 bellard
        }
989 1d14ffa9 bellard
        return live;
990 85571bc7 bellard
    }
991 bdff253c malc
    return 0;
992 85571bc7 bellard
}
993 85571bc7 bellard
994 1d14ffa9 bellard
/*
995 1d14ffa9 bellard
 * Soft voice (playback)
996 1d14ffa9 bellard
 */
997 1d14ffa9 bellard
int audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int size)
998 85571bc7 bellard
{
999 1d14ffa9 bellard
    int hwsamples, samples, isamp, osamp, wpos, live, dead, left, swlim, blck;
1000 1d14ffa9 bellard
    int ret = 0, pos = 0, total = 0;
1001 85571bc7 bellard
1002 1d14ffa9 bellard
    if (!sw) {
1003 1d14ffa9 bellard
        return size;
1004 1d14ffa9 bellard
    }
1005 85571bc7 bellard
1006 1d14ffa9 bellard
    hwsamples = sw->hw->samples;
1007 85571bc7 bellard
1008 1d14ffa9 bellard
    live = sw->total_hw_samples_mixed;
1009 1d14ffa9 bellard
    if (audio_bug (AUDIO_FUNC, live < 0 || live > hwsamples)){
1010 1d14ffa9 bellard
        dolog ("live=%d hw->samples=%d\n", live, hwsamples);
1011 1d14ffa9 bellard
        return 0;
1012 1d14ffa9 bellard
    }
1013 85571bc7 bellard
1014 1d14ffa9 bellard
    if (live == hwsamples) {
1015 ec36b695 bellard
#ifdef DEBUG_OUT
1016 ec36b695 bellard
        dolog ("%s is full %d\n", sw->name, live);
1017 ec36b695 bellard
#endif
1018 1d14ffa9 bellard
        return 0;
1019 1d14ffa9 bellard
    }
1020 85571bc7 bellard
1021 1d14ffa9 bellard
    wpos = (sw->hw->rpos + live) % hwsamples;
1022 1d14ffa9 bellard
    samples = size >> sw->info.shift;
1023 85571bc7 bellard
1024 1d14ffa9 bellard
    dead = hwsamples - live;
1025 1d14ffa9 bellard
    swlim = ((int64_t) dead << 32) / sw->ratio;
1026 1d14ffa9 bellard
    swlim = audio_MIN (swlim, samples);
1027 1d14ffa9 bellard
    if (swlim) {
1028 1d14ffa9 bellard
        sw->conv (sw->buf, buf, swlim, &sw->vol);
1029 1d14ffa9 bellard
    }
1030 1d14ffa9 bellard
1031 1d14ffa9 bellard
    while (swlim) {
1032 1d14ffa9 bellard
        dead = hwsamples - live;
1033 1d14ffa9 bellard
        left = hwsamples - wpos;
1034 1d14ffa9 bellard
        blck = audio_MIN (dead, left);
1035 1d14ffa9 bellard
        if (!blck) {
1036 1d14ffa9 bellard
            break;
1037 1d14ffa9 bellard
        }
1038 1d14ffa9 bellard
        isamp = swlim;
1039 1d14ffa9 bellard
        osamp = blck;
1040 1d14ffa9 bellard
        st_rate_flow_mix (
1041 1d14ffa9 bellard
            sw->rate,
1042 1d14ffa9 bellard
            sw->buf + pos,
1043 1d14ffa9 bellard
            sw->hw->mix_buf + wpos,
1044 1d14ffa9 bellard
            &isamp,
1045 1d14ffa9 bellard
            &osamp
1046 1d14ffa9 bellard
            );
1047 1d14ffa9 bellard
        ret += isamp;
1048 1d14ffa9 bellard
        swlim -= isamp;
1049 1d14ffa9 bellard
        pos += isamp;
1050 1d14ffa9 bellard
        live += osamp;
1051 1d14ffa9 bellard
        wpos = (wpos + osamp) % hwsamples;
1052 1d14ffa9 bellard
        total += osamp;
1053 1d14ffa9 bellard
    }
1054 1d14ffa9 bellard
1055 1d14ffa9 bellard
    sw->total_hw_samples_mixed += total;
1056 1d14ffa9 bellard
    sw->empty = sw->total_hw_samples_mixed == 0;
1057 1d14ffa9 bellard
1058 1d14ffa9 bellard
#ifdef DEBUG_OUT
1059 1d14ffa9 bellard
    dolog (
1060 c0fe3827 bellard
        "%s: write size %d ret %d total sw %d\n",
1061 c0fe3827 bellard
        SW_NAME (sw),
1062 1d14ffa9 bellard
        size >> sw->info.shift,
1063 1d14ffa9 bellard
        ret,
1064 c0fe3827 bellard
        sw->total_hw_samples_mixed
1065 1d14ffa9 bellard
        );
1066 1d14ffa9 bellard
#endif
1067 1d14ffa9 bellard
1068 1d14ffa9 bellard
    return ret << sw->info.shift;
1069 85571bc7 bellard
}
1070 85571bc7 bellard
1071 1d14ffa9 bellard
#ifdef DEBUG_AUDIO
1072 1d14ffa9 bellard
static void audio_pcm_print_info (const char *cap, struct audio_pcm_info *info)
1073 85571bc7 bellard
{
1074 1d14ffa9 bellard
    dolog ("%s: bits %d, sign %d, freq %d, nchan %d\n",
1075 1d14ffa9 bellard
           cap, info->bits, info->sign, info->freq, info->nchannels);
1076 85571bc7 bellard
}
1077 1d14ffa9 bellard
#endif
1078 85571bc7 bellard
1079 1d14ffa9 bellard
#define DAC
1080 1d14ffa9 bellard
#include "audio_template.h"
1081 1d14ffa9 bellard
#undef DAC
1082 1d14ffa9 bellard
#include "audio_template.h"
1083 1d14ffa9 bellard
1084 713a98f8 malc
/*
1085 713a98f8 malc
 * Timer
1086 713a98f8 malc
 */
1087 713a98f8 malc
static void audio_timer (void *opaque)
1088 713a98f8 malc
{
1089 713a98f8 malc
    AudioState *s = opaque;
1090 713a98f8 malc
1091 713a98f8 malc
    audio_run ("timer");
1092 713a98f8 malc
    qemu_mod_timer (s->ts, qemu_get_clock (vm_clock) + conf.period.ticks);
1093 713a98f8 malc
}
1094 713a98f8 malc
1095 713a98f8 malc
1096 713a98f8 malc
static int audio_is_timer_needed (void)
1097 713a98f8 malc
{
1098 713a98f8 malc
    HWVoiceIn *hwi = NULL;
1099 713a98f8 malc
    HWVoiceOut *hwo = NULL;
1100 713a98f8 malc
1101 713a98f8 malc
    while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
1102 713a98f8 malc
        if (!hwo->poll_mode) return 1;
1103 713a98f8 malc
    }
1104 713a98f8 malc
    while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
1105 713a98f8 malc
        if (!hwi->poll_mode) return 1;
1106 713a98f8 malc
    }
1107 713a98f8 malc
    return 0;
1108 713a98f8 malc
}
1109 713a98f8 malc
1110 713a98f8 malc
static void audio_reset_timer (void)
1111 713a98f8 malc
{
1112 713a98f8 malc
    AudioState *s = &glob_audio_state;
1113 713a98f8 malc
1114 713a98f8 malc
    if (audio_is_timer_needed ()) {
1115 713a98f8 malc
        qemu_mod_timer (s->ts, qemu_get_clock (vm_clock) + 1);
1116 713a98f8 malc
    }
1117 713a98f8 malc
    else {
1118 713a98f8 malc
        qemu_del_timer (s->ts);
1119 713a98f8 malc
    }
1120 713a98f8 malc
}
1121 713a98f8 malc
1122 713a98f8 malc
/*
1123 713a98f8 malc
 * Public API
1124 713a98f8 malc
 */
1125 1d14ffa9 bellard
int AUD_write (SWVoiceOut *sw, void *buf, int size)
1126 85571bc7 bellard
{
1127 1d14ffa9 bellard
    int bytes;
1128 85571bc7 bellard
1129 1d14ffa9 bellard
    if (!sw) {
1130 1d14ffa9 bellard
        /* XXX: Consider options */
1131 1d14ffa9 bellard
        return size;
1132 1d14ffa9 bellard
    }
1133 85571bc7 bellard
1134 1d14ffa9 bellard
    if (!sw->hw->enabled) {
1135 c0fe3827 bellard
        dolog ("Writing to disabled voice %s\n", SW_NAME (sw));
1136 85571bc7 bellard
        return 0;
1137 85571bc7 bellard
    }
1138 85571bc7 bellard
1139 1d14ffa9 bellard
    bytes = sw->hw->pcm_ops->write (sw, buf, size);
1140 1d14ffa9 bellard
    return bytes;
1141 1d14ffa9 bellard
}
1142 1d14ffa9 bellard
1143 1d14ffa9 bellard
int AUD_read (SWVoiceIn *sw, void *buf, int size)
1144 1d14ffa9 bellard
{
1145 1d14ffa9 bellard
    int bytes;
1146 85571bc7 bellard
1147 1d14ffa9 bellard
    if (!sw) {
1148 1d14ffa9 bellard
        /* XXX: Consider options */
1149 1d14ffa9 bellard
        return size;
1150 85571bc7 bellard
    }
1151 1d14ffa9 bellard
1152 1d14ffa9 bellard
    if (!sw->hw->enabled) {
1153 c0fe3827 bellard
        dolog ("Reading from disabled voice %s\n", SW_NAME (sw));
1154 1d14ffa9 bellard
        return 0;
1155 85571bc7 bellard
    }
1156 1d14ffa9 bellard
1157 1d14ffa9 bellard
    bytes = sw->hw->pcm_ops->read (sw, buf, size);
1158 1d14ffa9 bellard
    return bytes;
1159 85571bc7 bellard
}
1160 85571bc7 bellard
1161 1d14ffa9 bellard
int AUD_get_buffer_size_out (SWVoiceOut *sw)
1162 85571bc7 bellard
{
1163 c0fe3827 bellard
    return sw->hw->samples << sw->hw->info.shift;
1164 1d14ffa9 bellard
}
1165 1d14ffa9 bellard
1166 1d14ffa9 bellard
void AUD_set_active_out (SWVoiceOut *sw, int on)
1167 1d14ffa9 bellard
{
1168 1d14ffa9 bellard
    HWVoiceOut *hw;
1169 85571bc7 bellard
1170 1d14ffa9 bellard
    if (!sw) {
1171 85571bc7 bellard
        return;
1172 1d14ffa9 bellard
    }
1173 85571bc7 bellard
1174 85571bc7 bellard
    hw = sw->hw;
1175 1d14ffa9 bellard
    if (sw->active != on) {
1176 978dd635 malc
        AudioState *s = &glob_audio_state;
1177 1d14ffa9 bellard
        SWVoiceOut *temp_sw;
1178 ec36b695 bellard
        SWVoiceCap *sc;
1179 1d14ffa9 bellard
1180 1d14ffa9 bellard
        if (on) {
1181 1d14ffa9 bellard
            hw->pending_disable = 0;
1182 1d14ffa9 bellard
            if (!hw->enabled) {
1183 1d14ffa9 bellard
                hw->enabled = 1;
1184 978dd635 malc
                if (s->vm_running) {
1185 713a98f8 malc
                    hw->pcm_ops->ctl_out (hw, VOICE_ENABLE, conf.try_poll_out);
1186 713a98f8 malc
                    audio_reset_timer ();
1187 978dd635 malc
                }
1188 1d14ffa9 bellard
            }
1189 1d14ffa9 bellard
        }
1190 1d14ffa9 bellard
        else {
1191 1d14ffa9 bellard
            if (hw->enabled) {
1192 1d14ffa9 bellard
                int nb_active = 0;
1193 1d14ffa9 bellard
1194 1d14ffa9 bellard
                for (temp_sw = hw->sw_head.lh_first; temp_sw;
1195 1d14ffa9 bellard
                     temp_sw = temp_sw->entries.le_next) {
1196 1d14ffa9 bellard
                    nb_active += temp_sw->active != 0;
1197 1d14ffa9 bellard
                }
1198 1d14ffa9 bellard
1199 1d14ffa9 bellard
                hw->pending_disable = nb_active == 1;
1200 1d14ffa9 bellard
            }
1201 85571bc7 bellard
        }
1202 ec36b695 bellard
1203 ec36b695 bellard
        for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
1204 ec36b695 bellard
            sc->sw.active = hw->enabled;
1205 8ead62cf bellard
            if (hw->enabled) {
1206 ec36b695 bellard
                audio_capture_maybe_changed (sc->cap, 1);
1207 8ead62cf bellard
            }
1208 8ead62cf bellard
        }
1209 1d14ffa9 bellard
        sw->active = on;
1210 1d14ffa9 bellard
    }
1211 1d14ffa9 bellard
}
1212 1d14ffa9 bellard
1213 1d14ffa9 bellard
void AUD_set_active_in (SWVoiceIn *sw, int on)
1214 1d14ffa9 bellard
{
1215 1d14ffa9 bellard
    HWVoiceIn *hw;
1216 1d14ffa9 bellard
1217 1d14ffa9 bellard
    if (!sw) {
1218 1d14ffa9 bellard
        return;
1219 85571bc7 bellard
    }
1220 85571bc7 bellard
1221 1d14ffa9 bellard
    hw = sw->hw;
1222 85571bc7 bellard
    if (sw->active != on) {
1223 978dd635 malc
        AudioState *s = &glob_audio_state;
1224 1d14ffa9 bellard
        SWVoiceIn *temp_sw;
1225 1d14ffa9 bellard
1226 85571bc7 bellard
        if (on) {
1227 85571bc7 bellard
            if (!hw->enabled) {
1228 85571bc7 bellard
                hw->enabled = 1;
1229 978dd635 malc
                if (s->vm_running) {
1230 713a98f8 malc
                    hw->pcm_ops->ctl_in (hw, VOICE_ENABLE, conf.try_poll_in);
1231 978dd635 malc
                }
1232 85571bc7 bellard
            }
1233 1d14ffa9 bellard
            sw->total_hw_samples_acquired = hw->total_samples_captured;
1234 85571bc7 bellard
        }
1235 85571bc7 bellard
        else {
1236 1d14ffa9 bellard
            if (hw->enabled) {
1237 85571bc7 bellard
                int nb_active = 0;
1238 1d14ffa9 bellard
1239 1d14ffa9 bellard
                for (temp_sw = hw->sw_head.lh_first; temp_sw;
1240 1d14ffa9 bellard
                     temp_sw = temp_sw->entries.le_next) {
1241 1d14ffa9 bellard
                    nb_active += temp_sw->active != 0;
1242 85571bc7 bellard
                }
1243 85571bc7 bellard
1244 85571bc7 bellard
                if (nb_active == 1) {
1245 1d14ffa9 bellard
                    hw->enabled = 0;
1246 1d14ffa9 bellard
                    hw->pcm_ops->ctl_in (hw, VOICE_DISABLE);
1247 85571bc7 bellard
                }
1248 85571bc7 bellard
            }
1249 85571bc7 bellard
        }
1250 85571bc7 bellard
        sw->active = on;
1251 85571bc7 bellard
    }
1252 85571bc7 bellard
}
1253 85571bc7 bellard
1254 1d14ffa9 bellard
static int audio_get_avail (SWVoiceIn *sw)
1255 1d14ffa9 bellard
{
1256 1d14ffa9 bellard
    int live;
1257 1d14ffa9 bellard
1258 1d14ffa9 bellard
    if (!sw) {
1259 1d14ffa9 bellard
        return 0;
1260 1d14ffa9 bellard
    }
1261 1d14ffa9 bellard
1262 1d14ffa9 bellard
    live = sw->hw->total_samples_captured - sw->total_hw_samples_acquired;
1263 1d14ffa9 bellard
    if (audio_bug (AUDIO_FUNC, live < 0 || live > sw->hw->samples)) {
1264 1d14ffa9 bellard
        dolog ("live=%d sw->hw->samples=%d\n", live, sw->hw->samples);
1265 1d14ffa9 bellard
        return 0;
1266 1d14ffa9 bellard
    }
1267 1d14ffa9 bellard
1268 1d14ffa9 bellard
    ldebug (
1269 26a76461 bellard
        "%s: get_avail live %d ret %" PRId64 "\n",
1270 c0fe3827 bellard
        SW_NAME (sw),
1271 1d14ffa9 bellard
        live, (((int64_t) live << 32) / sw->ratio) << sw->info.shift
1272 1d14ffa9 bellard
        );
1273 1d14ffa9 bellard
1274 1d14ffa9 bellard
    return (((int64_t) live << 32) / sw->ratio) << sw->info.shift;
1275 1d14ffa9 bellard
}
1276 1d14ffa9 bellard
1277 1d14ffa9 bellard
static int audio_get_free (SWVoiceOut *sw)
1278 1d14ffa9 bellard
{
1279 1d14ffa9 bellard
    int live, dead;
1280 1d14ffa9 bellard
1281 1d14ffa9 bellard
    if (!sw) {
1282 1d14ffa9 bellard
        return 0;
1283 1d14ffa9 bellard
    }
1284 1d14ffa9 bellard
1285 1d14ffa9 bellard
    live = sw->total_hw_samples_mixed;
1286 1d14ffa9 bellard
1287 1d14ffa9 bellard
    if (audio_bug (AUDIO_FUNC, live < 0 || live > sw->hw->samples)) {
1288 1d14ffa9 bellard
        dolog ("live=%d sw->hw->samples=%d\n", live, sw->hw->samples);
1289 c0fe3827 bellard
        return 0;
1290 1d14ffa9 bellard
    }
1291 1d14ffa9 bellard
1292 1d14ffa9 bellard
    dead = sw->hw->samples - live;
1293 1d14ffa9 bellard
1294 1d14ffa9 bellard
#ifdef DEBUG_OUT
1295 26a76461 bellard
    dolog ("%s: get_free live %d dead %d ret %" PRId64 "\n",
1296 c0fe3827 bellard
           SW_NAME (sw),
1297 1d14ffa9 bellard
           live, dead, (((int64_t) dead << 32) / sw->ratio) << sw->info.shift);
1298 85571bc7 bellard
#endif
1299 1d14ffa9 bellard
1300 1d14ffa9 bellard
    return (((int64_t) dead << 32) / sw->ratio) << sw->info.shift;
1301 1d14ffa9 bellard
}
1302 1d14ffa9 bellard
1303 8ead62cf bellard
static void audio_capture_mix_and_clear (HWVoiceOut *hw, int rpos, int samples)
1304 8ead62cf bellard
{
1305 8ead62cf bellard
    int n;
1306 8ead62cf bellard
1307 8ead62cf bellard
    if (hw->enabled) {
1308 ec36b695 bellard
        SWVoiceCap *sc;
1309 8ead62cf bellard
1310 ec36b695 bellard
        for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
1311 ec36b695 bellard
            SWVoiceOut *sw = &sc->sw;
1312 8ead62cf bellard
            int rpos2 = rpos;
1313 8ead62cf bellard
1314 8ead62cf bellard
            n = samples;
1315 8ead62cf bellard
            while (n) {
1316 8ead62cf bellard
                int till_end_of_hw = hw->samples - rpos2;
1317 8ead62cf bellard
                int to_write = audio_MIN (till_end_of_hw, n);
1318 8ead62cf bellard
                int bytes = to_write << hw->info.shift;
1319 8ead62cf bellard
                int written;
1320 8ead62cf bellard
1321 8ead62cf bellard
                sw->buf = hw->mix_buf + rpos2;
1322 8ead62cf bellard
                written = audio_pcm_sw_write (sw, NULL, bytes);
1323 8ead62cf bellard
                if (written - bytes) {
1324 ec36b695 bellard
                    dolog ("Could not mix %d bytes into a capture "
1325 ec36b695 bellard
                           "buffer, mixed %d\n",
1326 ec36b695 bellard
                           bytes, written);
1327 8ead62cf bellard
                    break;
1328 8ead62cf bellard
                }
1329 8ead62cf bellard
                n -= to_write;
1330 8ead62cf bellard
                rpos2 = (rpos2 + to_write) % hw->samples;
1331 8ead62cf bellard
            }
1332 8ead62cf bellard
        }
1333 8ead62cf bellard
    }
1334 8ead62cf bellard
1335 8ead62cf bellard
    n = audio_MIN (samples, hw->samples - rpos);
1336 8ead62cf bellard
    mixeng_clear (hw->mix_buf + rpos, n);
1337 8ead62cf bellard
    mixeng_clear (hw->mix_buf, samples - n);
1338 8ead62cf bellard
}
1339 8ead62cf bellard
1340 c0fe3827 bellard
static void audio_run_out (AudioState *s)
1341 1d14ffa9 bellard
{
1342 1d14ffa9 bellard
    HWVoiceOut *hw = NULL;
1343 1d14ffa9 bellard
    SWVoiceOut *sw;
1344 1d14ffa9 bellard
1345 1a7dafce malc
    while ((hw = audio_pcm_hw_find_any_enabled_out (hw))) {
1346 1d14ffa9 bellard
        int played;
1347 8ead62cf bellard
        int live, free, nb_live, cleanup_required, prev_rpos;
1348 1d14ffa9 bellard
1349 bdff253c malc
        live = audio_pcm_hw_get_live_out (hw, &nb_live);
1350 1d14ffa9 bellard
        if (!nb_live) {
1351 1d14ffa9 bellard
            live = 0;
1352 1d14ffa9 bellard
        }
1353 c0fe3827 bellard
1354 1d14ffa9 bellard
        if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
1355 1d14ffa9 bellard
            dolog ("live=%d hw->samples=%d\n", live, hw->samples);
1356 c0fe3827 bellard
            continue;
1357 1d14ffa9 bellard
        }
1358 1d14ffa9 bellard
1359 1d14ffa9 bellard
        if (hw->pending_disable && !nb_live) {
1360 ec36b695 bellard
            SWVoiceCap *sc;
1361 1d14ffa9 bellard
#ifdef DEBUG_OUT
1362 1d14ffa9 bellard
            dolog ("Disabling voice\n");
1363 85571bc7 bellard
#endif
1364 1d14ffa9 bellard
            hw->enabled = 0;
1365 1d14ffa9 bellard
            hw->pending_disable = 0;
1366 1d14ffa9 bellard
            hw->pcm_ops->ctl_out (hw, VOICE_DISABLE);
1367 ec36b695 bellard
            for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
1368 ec36b695 bellard
                sc->sw.active = 0;
1369 ec36b695 bellard
                audio_recalc_and_notify_capture (sc->cap);
1370 8ead62cf bellard
            }
1371 1d14ffa9 bellard
            continue;
1372 1d14ffa9 bellard
        }
1373 1d14ffa9 bellard
1374 1d14ffa9 bellard
        if (!live) {
1375 1d14ffa9 bellard
            for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
1376 1d14ffa9 bellard
                if (sw->active) {
1377 1d14ffa9 bellard
                    free = audio_get_free (sw);
1378 1d14ffa9 bellard
                    if (free > 0) {
1379 1d14ffa9 bellard
                        sw->callback.fn (sw->callback.opaque, free);
1380 1d14ffa9 bellard
                    }
1381 1d14ffa9 bellard
                }
1382 1d14ffa9 bellard
            }
1383 1d14ffa9 bellard
            continue;
1384 1d14ffa9 bellard
        }
1385 1d14ffa9 bellard
1386 8ead62cf bellard
        prev_rpos = hw->rpos;
1387 bdff253c malc
        played = hw->pcm_ops->run_out (hw, live);
1388 1d14ffa9 bellard
        if (audio_bug (AUDIO_FUNC, hw->rpos >= hw->samples)) {
1389 1d14ffa9 bellard
            dolog ("hw->rpos=%d hw->samples=%d played=%d\n",
1390 1d14ffa9 bellard
                   hw->rpos, hw->samples, played);
1391 1d14ffa9 bellard
            hw->rpos = 0;
1392 1d14ffa9 bellard
        }
1393 1d14ffa9 bellard
1394 1d14ffa9 bellard
#ifdef DEBUG_OUT
1395 c0fe3827 bellard
        dolog ("played=%d\n", played);
1396 85571bc7 bellard
#endif
1397 1d14ffa9 bellard
1398 1d14ffa9 bellard
        if (played) {
1399 1d14ffa9 bellard
            hw->ts_helper += played;
1400 8ead62cf bellard
            audio_capture_mix_and_clear (hw, prev_rpos, played);
1401 1d14ffa9 bellard
        }
1402 1d14ffa9 bellard
1403 c0fe3827 bellard
        cleanup_required = 0;
1404 1d14ffa9 bellard
        for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
1405 1d14ffa9 bellard
            if (!sw->active && sw->empty) {
1406 1d14ffa9 bellard
                continue;
1407 1d14ffa9 bellard
            }
1408 1d14ffa9 bellard
1409 1d14ffa9 bellard
            if (audio_bug (AUDIO_FUNC, played > sw->total_hw_samples_mixed)) {
1410 1d14ffa9 bellard
                dolog ("played=%d sw->total_hw_samples_mixed=%d\n",
1411 1d14ffa9 bellard
                       played, sw->total_hw_samples_mixed);
1412 1d14ffa9 bellard
                played = sw->total_hw_samples_mixed;
1413 1d14ffa9 bellard
            }
1414 1d14ffa9 bellard
1415 1d14ffa9 bellard
            sw->total_hw_samples_mixed -= played;
1416 1d14ffa9 bellard
1417 1d14ffa9 bellard
            if (!sw->total_hw_samples_mixed) {
1418 1d14ffa9 bellard
                sw->empty = 1;
1419 c0fe3827 bellard
                cleanup_required |= !sw->active && !sw->callback.fn;
1420 1d14ffa9 bellard
            }
1421 1d14ffa9 bellard
1422 1d14ffa9 bellard
            if (sw->active) {
1423 1d14ffa9 bellard
                free = audio_get_free (sw);
1424 1d14ffa9 bellard
                if (free > 0) {
1425 1d14ffa9 bellard
                    sw->callback.fn (sw->callback.opaque, free);
1426 1d14ffa9 bellard
                }
1427 1d14ffa9 bellard
            }
1428 1d14ffa9 bellard
        }
1429 c0fe3827 bellard
1430 c0fe3827 bellard
        if (cleanup_required) {
1431 ec36b695 bellard
            SWVoiceOut *sw1;
1432 ec36b695 bellard
1433 ec36b695 bellard
            sw = hw->sw_head.lh_first;
1434 ec36b695 bellard
            while (sw) {
1435 ec36b695 bellard
                sw1 = sw->entries.le_next;
1436 c0fe3827 bellard
                if (!sw->active && !sw->callback.fn) {
1437 c0fe3827 bellard
#ifdef DEBUG_PLIVE
1438 c0fe3827 bellard
                    dolog ("Finishing with old voice\n");
1439 c0fe3827 bellard
#endif
1440 1a7dafce malc
                    audio_close_out (sw);
1441 c0fe3827 bellard
                }
1442 ec36b695 bellard
                sw = sw1;
1443 c0fe3827 bellard
            }
1444 c0fe3827 bellard
        }
1445 1d14ffa9 bellard
    }
1446 1d14ffa9 bellard
}
1447 1d14ffa9 bellard
1448 c0fe3827 bellard
static void audio_run_in (AudioState *s)
1449 1d14ffa9 bellard
{
1450 1d14ffa9 bellard
    HWVoiceIn *hw = NULL;
1451 1d14ffa9 bellard
1452 1a7dafce malc
    while ((hw = audio_pcm_hw_find_any_enabled_in (hw))) {
1453 1d14ffa9 bellard
        SWVoiceIn *sw;
1454 1d14ffa9 bellard
        int captured, min;
1455 1d14ffa9 bellard
1456 1d14ffa9 bellard
        captured = hw->pcm_ops->run_in (hw);
1457 1d14ffa9 bellard
1458 1d14ffa9 bellard
        min = audio_pcm_hw_find_min_in (hw);
1459 1d14ffa9 bellard
        hw->total_samples_captured += captured - min;
1460 1d14ffa9 bellard
        hw->ts_helper += captured;
1461 1d14ffa9 bellard
1462 1d14ffa9 bellard
        for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
1463 1d14ffa9 bellard
            sw->total_hw_samples_acquired -= min;
1464 1d14ffa9 bellard
1465 1d14ffa9 bellard
            if (sw->active) {
1466 1d14ffa9 bellard
                int avail;
1467 1d14ffa9 bellard
1468 1d14ffa9 bellard
                avail = audio_get_avail (sw);
1469 1d14ffa9 bellard
                if (avail > 0) {
1470 1d14ffa9 bellard
                    sw->callback.fn (sw->callback.opaque, avail);
1471 1d14ffa9 bellard
                }
1472 1d14ffa9 bellard
            }
1473 1d14ffa9 bellard
        }
1474 1d14ffa9 bellard
    }
1475 1d14ffa9 bellard
}
1476 1d14ffa9 bellard
1477 8ead62cf bellard
static void audio_run_capture (AudioState *s)
1478 8ead62cf bellard
{
1479 8ead62cf bellard
    CaptureVoiceOut *cap;
1480 8ead62cf bellard
1481 8ead62cf bellard
    for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
1482 8ead62cf bellard
        int live, rpos, captured;
1483 8ead62cf bellard
        HWVoiceOut *hw = &cap->hw;
1484 8ead62cf bellard
        SWVoiceOut *sw;
1485 8ead62cf bellard
1486 bdff253c malc
        captured = live = audio_pcm_hw_get_live_out (hw, NULL);
1487 8ead62cf bellard
        rpos = hw->rpos;
1488 8ead62cf bellard
        while (live) {
1489 8ead62cf bellard
            int left = hw->samples - rpos;
1490 8ead62cf bellard
            int to_capture = audio_MIN (live, left);
1491 1ea879e5 malc
            struct st_sample *src;
1492 8ead62cf bellard
            struct capture_callback *cb;
1493 8ead62cf bellard
1494 8ead62cf bellard
            src = hw->mix_buf + rpos;
1495 8ead62cf bellard
            hw->clip (cap->buf, src, to_capture);
1496 8ead62cf bellard
            mixeng_clear (src, to_capture);
1497 8ead62cf bellard
1498 8ead62cf bellard
            for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
1499 8ead62cf bellard
                cb->ops.capture (cb->opaque, cap->buf,
1500 8ead62cf bellard
                                 to_capture << hw->info.shift);
1501 8ead62cf bellard
            }
1502 8ead62cf bellard
            rpos = (rpos + to_capture) % hw->samples;
1503 8ead62cf bellard
            live -= to_capture;
1504 8ead62cf bellard
        }
1505 8ead62cf bellard
        hw->rpos = rpos;
1506 8ead62cf bellard
1507 8ead62cf bellard
        for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
1508 8ead62cf bellard
            if (!sw->active && sw->empty) {
1509 8ead62cf bellard
                continue;
1510 8ead62cf bellard
            }
1511 8ead62cf bellard
1512 8ead62cf bellard
            if (audio_bug (AUDIO_FUNC, captured > sw->total_hw_samples_mixed)) {
1513 8ead62cf bellard
                dolog ("captured=%d sw->total_hw_samples_mixed=%d\n",
1514 8ead62cf bellard
                       captured, sw->total_hw_samples_mixed);
1515 8ead62cf bellard
                captured = sw->total_hw_samples_mixed;
1516 8ead62cf bellard
            }
1517 8ead62cf bellard
1518 8ead62cf bellard
            sw->total_hw_samples_mixed -= captured;
1519 8ead62cf bellard
            sw->empty = sw->total_hw_samples_mixed == 0;
1520 8ead62cf bellard
        }
1521 8ead62cf bellard
    }
1522 8ead62cf bellard
}
1523 8ead62cf bellard
1524 713a98f8 malc
void audio_run (const char *msg)
1525 571ec3d6 bellard
{
1526 713a98f8 malc
    AudioState *s = &glob_audio_state;
1527 571ec3d6 bellard
1528 571ec3d6 bellard
    audio_run_out (s);
1529 571ec3d6 bellard
    audio_run_in (s);
1530 8ead62cf bellard
    audio_run_capture (s);
1531 713a98f8 malc
#ifdef DEBUG_POLL
1532 713a98f8 malc
    {
1533 713a98f8 malc
        static double prevtime;
1534 713a98f8 malc
        double currtime;
1535 713a98f8 malc
        struct timeval tv;
1536 571ec3d6 bellard
1537 713a98f8 malc
        if (gettimeofday (&tv, NULL)) {
1538 713a98f8 malc
            perror ("audio_run: gettimeofday");
1539 713a98f8 malc
            return;
1540 713a98f8 malc
        }
1541 713a98f8 malc
1542 713a98f8 malc
        currtime = tv.tv_sec + tv.tv_usec * 1e-6;
1543 713a98f8 malc
        dolog ("Elapsed since last %s: %f\n", msg, currtime - prevtime);
1544 713a98f8 malc
        prevtime = currtime;
1545 713a98f8 malc
    }
1546 713a98f8 malc
#endif
1547 571ec3d6 bellard
}
1548 571ec3d6 bellard
1549 1d14ffa9 bellard
static struct audio_option audio_options[] = {
1550 1d14ffa9 bellard
    /* DAC */
1551 98f9f48c malc
    {
1552 98f9f48c malc
        .name  = "DAC_FIXED_SETTINGS",
1553 98f9f48c malc
        .tag   = AUD_OPT_BOOL,
1554 98f9f48c malc
        .valp  = &conf.fixed_out.enabled,
1555 98f9f48c malc
        .descr = "Use fixed settings for host DAC"
1556 98f9f48c malc
    },
1557 98f9f48c malc
    {
1558 98f9f48c malc
        .name  = "DAC_FIXED_FREQ",
1559 98f9f48c malc
        .tag   = AUD_OPT_INT,
1560 98f9f48c malc
        .valp  = &conf.fixed_out.settings.freq,
1561 98f9f48c malc
        .descr = "Frequency for fixed host DAC"
1562 98f9f48c malc
    },
1563 98f9f48c malc
    {
1564 98f9f48c malc
        .name  = "DAC_FIXED_FMT",
1565 98f9f48c malc
        .tag   = AUD_OPT_FMT,
1566 98f9f48c malc
        .valp  = &conf.fixed_out.settings.fmt,
1567 98f9f48c malc
        .descr = "Format for fixed host DAC"
1568 98f9f48c malc
    },
1569 98f9f48c malc
    {
1570 98f9f48c malc
        .name  = "DAC_FIXED_CHANNELS",
1571 98f9f48c malc
        .tag   = AUD_OPT_INT,
1572 98f9f48c malc
        .valp  = &conf.fixed_out.settings.nchannels,
1573 98f9f48c malc
        .descr = "Number of channels for fixed DAC (1 - mono, 2 - stereo)"
1574 98f9f48c malc
    },
1575 98f9f48c malc
    {
1576 98f9f48c malc
        .name  = "DAC_VOICES",
1577 98f9f48c malc
        .tag   = AUD_OPT_INT,
1578 98f9f48c malc
        .valp  = &conf.fixed_out.nb_voices,
1579 98f9f48c malc
        .descr = "Number of voices for DAC"
1580 98f9f48c malc
    },
1581 713a98f8 malc
    {
1582 713a98f8 malc
        .name  = "DAC_TRY_POLL",
1583 713a98f8 malc
        .tag   = AUD_OPT_BOOL,
1584 713a98f8 malc
        .valp  = &conf.try_poll_out,
1585 713a98f8 malc
        .descr = "Attempt using poll mode for DAC"
1586 713a98f8 malc
    },
1587 1d14ffa9 bellard
    /* ADC */
1588 98f9f48c malc
    {
1589 98f9f48c malc
        .name  = "ADC_FIXED_SETTINGS",
1590 98f9f48c malc
        .tag   = AUD_OPT_BOOL,
1591 98f9f48c malc
        .valp  = &conf.fixed_in.enabled,
1592 98f9f48c malc
        .descr = "Use fixed settings for host ADC"
1593 98f9f48c malc
    },
1594 98f9f48c malc
    {
1595 98f9f48c malc
        .name  = "ADC_FIXED_FREQ",
1596 98f9f48c malc
        .tag   = AUD_OPT_INT,
1597 98f9f48c malc
        .valp  = &conf.fixed_in.settings.freq,
1598 98f9f48c malc
        .descr = "Frequency for fixed host ADC"
1599 98f9f48c malc
    },
1600 98f9f48c malc
    {
1601 98f9f48c malc
        .name  = "ADC_FIXED_FMT",
1602 98f9f48c malc
        .tag   = AUD_OPT_FMT,
1603 98f9f48c malc
        .valp  = &conf.fixed_in.settings.fmt,
1604 98f9f48c malc
        .descr = "Format for fixed host ADC"
1605 98f9f48c malc
    },
1606 98f9f48c malc
    {
1607 98f9f48c malc
        .name  = "ADC_FIXED_CHANNELS",
1608 98f9f48c malc
        .tag   = AUD_OPT_INT,
1609 98f9f48c malc
        .valp  = &conf.fixed_in.settings.nchannels,
1610 98f9f48c malc
        .descr = "Number of channels for fixed ADC (1 - mono, 2 - stereo)"
1611 98f9f48c malc
    },
1612 98f9f48c malc
    {
1613 98f9f48c malc
        .name  = "ADC_VOICES",
1614 98f9f48c malc
        .tag   = AUD_OPT_INT,
1615 98f9f48c malc
        .valp  = &conf.fixed_in.nb_voices,
1616 98f9f48c malc
        .descr = "Number of voices for ADC"
1617 98f9f48c malc
    },
1618 713a98f8 malc
    {
1619 713a98f8 malc
        .name  = "ADC_TRY_POLL",
1620 713a98f8 malc
        .tag   = AUD_OPT_BOOL,
1621 0a90e344 Jan Kiszka
        .valp  = &conf.try_poll_in,
1622 713a98f8 malc
        .descr = "Attempt using poll mode for ADC"
1623 713a98f8 malc
    },
1624 1d14ffa9 bellard
    /* Misc */
1625 98f9f48c malc
    {
1626 98f9f48c malc
        .name  = "TIMER_PERIOD",
1627 98f9f48c malc
        .tag   = AUD_OPT_INT,
1628 98f9f48c malc
        .valp  = &conf.period.hertz,
1629 98f9f48c malc
        .descr = "Timer period in HZ (0 - use lowest possible)"
1630 98f9f48c malc
    },
1631 98f9f48c malc
    {
1632 98f9f48c malc
        .name  = "PLIVE",
1633 98f9f48c malc
        .tag   = AUD_OPT_BOOL,
1634 98f9f48c malc
        .valp  = &conf.plive,
1635 98f9f48c malc
        .descr = "(undocumented)"
1636 98f9f48c malc
    },
1637 98f9f48c malc
    {
1638 98f9f48c malc
        .name  = "LOG_TO_MONITOR",
1639 98f9f48c malc
        .tag   = AUD_OPT_BOOL,
1640 98f9f48c malc
        .valp  = &conf.log_to_monitor,
1641 713a98f8 malc
        .descr = "Print logging messages to monitor instead of stderr"
1642 98f9f48c malc
    },
1643 2700efa3 Juan Quintela
    { /* End of list */ }
1644 85571bc7 bellard
};
1645 85571bc7 bellard
1646 571ec3d6 bellard
static void audio_pp_nb_voices (const char *typ, int nb)
1647 571ec3d6 bellard
{
1648 571ec3d6 bellard
    switch (nb) {
1649 571ec3d6 bellard
    case 0:
1650 571ec3d6 bellard
        printf ("Does not support %s\n", typ);
1651 571ec3d6 bellard
        break;
1652 571ec3d6 bellard
    case 1:
1653 571ec3d6 bellard
        printf ("One %s voice\n", typ);
1654 571ec3d6 bellard
        break;
1655 571ec3d6 bellard
    case INT_MAX:
1656 571ec3d6 bellard
        printf ("Theoretically supports many %s voices\n", typ);
1657 571ec3d6 bellard
        break;
1658 571ec3d6 bellard
    default:
1659 571ec3d6 bellard
        printf ("Theoretically supports upto %d %s voices\n", nb, typ);
1660 571ec3d6 bellard
        break;
1661 571ec3d6 bellard
    }
1662 571ec3d6 bellard
1663 571ec3d6 bellard
}
1664 571ec3d6 bellard
1665 1d14ffa9 bellard
void AUD_help (void)
1666 1d14ffa9 bellard
{
1667 1d14ffa9 bellard
    size_t i;
1668 1d14ffa9 bellard
1669 1d14ffa9 bellard
    audio_process_options ("AUDIO", audio_options);
1670 b1503cda malc
    for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
1671 1d14ffa9 bellard
        struct audio_driver *d = drvtab[i];
1672 1d14ffa9 bellard
        if (d->options) {
1673 1d14ffa9 bellard
            audio_process_options (d->name, d->options);
1674 1d14ffa9 bellard
        }
1675 1d14ffa9 bellard
    }
1676 1d14ffa9 bellard
1677 1d14ffa9 bellard
    printf ("Audio options:\n");
1678 1d14ffa9 bellard
    audio_print_options ("AUDIO", audio_options);
1679 1d14ffa9 bellard
    printf ("\n");
1680 1d14ffa9 bellard
1681 1d14ffa9 bellard
    printf ("Available drivers:\n");
1682 1d14ffa9 bellard
1683 b1503cda malc
    for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
1684 1d14ffa9 bellard
        struct audio_driver *d = drvtab[i];
1685 1d14ffa9 bellard
1686 1d14ffa9 bellard
        printf ("Name: %s\n", d->name);
1687 1d14ffa9 bellard
        printf ("Description: %s\n", d->descr);
1688 1d14ffa9 bellard
1689 571ec3d6 bellard
        audio_pp_nb_voices ("playback", d->max_voices_out);
1690 571ec3d6 bellard
        audio_pp_nb_voices ("capture", d->max_voices_in);
1691 1d14ffa9 bellard
1692 1d14ffa9 bellard
        if (d->options) {
1693 1d14ffa9 bellard
            printf ("Options:\n");
1694 1d14ffa9 bellard
            audio_print_options (d->name, d->options);
1695 1d14ffa9 bellard
        }
1696 1d14ffa9 bellard
        else {
1697 1d14ffa9 bellard
            printf ("No options\n");
1698 1d14ffa9 bellard
        }
1699 1d14ffa9 bellard
        printf ("\n");
1700 1d14ffa9 bellard
    }
1701 1d14ffa9 bellard
1702 1d14ffa9 bellard
    printf (
1703 1d14ffa9 bellard
        "Options are settable through environment variables.\n"
1704 1d14ffa9 bellard
        "Example:\n"
1705 1d14ffa9 bellard
#ifdef _WIN32
1706 1d14ffa9 bellard
        "  set QEMU_AUDIO_DRV=wav\n"
1707 571ec3d6 bellard
        "  set QEMU_WAV_PATH=c:\\tune.wav\n"
1708 1d14ffa9 bellard
#else
1709 1d14ffa9 bellard
        "  export QEMU_AUDIO_DRV=wav\n"
1710 1d14ffa9 bellard
        "  export QEMU_WAV_PATH=$HOME/tune.wav\n"
1711 1d14ffa9 bellard
        "(for csh replace export with setenv in the above)\n"
1712 1d14ffa9 bellard
#endif
1713 1d14ffa9 bellard
        "  qemu ...\n\n"
1714 1d14ffa9 bellard
        );
1715 1d14ffa9 bellard
}
1716 1d14ffa9 bellard
1717 c0fe3827 bellard
static int audio_driver_init (AudioState *s, struct audio_driver *drv)
1718 85571bc7 bellard
{
1719 1d14ffa9 bellard
    if (drv->options) {
1720 1d14ffa9 bellard
        audio_process_options (drv->name, drv->options);
1721 1d14ffa9 bellard
    }
1722 c0fe3827 bellard
    s->drv_opaque = drv->init ();
1723 1d14ffa9 bellard
1724 c0fe3827 bellard
    if (s->drv_opaque) {
1725 1a7dafce malc
        audio_init_nb_voices_out (drv);
1726 1a7dafce malc
        audio_init_nb_voices_in (drv);
1727 c0fe3827 bellard
        s->drv = drv;
1728 1d14ffa9 bellard
        return 0;
1729 85571bc7 bellard
    }
1730 85571bc7 bellard
    else {
1731 1d14ffa9 bellard
        dolog ("Could not init `%s' audio driver\n", drv->name);
1732 1d14ffa9 bellard
        return -1;
1733 85571bc7 bellard
    }
1734 85571bc7 bellard
}
1735 85571bc7 bellard
1736 9781e040 aliguori
static void audio_vm_change_state_handler (void *opaque, int running,
1737 9781e040 aliguori
                                           int reason)
1738 85571bc7 bellard
{
1739 c0fe3827 bellard
    AudioState *s = opaque;
1740 1d14ffa9 bellard
    HWVoiceOut *hwo = NULL;
1741 1d14ffa9 bellard
    HWVoiceIn *hwi = NULL;
1742 541e0844 bellard
    int op = running ? VOICE_ENABLE : VOICE_DISABLE;
1743 1d14ffa9 bellard
1744 978dd635 malc
    s->vm_running = running;
1745 1a7dafce malc
    while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
1746 713a98f8 malc
        hwo->pcm_ops->ctl_out (hwo, op, conf.try_poll_out);
1747 1d14ffa9 bellard
    }
1748 85571bc7 bellard
1749 1a7dafce malc
    while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
1750 713a98f8 malc
        hwi->pcm_ops->ctl_in (hwi, op, conf.try_poll_in);
1751 85571bc7 bellard
    }
1752 713a98f8 malc
    audio_reset_timer ();
1753 85571bc7 bellard
}
1754 85571bc7 bellard
1755 85571bc7 bellard
static void audio_atexit (void)
1756 85571bc7 bellard
{
1757 c0fe3827 bellard
    AudioState *s = &glob_audio_state;
1758 1d14ffa9 bellard
    HWVoiceOut *hwo = NULL;
1759 1d14ffa9 bellard
    HWVoiceIn *hwi = NULL;
1760 1d14ffa9 bellard
1761 1a7dafce malc
    while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
1762 ec36b695 bellard
        SWVoiceCap *sc;
1763 8ead62cf bellard
1764 571ec3d6 bellard
        hwo->pcm_ops->ctl_out (hwo, VOICE_DISABLE);
1765 1d14ffa9 bellard
        hwo->pcm_ops->fini_out (hwo);
1766 8ead62cf bellard
1767 ec36b695 bellard
        for (sc = hwo->cap_head.lh_first; sc; sc = sc->entries.le_next) {
1768 ec36b695 bellard
            CaptureVoiceOut *cap = sc->cap;
1769 ec36b695 bellard
            struct capture_callback *cb;
1770 ec36b695 bellard
1771 ec36b695 bellard
            for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
1772 ec36b695 bellard
                cb->ops.destroy (cb->opaque);
1773 ec36b695 bellard
            }
1774 8ead62cf bellard
        }
1775 1d14ffa9 bellard
    }
1776 85571bc7 bellard
1777 1a7dafce malc
    while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
1778 571ec3d6 bellard
        hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE);
1779 1d14ffa9 bellard
        hwi->pcm_ops->fini_in (hwi);
1780 85571bc7 bellard
    }
1781 c0fe3827 bellard
1782 c0fe3827 bellard
    if (s->drv) {
1783 c0fe3827 bellard
        s->drv->fini (s->drv_opaque);
1784 c0fe3827 bellard
    }
1785 85571bc7 bellard
}
1786 85571bc7 bellard
1787 85571bc7 bellard
static void audio_save (QEMUFile *f, void *opaque)
1788 85571bc7 bellard
{
1789 1d14ffa9 bellard
    (void) f;
1790 1d14ffa9 bellard
    (void) opaque;
1791 85571bc7 bellard
}
1792 85571bc7 bellard
1793 85571bc7 bellard
static int audio_load (QEMUFile *f, void *opaque, int version_id)
1794 85571bc7 bellard
{
1795 1d14ffa9 bellard
    (void) f;
1796 1d14ffa9 bellard
    (void) opaque;
1797 1d14ffa9 bellard
1798 1d14ffa9 bellard
    if (version_id != 1) {
1799 85571bc7 bellard
        return -EINVAL;
1800 1d14ffa9 bellard
    }
1801 85571bc7 bellard
1802 85571bc7 bellard
    return 0;
1803 85571bc7 bellard
}
1804 85571bc7 bellard
1805 1a7dafce malc
static void audio_init (void)
1806 85571bc7 bellard
{
1807 1d14ffa9 bellard
    size_t i;
1808 85571bc7 bellard
    int done = 0;
1809 85571bc7 bellard
    const char *drvname;
1810 713a98f8 malc
    VMChangeStateEntry *e;
1811 c0fe3827 bellard
    AudioState *s = &glob_audio_state;
1812 1d14ffa9 bellard
1813 0d9acba8 Paul Brook
    if (s->drv) {
1814 1a7dafce malc
        return;
1815 0d9acba8 Paul Brook
    }
1816 0d9acba8 Paul Brook
1817 72cf2d4f Blue Swirl
    QLIST_INIT (&s->hw_head_out);
1818 72cf2d4f Blue Swirl
    QLIST_INIT (&s->hw_head_in);
1819 72cf2d4f Blue Swirl
    QLIST_INIT (&s->cap_head);
1820 571ec3d6 bellard
    atexit (audio_atexit);
1821 571ec3d6 bellard
1822 571ec3d6 bellard
    s->ts = qemu_new_timer (vm_clock, audio_timer, s);
1823 571ec3d6 bellard
    if (!s->ts) {
1824 0d9acba8 Paul Brook
        hw_error("Could not create audio timer\n");
1825 571ec3d6 bellard
    }
1826 571ec3d6 bellard
1827 1d14ffa9 bellard
    audio_process_options ("AUDIO", audio_options);
1828 1d14ffa9 bellard
1829 c0fe3827 bellard
    s->nb_hw_voices_out = conf.fixed_out.nb_voices;
1830 c0fe3827 bellard
    s->nb_hw_voices_in = conf.fixed_in.nb_voices;
1831 c0fe3827 bellard
1832 1d14ffa9 bellard
    if (s->nb_hw_voices_out <= 0) {
1833 571ec3d6 bellard
        dolog ("Bogus number of playback voices %d, setting to 1\n",
1834 1d14ffa9 bellard
               s->nb_hw_voices_out);
1835 1d14ffa9 bellard
        s->nb_hw_voices_out = 1;
1836 1d14ffa9 bellard
    }
1837 1d14ffa9 bellard
1838 1d14ffa9 bellard
    if (s->nb_hw_voices_in <= 0) {
1839 571ec3d6 bellard
        dolog ("Bogus number of capture voices %d, setting to 0\n",
1840 1d14ffa9 bellard
               s->nb_hw_voices_in);
1841 571ec3d6 bellard
        s->nb_hw_voices_in = 0;
1842 1d14ffa9 bellard
    }
1843 85571bc7 bellard
1844 1d14ffa9 bellard
    {
1845 1d14ffa9 bellard
        int def;
1846 1d14ffa9 bellard
        drvname = audio_get_conf_str ("QEMU_AUDIO_DRV", NULL, &def);
1847 1d14ffa9 bellard
    }
1848 85571bc7 bellard
1849 85571bc7 bellard
    if (drvname) {
1850 85571bc7 bellard
        int found = 0;
1851 1d14ffa9 bellard
1852 b1503cda malc
        for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
1853 85571bc7 bellard
            if (!strcmp (drvname, drvtab[i]->name)) {
1854 c0fe3827 bellard
                done = !audio_driver_init (s, drvtab[i]);
1855 85571bc7 bellard
                found = 1;
1856 85571bc7 bellard
                break;
1857 85571bc7 bellard
            }
1858 85571bc7 bellard
        }
1859 1d14ffa9 bellard
1860 85571bc7 bellard
        if (!found) {
1861 85571bc7 bellard
            dolog ("Unknown audio driver `%s'\n", drvname);
1862 1d14ffa9 bellard
            dolog ("Run with -audio-help to list available drivers\n");
1863 85571bc7 bellard
        }
1864 85571bc7 bellard
    }
1865 85571bc7 bellard
1866 85571bc7 bellard
    if (!done) {
1867 b1503cda malc
        for (i = 0; !done && i < ARRAY_SIZE (drvtab); i++) {
1868 1d14ffa9 bellard
            if (drvtab[i]->can_be_default) {
1869 c0fe3827 bellard
                done = !audio_driver_init (s, drvtab[i]);
1870 1d14ffa9 bellard
            }
1871 85571bc7 bellard
        }
1872 85571bc7 bellard
    }
1873 85571bc7 bellard
1874 85571bc7 bellard
    if (!done) {
1875 c0fe3827 bellard
        done = !audio_driver_init (s, &no_audio_driver);
1876 c0fe3827 bellard
        if (!done) {
1877 0d9acba8 Paul Brook
            hw_error("Could not initialize audio subsystem\n");
1878 1d14ffa9 bellard
        }
1879 1d14ffa9 bellard
        else {
1880 c0fe3827 bellard
            dolog ("warning: Using timer based audio emulation\n");
1881 1d14ffa9 bellard
        }
1882 85571bc7 bellard
    }
1883 1d14ffa9 bellard
1884 0d9acba8 Paul Brook
    if (conf.period.hertz <= 0) {
1885 0d9acba8 Paul Brook
        if (conf.period.hertz < 0) {
1886 0d9acba8 Paul Brook
            dolog ("warning: Timer period is negative - %d "
1887 0d9acba8 Paul Brook
                   "treating as zero\n",
1888 0d9acba8 Paul Brook
                   conf.period.hertz);
1889 571ec3d6 bellard
        }
1890 0d9acba8 Paul Brook
        conf.period.ticks = 1;
1891 0d9acba8 Paul Brook
    } else {
1892 4f4cc0ef malc
        conf.period.ticks =
1893 4f4cc0ef malc
            muldiv64 (1, get_ticks_per_sec (), conf.period.hertz);
1894 1d14ffa9 bellard
    }
1895 0d9acba8 Paul Brook
1896 0d9acba8 Paul Brook
    e = qemu_add_vm_change_state_handler (audio_vm_change_state_handler, s);
1897 0d9acba8 Paul Brook
    if (!e) {
1898 0d9acba8 Paul Brook
        dolog ("warning: Could not register change state handler\n"
1899 0d9acba8 Paul Brook
               "(Audio can continue looping even after stopping the VM)\n");
1900 1d14ffa9 bellard
    }
1901 1d14ffa9 bellard
1902 72cf2d4f Blue Swirl
    QLIST_INIT (&s->card_head);
1903 c0fe3827 bellard
    register_savevm ("audio", 0, 1, audio_save, audio_load, s);
1904 85571bc7 bellard
}
1905 8ead62cf bellard
1906 1a7dafce malc
void AUD_register_card (const char *name, QEMUSoundCard *card)
1907 1a7dafce malc
{
1908 1a7dafce malc
    audio_init ();
1909 1a7dafce malc
    card->name = qemu_strdup (name);
1910 1a7dafce malc
    memset (&card->entries, 0, sizeof (card->entries));
1911 72cf2d4f Blue Swirl
    QLIST_INSERT_HEAD (&glob_audio_state.card_head, card, entries);
1912 1a7dafce malc
}
1913 1a7dafce malc
1914 1a7dafce malc
void AUD_remove_card (QEMUSoundCard *card)
1915 1a7dafce malc
{
1916 72cf2d4f Blue Swirl
    QLIST_REMOVE (card, entries);
1917 1a7dafce malc
    qemu_free (card->name);
1918 1a7dafce malc
}
1919 1a7dafce malc
1920 1a7dafce malc
1921 ec36b695 bellard
CaptureVoiceOut *AUD_add_capture (
1922 1ea879e5 malc
    struct audsettings *as,
1923 8ead62cf bellard
    struct audio_capture_ops *ops,
1924 8ead62cf bellard
    void *cb_opaque
1925 8ead62cf bellard
    )
1926 8ead62cf bellard
{
1927 1a7dafce malc
    AudioState *s = &glob_audio_state;
1928 8ead62cf bellard
    CaptureVoiceOut *cap;
1929 8ead62cf bellard
    struct capture_callback *cb;
1930 8ead62cf bellard
1931 ec36b695 bellard
    if (audio_validate_settings (as)) {
1932 8ead62cf bellard
        dolog ("Invalid settings were passed when trying to add capture\n");
1933 8ead62cf bellard
        audio_print_settings (as);
1934 ec36b695 bellard
        goto err0;
1935 8ead62cf bellard
    }
1936 8ead62cf bellard
1937 8ead62cf bellard
    cb = audio_calloc (AUDIO_FUNC, 1, sizeof (*cb));
1938 8ead62cf bellard
    if (!cb) {
1939 8ead62cf bellard
        dolog ("Could not allocate capture callback information, size %zu\n",
1940 8ead62cf bellard
               sizeof (*cb));
1941 8ead62cf bellard
        goto err0;
1942 8ead62cf bellard
    }
1943 8ead62cf bellard
    cb->ops = *ops;
1944 8ead62cf bellard
    cb->opaque = cb_opaque;
1945 8ead62cf bellard
1946 1a7dafce malc
    cap = audio_pcm_capture_find_specific (as);
1947 8ead62cf bellard
    if (cap) {
1948 72cf2d4f Blue Swirl
        QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
1949 ec36b695 bellard
        return cap;
1950 8ead62cf bellard
    }
1951 8ead62cf bellard
    else {
1952 8ead62cf bellard
        HWVoiceOut *hw;
1953 8ead62cf bellard
        CaptureVoiceOut *cap;
1954 8ead62cf bellard
1955 8ead62cf bellard
        cap = audio_calloc (AUDIO_FUNC, 1, sizeof (*cap));
1956 8ead62cf bellard
        if (!cap) {
1957 8ead62cf bellard
            dolog ("Could not allocate capture voice, size %zu\n",
1958 8ead62cf bellard
                   sizeof (*cap));
1959 8ead62cf bellard
            goto err1;
1960 8ead62cf bellard
        }
1961 8ead62cf bellard
1962 8ead62cf bellard
        hw = &cap->hw;
1963 72cf2d4f Blue Swirl
        QLIST_INIT (&hw->sw_head);
1964 72cf2d4f Blue Swirl
        QLIST_INIT (&cap->cb_head);
1965 8ead62cf bellard
1966 8ead62cf bellard
        /* XXX find a more elegant way */
1967 8ead62cf bellard
        hw->samples = 4096 * 4;
1968 8ead62cf bellard
        hw->mix_buf = audio_calloc (AUDIO_FUNC, hw->samples,
1969 1ea879e5 malc
                                    sizeof (struct st_sample));
1970 8ead62cf bellard
        if (!hw->mix_buf) {
1971 8ead62cf bellard
            dolog ("Could not allocate capture mix buffer (%d samples)\n",
1972 8ead62cf bellard
                   hw->samples);
1973 8ead62cf bellard
            goto err2;
1974 8ead62cf bellard
        }
1975 8ead62cf bellard
1976 d929eba5 bellard
        audio_pcm_init_info (&hw->info, as);
1977 8ead62cf bellard
1978 8ead62cf bellard
        cap->buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
1979 8ead62cf bellard
        if (!cap->buf) {
1980 8ead62cf bellard
            dolog ("Could not allocate capture buffer "
1981 8ead62cf bellard
                   "(%d samples, each %d bytes)\n",
1982 8ead62cf bellard
                   hw->samples, 1 << hw->info.shift);
1983 8ead62cf bellard
            goto err3;
1984 8ead62cf bellard
        }
1985 8ead62cf bellard
1986 8ead62cf bellard
        hw->clip = mixeng_clip
1987 8ead62cf bellard
            [hw->info.nchannels == 2]
1988 8ead62cf bellard
            [hw->info.sign]
1989 d929eba5 bellard
            [hw->info.swap_endianness]
1990 f941aa25 ths
            [audio_bits_to_index (hw->info.bits)];
1991 8ead62cf bellard
1992 72cf2d4f Blue Swirl
        QLIST_INSERT_HEAD (&s->cap_head, cap, entries);
1993 72cf2d4f Blue Swirl
        QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
1994 8ead62cf bellard
1995 8ead62cf bellard
        hw = NULL;
1996 1a7dafce malc
        while ((hw = audio_pcm_hw_find_any_out (hw))) {
1997 1a7dafce malc
            audio_attach_capture (hw);
1998 8ead62cf bellard
        }
1999 ec36b695 bellard
        return cap;
2000 8ead62cf bellard
2001 8ead62cf bellard
    err3:
2002 8ead62cf bellard
        qemu_free (cap->hw.mix_buf);
2003 8ead62cf bellard
    err2:
2004 8ead62cf bellard
        qemu_free (cap);
2005 8ead62cf bellard
    err1:
2006 8ead62cf bellard
        qemu_free (cb);
2007 8ead62cf bellard
    err0:
2008 ec36b695 bellard
        return NULL;
2009 ec36b695 bellard
    }
2010 ec36b695 bellard
}
2011 ec36b695 bellard
2012 ec36b695 bellard
void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque)
2013 ec36b695 bellard
{
2014 ec36b695 bellard
    struct capture_callback *cb;
2015 ec36b695 bellard
2016 ec36b695 bellard
    for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
2017 ec36b695 bellard
        if (cb->opaque == cb_opaque) {
2018 ec36b695 bellard
            cb->ops.destroy (cb_opaque);
2019 72cf2d4f Blue Swirl
            QLIST_REMOVE (cb, entries);
2020 ec36b695 bellard
            qemu_free (cb);
2021 ec36b695 bellard
2022 ec36b695 bellard
            if (!cap->cb_head.lh_first) {
2023 ec36b695 bellard
                SWVoiceOut *sw = cap->hw.sw_head.lh_first, *sw1;
2024 a3c25997 bellard
2025 ec36b695 bellard
                while (sw) {
2026 a3c25997 bellard
                    SWVoiceCap *sc = (SWVoiceCap *) sw;
2027 ec36b695 bellard
#ifdef DEBUG_CAPTURE
2028 ec36b695 bellard
                    dolog ("freeing %s\n", sw->name);
2029 ec36b695 bellard
#endif
2030 a3c25997 bellard
2031 ec36b695 bellard
                    sw1 = sw->entries.le_next;
2032 ec36b695 bellard
                    if (sw->rate) {
2033 ec36b695 bellard
                        st_rate_stop (sw->rate);
2034 ec36b695 bellard
                        sw->rate = NULL;
2035 ec36b695 bellard
                    }
2036 72cf2d4f Blue Swirl
                    QLIST_REMOVE (sw, entries);
2037 72cf2d4f Blue Swirl
                    QLIST_REMOVE (sc, entries);
2038 a3c25997 bellard
                    qemu_free (sc);
2039 ec36b695 bellard
                    sw = sw1;
2040 ec36b695 bellard
                }
2041 72cf2d4f Blue Swirl
                QLIST_REMOVE (cap, entries);
2042 ec36b695 bellard
                qemu_free (cap);
2043 ec36b695 bellard
            }
2044 ec36b695 bellard
            return;
2045 ec36b695 bellard
        }
2046 8ead62cf bellard
    }
2047 8ead62cf bellard
}
2048 683efdcb balrog
2049 683efdcb balrog
void AUD_set_volume_out (SWVoiceOut *sw, int mute, uint8_t lvol, uint8_t rvol)
2050 683efdcb balrog
{
2051 683efdcb balrog
    if (sw) {
2052 683efdcb balrog
        sw->vol.mute = mute;
2053 683efdcb balrog
        sw->vol.l = nominal_volume.l * lvol / 255;
2054 683efdcb balrog
        sw->vol.r = nominal_volume.r * rvol / 255;
2055 683efdcb balrog
    }
2056 683efdcb balrog
}
2057 683efdcb balrog
2058 683efdcb balrog
void AUD_set_volume_in (SWVoiceIn *sw, int mute, uint8_t lvol, uint8_t rvol)
2059 683efdcb balrog
{
2060 683efdcb balrog
    if (sw) {
2061 683efdcb balrog
        sw->vol.mute = mute;
2062 683efdcb balrog
        sw->vol.l = nominal_volume.l * lvol / 255;
2063 683efdcb balrog
        sw->vol.r = nominal_volume.r * rvol / 255;
2064 683efdcb balrog
    }
2065 683efdcb balrog
}