xref: /openbmc/qemu/audio/audio.h (revision 1527c6b6fa6c6775523287e33f78b41afc7ba46c)
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