185571bc7Sbellard /*
285571bc7Sbellard * QEMU Audio subsystem header
385571bc7Sbellard *
41d14ffa9Sbellard * Copyright (c) 2003-2005 Vassili Karpov (malc)
585571bc7Sbellard *
685571bc7Sbellard * Permission is hereby granted, free of charge, to any person obtaining a copy
785571bc7Sbellard * of this software and associated documentation files (the "Software"), to deal
885571bc7Sbellard * in the Software without restriction, including without limitation the rights
985571bc7Sbellard * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1085571bc7Sbellard * copies of the Software, and to permit persons to whom the Software is
1185571bc7Sbellard * furnished to do so, subject to the following conditions:
1285571bc7Sbellard *
1385571bc7Sbellard * The above copyright notice and this permission notice shall be included in
1485571bc7Sbellard * all copies or substantial portions of the Software.
1585571bc7Sbellard *
1685571bc7Sbellard * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1785571bc7Sbellard * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1885571bc7Sbellard * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1985571bc7Sbellard * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2085571bc7Sbellard * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2185571bc7Sbellard * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2285571bc7Sbellard * THE SOFTWARE.
2385571bc7Sbellard */
24175de524SMarkus Armbruster
2585571bc7Sbellard #ifndef QEMU_AUDIO_H
2685571bc7Sbellard #define QEMU_AUDIO_H
2785571bc7Sbellard
281de7afc9SPaolo Bonzini #include "qemu/queue.h"
2985bc5852SKővágó, Zoltán #include "qapi/qapi-types-audio.h"
3088e47b9aSKővágó, Zoltán #include "hw/qdev-properties.h"
31ce35e229SEduardo Habkost #include "hw/qdev-properties-system.h"
32c0fe3827Sbellard
33cb4f03e8Smalc typedef void (*audio_callback_fn) (void *opaque, int avail);
3485571bc7Sbellard
35e03b5686SMarc-André Lureau #if HOST_BIG_ENDIAN
36d929eba5Sbellard #define AUDIO_HOST_ENDIANNESS 1
37d929eba5Sbellard #else
38d929eba5Sbellard #define AUDIO_HOST_ENDIANNESS 0
39d929eba5Sbellard #endif
40d929eba5Sbellard
4171830221SKővágó, Zoltán typedef struct audsettings {
42c0fe3827Sbellard int freq;
43c0fe3827Sbellard int nchannels;
4485bc5852SKővágó, Zoltán AudioFormat fmt;
45d929eba5Sbellard int endianness;
4671830221SKővágó, Zoltán } audsettings;
4771830221SKővágó, Zoltán
4871830221SKővágó, Zoltán audsettings audiodev_to_audsettings(AudiodevPerDirectionOptions *pdo);
4971830221SKővágó, Zoltán int audioformat_bytes_per_sample(AudioFormat fmt);
5071830221SKővágó, Zoltán int audio_buffer_frames(AudiodevPerDirectionOptions *pdo,
5171830221SKővágó, Zoltán audsettings *as, int def_usecs);
5271830221SKővágó, Zoltán int audio_buffer_samples(AudiodevPerDirectionOptions *pdo,
5371830221SKővágó, Zoltán audsettings *as, int def_usecs);
5471830221SKővágó, Zoltán int audio_buffer_bytes(AudiodevPerDirectionOptions *pdo,
5571830221SKővágó, Zoltán audsettings *as, int def_usecs);
56c0fe3827Sbellard
57ec36b695Sbellard typedef enum {
58ec36b695Sbellard AUD_CNOTIFY_ENABLE,
59ec36b695Sbellard AUD_CNOTIFY_DISABLE
60ec36b695Sbellard } audcnotification_e;
61ec36b695Sbellard
628ead62cfSbellard struct audio_capture_ops {
63ec36b695Sbellard void (*notify) (void *opaque, audcnotification_e cmd);
6457a878edSPhilippe Mathieu-Daudé void (*capture) (void *opaque, const void *buf, int size);
65ec36b695Sbellard void (*destroy) (void *opaque);
668ead62cfSbellard };
678ead62cfSbellard
68ec36b695Sbellard struct capture_ops {
69ec36b695Sbellard void (*info) (void *opaque);
70ec36b695Sbellard void (*destroy) (void *opaque);
71ec36b695Sbellard };
72ec36b695Sbellard
73ec36b695Sbellard typedef struct CaptureState {
74ec36b695Sbellard void *opaque;
75ec36b695Sbellard struct capture_ops ops;
7672cf2d4fSBlue Swirl QLIST_ENTRY (CaptureState) entries;
77ec36b695Sbellard } CaptureState;
78ec36b695Sbellard
791d14ffa9Sbellard typedef struct SWVoiceOut SWVoiceOut;
80ec36b695Sbellard typedef struct CaptureVoiceOut CaptureVoiceOut;
811d14ffa9Sbellard typedef struct SWVoiceIn SWVoiceIn;
8285571bc7Sbellard
83ecd97e95SKővágó, Zoltán typedef struct AudioState AudioState;
84c0fe3827Sbellard typedef struct QEMUSoundCard {
85c0fe3827Sbellard char *name;
86ecd97e95SKővágó, Zoltán AudioState *state;
8772cf2d4fSBlue Swirl QLIST_ENTRY (QEMUSoundCard) entries;
88c0fe3827Sbellard } QEMUSoundCard;
89c0fe3827Sbellard
901d14ffa9Sbellard typedef struct QEMUAudioTimeStamp {
911d14ffa9Sbellard uint64_t old_ts;
921d14ffa9Sbellard } QEMUAudioTimeStamp;
931d14ffa9Sbellard
949edc6313SMarc-André Lureau void AUD_vlog (const char *cap, const char *fmt, va_list ap) G_GNUC_PRINTF(2, 0);
959edc6313SMarc-André Lureau void AUD_log (const char *cap, const char *fmt, ...) G_GNUC_PRINTF(2, 3);
961d14ffa9Sbellard
97cb94ff5fSMartin Kletzander bool AUD_register_card (const char *name, QEMUSoundCard *card, Error **errp);
98c0fe3827Sbellard void AUD_remove_card (QEMUSoundCard *card);
99ec36b695Sbellard CaptureVoiceOut *AUD_add_capture(
100ecd97e95SKővágó, Zoltán AudioState *s,
1011ea879e5Smalc struct audsettings *as,
1028ead62cfSbellard struct audio_capture_ops *ops,
1038ead62cfSbellard void *opaque
1048ead62cfSbellard );
105ec36b695Sbellard void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque);
1061d14ffa9Sbellard
1071d14ffa9Sbellard SWVoiceOut *AUD_open_out (
108c0fe3827Sbellard QEMUSoundCard *card,
1091d14ffa9Sbellard SWVoiceOut *sw,
1101d14ffa9Sbellard const char *name,
1111d14ffa9Sbellard void *callback_opaque,
112cb4f03e8Smalc audio_callback_fn callback_fn,
1131ea879e5Smalc struct audsettings *settings
1141d14ffa9Sbellard );
115c0fe3827Sbellard
116c0fe3827Sbellard void AUD_close_out (QEMUSoundCard *card, SWVoiceOut *sw);
1177520462bSKővágó, Zoltán size_t AUD_write (SWVoiceOut *sw, void *pcm_buf, size_t size);
1181d14ffa9Sbellard int AUD_get_buffer_size_out (SWVoiceOut *sw);
1191d14ffa9Sbellard void AUD_set_active_out (SWVoiceOut *sw, int on);
1201d14ffa9Sbellard int AUD_is_active_out (SWVoiceOut *sw);
121c0fe3827Sbellard
122c0fe3827Sbellard void AUD_init_time_stamp_out (SWVoiceOut *sw, QEMUAudioTimeStamp *ts);
123c0fe3827Sbellard uint64_t AUD_get_elapsed_usec_out (SWVoiceOut *sw, QEMUAudioTimeStamp *ts);
1241d14ffa9Sbellard
125683efdcbSbalrog void AUD_set_volume_out (SWVoiceOut *sw, int mute, uint8_t lvol, uint8_t rvol);
126683efdcbSbalrog void AUD_set_volume_in (SWVoiceIn *sw, int mute, uint8_t lvol, uint8_t rvol);
127683efdcbSbalrog
128cecc1e79SKővágó, Zoltán #define AUDIO_MAX_CHANNELS 16
129cecc1e79SKővágó, Zoltán typedef struct Volume {
130cecc1e79SKővágó, Zoltán bool mute;
131cecc1e79SKővágó, Zoltán int channels;
132cecc1e79SKővágó, Zoltán uint8_t vol[AUDIO_MAX_CHANNELS];
133cecc1e79SKővágó, Zoltán } Volume;
134cecc1e79SKővágó, Zoltán
135cecc1e79SKővágó, Zoltán void audio_set_volume_out(SWVoiceOut *sw, Volume *vol);
136cecc1e79SKővágó, Zoltán void audio_set_volume_in(SWVoiceIn *sw, Volume *vol);
137cecc1e79SKővágó, Zoltán
1381d14ffa9Sbellard SWVoiceIn *AUD_open_in (
139c0fe3827Sbellard QEMUSoundCard *card,
1401d14ffa9Sbellard SWVoiceIn *sw,
1411d14ffa9Sbellard const char *name,
1421d14ffa9Sbellard void *callback_opaque,
143cb4f03e8Smalc audio_callback_fn callback_fn,
1441ea879e5Smalc struct audsettings *settings
1451d14ffa9Sbellard );
146c0fe3827Sbellard
147c0fe3827Sbellard void AUD_close_in (QEMUSoundCard *card, SWVoiceIn *sw);
1487520462bSKővágó, Zoltán size_t AUD_read (SWVoiceIn *sw, void *pcm_buf, size_t size);
1491d14ffa9Sbellard void AUD_set_active_in (SWVoiceIn *sw, int on);
1501d14ffa9Sbellard int AUD_is_active_in (SWVoiceIn *sw);
151c0fe3827Sbellard
152c0fe3827Sbellard void AUD_init_time_stamp_in (SWVoiceIn *sw, QEMUAudioTimeStamp *ts);
153c0fe3827Sbellard uint64_t AUD_get_elapsed_usec_in (SWVoiceIn *sw, QEMUAudioTimeStamp *ts);
15485571bc7Sbellard
advance(void * p,int incr)15585571bc7Sbellard static inline void *advance (void *p, int incr)
15685571bc7Sbellard {
15785571bc7Sbellard uint8_t *d = p;
15885571bc7Sbellard return (d + incr);
15985571bc7Sbellard }
16085571bc7Sbellard
161ecd97e95SKővágó, Zoltán int wav_start_capture(AudioState *state, CaptureState *s, const char *path,
162ecd97e95SKővágó, Zoltán int freq, int bits, int nchannels);
163295e390fSblueswir1
164a384c205SMarc-André Lureau void audio_cleanup(void);
165a384c205SMarc-André Lureau
166e709d2acSPhilippe Mathieu-Daudé void audio_sample_to_uint64(const void *samples, int pos,
1673d4d16f4SPavel Dovgalyuk uint64_t *left, uint64_t *right);
1683d4d16f4SPavel Dovgalyuk void audio_sample_from_uint64(void *samples, int pos,
1693d4d16f4SPavel Dovgalyuk uint64_t left, uint64_t right);
1703d4d16f4SPavel Dovgalyuk
171039a6837SPaolo Bonzini void audio_define(Audiodev *audio);
1728f527a3cSPaolo Bonzini void audio_define_default(Audiodev *dev, Error **errp);
17371830221SKővágó, Zoltán void audio_parse_option(const char *opt);
174c753bf47SPaolo Bonzini void audio_create_default_audiodevs(void);
175cb94ff5fSMartin Kletzander void audio_init_audiodevs(void);
1765e03b6daSClaudio Fontana void audio_help(void);
17771830221SKővágó, Zoltán
178176adafcSPaolo Bonzini AudioState *audio_state_by_name(const char *name, Error **errp);
179*63a13c08SPaolo Bonzini AudioState *audio_get_default_audio_state(Error **errp);
180ecd97e95SKővágó, Zoltán const char *audio_get_id(QEMUSoundCard *card);
181ecd97e95SKővágó, Zoltán
18288e47b9aSKővágó, Zoltán #define DEFINE_AUDIO_PROPERTIES(_s, _f) \
18388e47b9aSKővágó, Zoltán DEFINE_PROP_AUDIODEV("audiodev", _s, _f)
18488e47b9aSKővágó, Zoltán
185175de524SMarkus Armbruster #endif /* QEMU_AUDIO_H */
186