00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef QEMU_AUDIO_H
00025 #define QEMU_AUDIO_H
00026
00027 #include "config-host.h"
00028 #include "sys-queue.h"
00029
00030 typedef void (*audio_callback_fn_t) (void *opaque, int avail);
00031
00032 typedef enum {
00033 AUD_FMT_U8,
00034 AUD_FMT_S8,
00035 AUD_FMT_U16,
00036 AUD_FMT_S16,
00037 AUD_FMT_U32,
00038 AUD_FMT_S32
00039 } audfmt_e;
00040
00041 #ifdef WORDS_BIGENDIAN
00042 #define AUDIO_HOST_ENDIANNESS 1
00043 #else
00044 #define AUDIO_HOST_ENDIANNESS 0
00045 #endif
00046
00047 struct audsettings {
00048 int freq;
00049 int nchannels;
00050 audfmt_e fmt;
00051 int endianness;
00052 };
00053
00054 typedef enum {
00055 AUD_CNOTIFY_ENABLE,
00056 AUD_CNOTIFY_DISABLE
00057 } audcnotification_e;
00058
00059 struct audio_capture_ops {
00060 void (*notify) (void *opaque, audcnotification_e cmd);
00061 void (*capture) (void *opaque, void *buf, int size);
00062 void (*destroy) (void *opaque);
00063 };
00064
00065 struct capture_ops {
00066 void (*info) (void *opaque);
00067 void (*destroy) (void *opaque);
00068 };
00069
00070 typedef struct CaptureState {
00071 void *opaque;
00072 struct capture_ops ops;
00073 LIST_ENTRY (CaptureState) entries;
00074 } CaptureState;
00075
00076 typedef struct SWVoiceOut SWVoiceOut;
00077 typedef struct CaptureVoiceOut CaptureVoiceOut;
00078 typedef struct SWVoiceIn SWVoiceIn;
00079
00080 typedef struct QEMUSoundCard {
00081 AudioState *audio;
00082 char *name;
00083 LIST_ENTRY (QEMUSoundCard) entries;
00084 } QEMUSoundCard;
00085
00086 typedef struct QEMUAudioTimeStamp {
00087 uint64_t old_ts;
00088 } QEMUAudioTimeStamp;
00089
00090 void AUD_vlog (const char *cap, const char *fmt, va_list ap);
00091 void AUD_log (const char *cap, const char *fmt, ...)
00092 #ifdef __GNUC__
00093 __attribute__ ((__format__ (__printf__, 2, 3)))
00094 #endif
00095 ;
00096
00097 AudioState *AUD_init (void);
00098 void AUD_help (void);
00099 void AUD_register_card (AudioState *s, const char *name, QEMUSoundCard *card);
00100 void AUD_remove_card (QEMUSoundCard *card);
00101 CaptureVoiceOut *AUD_add_capture (
00102 AudioState *s,
00103 struct audsettings *as,
00104 struct audio_capture_ops *ops,
00105 void *opaque
00106 );
00107 void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque);
00108
00109 SWVoiceOut *AUD_open_out (
00110 QEMUSoundCard *card,
00111 SWVoiceOut *sw,
00112 const char *name,
00113 void *callback_opaque,
00114 audio_callback_fn_t callback_fn,
00115 struct audsettings *settings
00116 );
00117
00118 void AUD_close_out (QEMUSoundCard *card, SWVoiceOut *sw);
00119 int AUD_write (SWVoiceOut *sw, void *pcm_buf, int size);
00120 int AUD_get_buffer_size_out (SWVoiceOut *sw);
00121 void AUD_set_active_out (SWVoiceOut *sw, int on);
00122 int AUD_is_active_out (SWVoiceOut *sw);
00123
00124 void AUD_init_time_stamp_out (SWVoiceOut *sw, QEMUAudioTimeStamp *ts);
00125 uint64_t AUD_get_elapsed_usec_out (SWVoiceOut *sw, QEMUAudioTimeStamp *ts);
00126
00127 void AUD_set_volume_out (SWVoiceOut *sw, int mute, uint8_t lvol, uint8_t rvol);
00128 void AUD_set_volume_in (SWVoiceIn *sw, int mute, uint8_t lvol, uint8_t rvol);
00129
00130 SWVoiceIn *AUD_open_in (
00131 QEMUSoundCard *card,
00132 SWVoiceIn *sw,
00133 const char *name,
00134 void *callback_opaque,
00135 audio_callback_fn_t callback_fn,
00136 struct audsettings *settings
00137 );
00138
00139 void AUD_close_in (QEMUSoundCard *card, SWVoiceIn *sw);
00140 int AUD_read (SWVoiceIn *sw, void *pcm_buf, int size);
00141 void AUD_set_active_in (SWVoiceIn *sw, int on);
00142 int AUD_is_active_in (SWVoiceIn *sw);
00143
00144 void AUD_init_time_stamp_in (SWVoiceIn *sw, QEMUAudioTimeStamp *ts);
00145 uint64_t AUD_get_elapsed_usec_in (SWVoiceIn *sw, QEMUAudioTimeStamp *ts);
00146
00147 static inline void *advance (void *p, int incr)
00148 {
00149 uint8_t *d = p;
00150 return (d + incr);
00151 }
00152
00153 uint32_t popcount (uint32_t u);
00154 uint32_t lsbindex (uint32_t u);
00155
00156 #ifdef __GNUC__
00157 #define audio_MIN(a, b) ( __extension__ ({ \
00158 __typeof (a) ta = a; \
00159 __typeof (b) tb = b; \
00160 ((ta)>(tb)?(tb):(ta)); \
00161 }))
00162
00163 #define audio_MAX(a, b) ( __extension__ ({ \
00164 __typeof (a) ta = a; \
00165 __typeof (b) tb = b; \
00166 ((ta)<(tb)?(tb):(ta)); \
00167 }))
00168 #else
00169 #define audio_MIN(a, b) ((a)>(b)?(b):(a))
00170 #define audio_MAX(a, b) ((a)<(b)?(b):(a))
00171 #endif
00172
00173 int wav_start_capture (CaptureState *s, const char *path, int freq,
00174 int bits, int nchannels);
00175
00176 #endif