audio.h revision 06f76f08c1ed36b84208746f490dfcd2a13909df
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/*
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * QEMU Audio subsystem header
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync *
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Copyright (c) 2003-2005 Vassili Karpov (malc)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync *
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Permission is hereby granted, free of charge, to any person obtaining a copy
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * of this software and associated documentation files (the "Software"), to deal
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * in the Software without restriction, including without limitation the rights
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * copies of the Software, and to permit persons to whom the Software is
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * furnished to do so, subject to the following conditions:
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * The above copyright notice and this permission notice shall be included in
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * all copies or substantial portions of the Software.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * THE SOFTWARE.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#ifndef QEMU_AUDIO_H
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#define QEMU_AUDIO_H
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include "sys-queue.h"
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
da957c069c2a3c582fe265ff88170ce4c42b499dvboxsync#if defined __STDC_VERSION__ && __STDC_VERSION__ > 199901L
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync#define FMTZ "z"
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#else
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#define FMTZ
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync#endif
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef void (*audio_callback_fn_t) (void *opaque, int avail);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef enum {
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync AUD_FMT_U8,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync AUD_FMT_S8,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync AUD_FMT_U16,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync AUD_FMT_S16,
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync AUD_FMT_U32,
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync AUD_FMT_S32
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync} audfmt_e;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#define AUDIO_HOST_ENDIANNESS 0
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef struct {
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync int freq;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync int nchannels;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync audfmt_e fmt;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync int endianness;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync} audsettings_t;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef enum {
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync AUD_CNOTIFY_ENABLE,
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync AUD_CNOTIFY_DISABLE
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync} audcnotification_e;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef enum
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync{
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync AUD_MIXER_VOLUME,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync AUD_MIXER_PCM,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync AUD_MIXER_LINE_IN
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync} audmixerctl_t;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsynctypedef enum
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync{
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync AUD_REC_MIC,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync AUD_REC_CD,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync AUD_REC_VIDEO,
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync AUD_REC_AUX,
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync AUD_REC_LINE_IN,
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync AUD_REC_PHONE
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync} audrecsource_t;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncstruct audio_capture_ops {
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync void (*notify) (void *opaque, audcnotification_e cmd);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync void (*capture) (void *opaque, void *buf, int size);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync void (*destroy) (void *opaque);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync};
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncstruct capture_ops {
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync void (*info) (void *opaque);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync void (*destroy) (void *opaque);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync};
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef struct CaptureState {
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync void *opaque;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync struct capture_ops ops;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync LIST_ENTRY (CaptureState) entries;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync} CaptureState;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef struct AudioState AudioState;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef struct SWVoiceOut SWVoiceOut;
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsynctypedef struct CaptureVoiceOut CaptureVoiceOut;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef struct SWVoiceIn SWVoiceIn;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef struct QEMUSoundCard {
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync AudioState *audio;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync char *name;
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync LIST_ENTRY (QEMUSoundCard) entries;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync} QEMUSoundCard;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef struct QEMUAudioTimeStamp {
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync uint64_t old_ts;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync} QEMUAudioTimeStamp;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncvoid AUD_vlog (const char *cap, const char *fmt, va_list ap);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncvoid AUD_log (const char *cap, const char *fmt, ...)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#if defined (__GNUC__) && !defined (VBOX) /* VBox: oh, please, shut up. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync __attribute__ ((__format__ (__printf__, 2, 3)))
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#endif
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync ;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncvoid AUD_register_card (const char *name, QEMUSoundCard *card);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncvoid AUD_remove_card (QEMUSoundCard *card);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncCaptureVoiceOut *AUD_add_capture (
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync AudioState *s,
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync audsettings_t *as,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync struct audio_capture_ops *ops,
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync void *opaque
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync );
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncvoid AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque);
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsyncSWVoiceOut *AUD_open_out (
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync QEMUSoundCard *card,
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync SWVoiceOut *sw,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync const char *name,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync void *callback_opaque,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync audio_callback_fn_t callback_fn,
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync audsettings_t *settings
e3f5c51715cbf77ae2d2e9d05bafd00d69b1bec9vboxsync );
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsyncvoid AUD_close_out (QEMUSoundCard *card, SWVoiceOut *sw);
aa32d4906f2f685992091893d5abdf27a2352a85vboxsyncint AUD_write (SWVoiceOut *sw, void *pcm_buf, int size);
e3f5c51715cbf77ae2d2e9d05bafd00d69b1bec9vboxsyncint AUD_get_buffer_size_out (SWVoiceOut *sw);
aa32d4906f2f685992091893d5abdf27a2352a85vboxsyncvoid AUD_set_active_out (SWVoiceOut *sw, int on);
aa32d4906f2f685992091893d5abdf27a2352a85vboxsyncint AUD_is_active_out (SWVoiceOut *sw);
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncvoid AUD_init_time_stamp_out (SWVoiceOut *sw, QEMUAudioTimeStamp *ts);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncuint64_t AUD_get_elapsed_usec_out (SWVoiceOut *sw, QEMUAudioTimeStamp *ts);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncSWVoiceIn *AUD_open_in (
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync QEMUSoundCard *card,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync SWVoiceIn *sw,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync const char *name,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync void *callback_opaque,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync audio_callback_fn_t callback_fn,
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync audsettings_t *settings
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync );
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsyncvoid AUD_close_in (QEMUSoundCard *card, SWVoiceIn *sw);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncint AUD_read (SWVoiceIn *sw, void *pcm_buf, int size);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncvoid AUD_set_active_in (SWVoiceIn *sw, int on);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncint AUD_is_active_in (SWVoiceIn *sw);
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync
b7a5b3f9f9ecce32ddacf8404c625ce0451bbdc1vboxsyncvoid AUD_init_time_stamp_in (SWVoiceIn *sw, QEMUAudioTimeStamp *ts);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncuint64_t AUD_get_elapsed_usec_in (SWVoiceIn *sw, QEMUAudioTimeStamp *ts);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncvoid AUD_set_volume_out (SWVoiceOut *po, int mute, uint8_t lvol, uint8_t rvol);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncvoid AUD_set_volume (audmixerctl_t mt, int *mute, uint8_t *lvol, uint8_t *rvol);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncvoid AUD_set_record_source (audrecsource_t *ars, audrecsource_t *als);
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsyncint AUD_init_null(void);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsyncstatic inline void *advance (void *p, int incr)
b514c03a427443a7ad18c1202d2ee7acc47cf9afvboxsync{
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync#ifndef VBOX
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync uint8_t *d = p;
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync#else
b7a5b3f9f9ecce32ddacf8404c625ce0451bbdc1vboxsync uint8_t *d = (uint8_t*)p;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync#endif
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync return (d + incr);
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync}
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncuint32_t popcount (uint32_t u);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncuint32_t lsbindex (uint32_t u);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync#ifdef __GNUC__
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync#define audio_MIN(a, b) ( __extension__ ({ \
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync __typeof (a) ta = a; \
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync __typeof (b) tb = b; \
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync ((ta)>(tb)?(tb):(ta)); \
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync }))
fe813b3594039ba864493438e78ee0e7132bc445vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync#define audio_MAX(a, b) ( __extension__ ({ \
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync __typeof (a) ta = a; \
b514c03a427443a7ad18c1202d2ee7acc47cf9afvboxsync __typeof (b) tb = b; \
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync ((ta)<(tb)?(tb):(ta)); \
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync }))
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync#else
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#define audio_MIN(a, b) ((a)>(b)?(b):(a))
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#define audio_MAX(a, b) ((a)<(b)?(b):(a))
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync#endif
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync#ifdef VBOX
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncconst char *audio_get_stream_name(void);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#endif
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#endif /* audio.h */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync