Audio backend cleanup
v3 cover Audio backend cleanup
This series of patch removes the following audio backends:
esd, fmod, winwave.
It also cleans up the remaining drivers to do not use global variables where possible. This is a preparation for my GSoC project where I will enable multiple simultaneous audio backends.
Please also test the coreaudio backend, as I do not have a Mac to test it.
Patches are also available at https://github.com/DirtYiCE/qemu.git in tag audio-cleanup-v3 to simplify testing.
Changes since v1:
* sdl no longer removed
* fixed style issues in `audio: expose drv_opaque to init_out and init_in'
Changes since v2:
* fixed typo in coreaudio
Please review.
Kővágó, Zoltán (12):
audio: remove esd backend
audio: remove fmod backend
audio: remove winwave audio driver
audio: expose drv_opaque to init_out and init_in
alsaaudio: do not use global variables
paaudio: do not use global variables
ossaudio: do not use global variables
wavaudio: do not use global variables
dsoundaudio: do not use global variables
paaudio: fix possible resource leak
coreaudio: do not use global variables where possible
sdlaudio: do not allow multiple instances
audio/Makefile.objs | 4 - audio/alsaaudio.c | 165 ++++++----- audio/audio_int.h | 7 +- audio/audio_template.h | 2 +- audio/coreaudio.c | 46 ++-- audio/dsound_template.h | 24 +- audio/dsoundaudio.c | 106 ++++--- audio/esdaudio.c | 557 ------------------------------------- audio/fmodaudio.c | 685 --------------------------------------------- audio/noaudio.c | 4 +- audio/ossaudio.c | 115 ++++---- audio/paaudio.c | 105 +++---- audio/sdlaudio.c | 10 +- audio/spiceaudio.c | 5 +- audio/wavaudio.c | 42 +-- audio/winwaveaudio.c | 717 ------------------------------------------------ configure | 56 +--- 17 files changed, 367 insertions(+), 2283 deletions(-) delete mode 100644 audio/esdaudio.c delete mode 100644 audio/fmodaudio.c delete mode 100644 audio/winwaveaudio.c
Signature · 1 line
2.4.2
PATCH v3 1/12 audio: remove esd backend
ESD is no longer developed and replaced by PulseAudio.
--- audio/Makefile.objs | 1 - audio/audio_int.h | 1 - audio/esdaudio.c | 557 ---------------------------------------------------- configure | 18 +- 4 files changed, 6 insertions(+), 571 deletions(-) delete mode 100644 audio/esdaudio.c
audio/Makefile.objs +0 -1
@@ -6,7 +6,6 @@ common-obj-$(CONFIG_COREAUDIO) += coreaudio.o common-obj-$(CONFIG_ALSA) += alsaaudio.o common-obj-$(CONFIG_DSOUND) += dsoundaudio.o common-obj-$(CONFIG_FMOD) += fmodaudio.o -common-obj-$(CONFIG_ESD) += esdaudio.o common-obj-$(CONFIG_PA) += paaudio.o common-obj-$(CONFIG_WINWAVE) += winwaveaudio.o common-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o
audio/audio_int.h +0 -1
@@ -210,7 +210,6 @@ extern struct audio_driver fmod_audio_driver;extern struct audio_driver alsa_audio_driver;extern struct audio_driver coreaudio_audio_driver;extern struct audio_driver dsound_audio_driver; -extern struct audio_driver esd_audio_driver;extern struct audio_driver pa_audio_driver;extern struct audio_driver spice_audio_driver;extern struct audio_driver winwave_audio_driver;
audio/esdaudio.c deleted +0 -557
557 lines not on this page · raw message
configure +6 -12
@@ -575,13 +575,13 @@ MINGW32*) GNU/kFreeBSD) bsd="yes" audio_drv_list="oss" - audio_possible_drivers="oss sdl esd pa" + audio_possible_drivers="oss sdl pa" ;; FreeBSD) bsd="yes" make="${MAKE-gmake}" audio_drv_list="oss" - audio_possible_drivers="oss sdl esd pa" + audio_possible_drivers="oss sdl pa" # needed for kinfo_getvmmap(3) in libutil.h LIBS="-lutil $LIBS" netmap="" # enable netmap autodetect
@@ -591,14 +591,14 @@ DragonFly) bsd="yes" make="${MAKE-gmake}" audio_drv_list="oss" - audio_possible_drivers="oss sdl esd pa" + audio_possible_drivers="oss sdl pa" HOST_VARIANT_DIR="dragonfly" ;; NetBSD) bsd="yes" make="${MAKE-gmake}" audio_drv_list="oss" - audio_possible_drivers="oss sdl esd" + audio_possible_drivers="oss sdl" oss_lib="-lossaudio" HOST_VARIANT_DIR="netbsd" ;;
@@ -606,7 +606,7 @@ OpenBSD) bsd="yes" make="${MAKE-gmake}" audio_drv_list="sdl" - audio_possible_drivers="sdl esd" + audio_possible_drivers="sdl" HOST_VARIANT_DIR="openbsd" ;; Darwin)
@@ -674,7 +674,7 @@ Haiku) ;; *) audio_drv_list="oss" - audio_possible_drivers="oss alsa sdl esd pa" + audio_possible_drivers="oss alsa sdl pa" linux="yes" linux_user="yes" kvm="yes"
@@ -2630,12 +2630,6 @@ for drv in $audio_drv_list; do libs_softmmu="$fmod_lib $libs_softmmu" ;; - esd) - audio_drv_probe $drv esd.h -lesd 'return esd_play_stream(0, 0, "", 0);' - libs_softmmu="-lesd $libs_softmmu" - audio_pt_int="yes" - ;; - pa) audio_drv_probe $drv pulse/mainloop.h "-lpulse" \ "pa_mainloop *m = 0; pa_mainloop_free (m); return 0;"
Signature · 1 line
2.4.2
PATCH v3 2/12 audio: remove fmod backend
In reply to Kővágó, Zoltán--- audio/Makefile.objs | 2 - audio/audio_int.h | 1 - audio/fmodaudio.c | 685 ---------------------------------------------------- configure | 27 +-- 4 files changed, 2 insertions(+), 713 deletions(-) delete mode 100644 audio/fmodaudio.c
audio/Makefile.objs +0 -2
@@ -5,12 +5,10 @@ common-obj-$(CONFIG_SPICE) += spiceaudio.o common-obj-$(CONFIG_COREAUDIO) += coreaudio.o common-obj-$(CONFIG_ALSA) += alsaaudio.o common-obj-$(CONFIG_DSOUND) += dsoundaudio.o -common-obj-$(CONFIG_FMOD) += fmodaudio.o common-obj-$(CONFIG_PA) += paaudio.o common-obj-$(CONFIG_WINWAVE) += winwaveaudio.o common-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o common-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o common-obj-y += wavcapture.o -$(obj)/audio.o $(obj)/fmodaudio.o: QEMU_CFLAGS += $(FMOD_CFLAGS) sdlaudio.o-cflags := $(SDL_CFLAGS)
audio/audio_int.h +0 -1
@@ -206,7 +206,6 @@ extern struct audio_driver no_audio_driver;extern struct audio_driver oss_audio_driver;extern struct audio_driver sdl_audio_driver;extern struct audio_driver wav_audio_driver; -extern struct audio_driver fmod_audio_driver;extern struct audio_driver alsa_audio_driver;extern struct audio_driver coreaudio_audio_driver;extern struct audio_driver dsound_audio_driver;
audio/fmodaudio.c deleted +0 -685
685 lines not on this page · raw message
configure +2 -25
@@ -285,8 +285,6 @@ sysconfdir="\${prefix}/etc" local_statedir="\${prefix}/var" confsuffix="/qemu" slirp="yes" -fmod_lib="" -fmod_inc="" oss_lib="" bsd="no" linux="no"
@@ -569,7 +567,7 @@ CYGWIN*) ;; MINGW32*) mingw32="yes" - audio_possible_drivers="winwave dsound sdl fmod" + audio_possible_drivers="winwave dsound sdl" audio_drv_list="winwave" ;; GNU/kFreeBSD)
@@ -619,7 +617,7 @@ Darwin) fi cocoa="yes" audio_drv_list="coreaudio" - audio_possible_drivers="coreaudio sdl fmod" + audio_possible_drivers="coreaudio sdl" LDFLAGS="-framework CoreFoundation -framework IOKit $LDFLAGS" libs_softmmu="-F/System/Library/Frameworks -framework Cocoa -framework IOKit $libs_softmmu" # Disable attempts to use ObjectiveC features in os/object.h since they
@@ -680,9 +678,6 @@ Haiku) kvm="yes" vhost_net="yes" vhost_scsi="yes" - if [ "$cpu" = "i386" -o "$cpu" = "x86_64" -o "$cpu" = "x32" ] ; then - audio_possible_drivers="$audio_possible_drivers fmod" - fi QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES" ;; esac
@@ -847,10 +842,6 @@ for opt do ;; --enable-vnc) vnc="yes" ;; - --fmod-lib=*) fmod_lib="$optarg" - ;; - --fmod-inc=*) fmod_inc="$optarg" - ;; --oss-lib=*) oss_lib="$optarg" ;; --audio-drv-list=*) audio_drv_list="$optarg"
@@ -1349,8 +1340,6 @@ Advanced options (experts only): --disable-guest-base disable GUEST_BASE support --enable-pie build Position Independent Executables --disable-pie do not build Position Independent Executables - --fmod-lib path to FMOD library - --fmod-inc path to FMOD includes --oss-lib path to OSS library --cpu=CPU Build for host CPU [$cpu] --disable-uuid disable uuid support
@@ -2621,15 +2610,6 @@ for drv in $audio_drv_list; do libs_softmmu="-lasound $libs_softmmu" ;; - fmod) - if test -z $fmod_lib || test -z $fmod_inc; then - error_exit "You must specify path to FMOD library and headers" \ - "Example: --fmod-inc=/path/include/fmod --fmod-lib=/path/lib/libfmod-3.74.so" - fi - audio_drv_probe $drv fmod.h $fmod_lib "return FSOUND_GetVersion();" "-I $fmod_inc" - libs_softmmu="$fmod_lib $libs_softmmu" - ;; - pa) audio_drv_probe $drv pulse/mainloop.h "-lpulse" \ "pa_mainloop *m = 0; pa_mainloop_free (m); return 0;"
@@ -4621,9 +4601,6 @@ echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak for drv in $audio_drv_list; do def=CONFIG_`echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]'` echo "$def=y" >> $config_host_mak - if test "$drv" = "fmod"; then - echo "FMOD_CFLAGS=-I$fmod_inc" >> $config_host_mak - fi done if test "$audio_pt_int" = "yes" ; then echo "CONFIG_AUDIO_PT_INT=y" >> $config_host_mak
Signature · 1 line
2.4.2
PATCH v3 3/12 audio: remove winwave audio driver
In reply to Kővágó, ZoltánDirectSound should be a superior choice on Windows.
--- audio/Makefile.objs | 1 - audio/audio_int.h | 1 - audio/winwaveaudio.c | 717 --------------------------------------------------- configure | 13 +- 4 files changed, 4 insertions(+), 728 deletions(-) delete mode 100644 audio/winwaveaudio.c
audio/Makefile.objs +0 -1
@@ -6,7 +6,6 @@ common-obj-$(CONFIG_COREAUDIO) += coreaudio.o common-obj-$(CONFIG_ALSA) += alsaaudio.o common-obj-$(CONFIG_DSOUND) += dsoundaudio.o common-obj-$(CONFIG_PA) += paaudio.o -common-obj-$(CONFIG_WINWAVE) += winwaveaudio.o common-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o common-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o common-obj-y += wavcapture.o
audio/audio_int.h +0 -1
@@ -211,7 +211,6 @@ extern struct audio_driver coreaudio_audio_driver;extern struct audio_driver dsound_audio_driver;extern struct audio_driver pa_audio_driver;extern struct audio_driver spice_audio_driver; -extern struct audio_driver winwave_audio_driver;extern const struct mixeng_volume nominal_volume;void audio_pcm_init_info (struct audio_pcm_info *info,struct audsettings *as);
audio/winwaveaudio.c deleted +0 -717
717 lines not on this page · raw message
configure +4 -9
@@ -562,13 +562,13 @@ case $targetos in CYGWIN*) mingw32="yes" QEMU_CFLAGS="-mno-cygwin $QEMU_CFLAGS" - audio_possible_drivers="winwave sdl" - audio_drv_list="winwave" + audio_possible_drivers="sdl" + audio_drv_list="sdl" ;; MINGW32*) mingw32="yes" - audio_possible_drivers="winwave dsound sdl" - audio_drv_list="winwave" + audio_possible_drivers="dsound sdl" + audio_drv_list="dsound" ;; GNU/kFreeBSD) bsd="yes"
@@ -2634,11 +2634,6 @@ for drv in $audio_drv_list; do # XXX: Probes for CoreAudio, DirectSound, SDL(?) ;; - winwave) - libs_softmmu="-lwinmm $libs_softmmu" - audio_win_int="yes" - ;; - *) echo "$audio_possible_drivers" | grep -q "\<$drv\>" || { error_exit "Unknown driver '$drv' selected" \
Signature · 1 line
2.4.2
PATCH v3 4/12 audio: expose drv_opaque to init_out and init_in
In reply to Kővágó, ZoltánCurrently the opaque pointer returned by audio_driver's init is only exposed to the driver's fini, but not to audio_pcm_ops. This way if someone wants to share a variable with the driver and the pcm, he must use global variables. This patch fixes it by adding a third parameter to audio_pcm_op's init_out and init_in.
--- audio/alsaaudio.c | 5 +++-- audio/audio_int.h | 4 ++-- audio/audio_template.h | 2 +- audio/coreaudio.c | 3 ++- audio/dsound_template.h | 6 ++++-- audio/noaudio.c | 4 ++-- audio/ossaudio.c | 5 +++-- audio/paaudio.c | 5 +++-- audio/sdlaudio.c | 3 ++- audio/spiceaudio.c | 5 +++-- audio/wavaudio.c | 5 ++--- 11 files changed, 27 insertions(+), 20 deletions(-)
audio/alsaaudio.c +3 -2
@@ -819,7 +819,8 @@ static void alsa_fini_out (HWVoiceOut *hw) alsa->pcm_buf =NULL ; } -static int alsa_init_out (HWVoiceOut *hw,struct audsettings *as) +static int alsa_init_out (HWVoiceOut *hw,struct audsettings *as, +void *drv_opaque) {ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;struct alsa_params_req req;
@@ -928,7 +929,7 @@ static int alsa_ctl_out (HWVoiceOut *hw, int cmd, ...)return -1 ; } -static int alsa_init_in (HWVoiceIn *hw,struct audsettings *as) +static int alsa_init_in (HWVoiceIn *hw,struct audsettings *as,void *drv_opaque) {ALSAVoiceIn *alsa = (ALSAVoiceIn *) hw;struct alsa_params_req req;
audio/audio_int.h +2 -2
@@ -156,13 +156,13 @@ struct audio_driver { };struct audio_pcm_ops { -int (*init_out)(HWVoiceOut *hw,struct audsettings *as); +int (*init_out)(HWVoiceOut *hw,struct audsettings *as,void *drv_opaque);void (*fini_out)(HWVoiceOut *hw);int (*run_out) (HWVoiceOut *hw,int live);int (*write) (SWVoiceOut *sw,void *buf,int size);int (*ctl_out) (HWVoiceOut *hw,int cmd, ...); -int (*init_in) (HWVoiceIn *hw,struct audsettings *as); +int (*init_in) (HWVoiceIn *hw,struct audsettings *as,void *drv_opaque);void (*fini_in) (HWVoiceIn *hw);int (*run_in) (HWVoiceIn *hw);int (*read) (SWVoiceIn *sw,void *buf,int size);
audio/audio_template.h +1 -1
@@ -262,7 +262,7 @@ static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)#ifdef DAC QLIST_INIT (&hw->cap_head);#endif -if (glue (hw->pcm_ops->init_,TYPE ) (hw, as)) { +if (glue (hw->pcm_ops->init_,TYPE ) (hw, as, s->drv_opaque)) { goto err0; }
audio/coreaudio.c +2 -1
@@ -287,7 +287,8 @@ static int coreaudio_write (SWVoiceOut *sw, void *buf, int len)return audio_pcm_sw_write (sw, buf, len); } -static int coreaudio_init_out (HWVoiceOut *hw,struct audsettings *as) +static int coreaudio_init_out (HWVoiceOut *hw,struct audsettings *as, +void *drv_opaque) {OSStatus status;coreaudioVoiceOut *core = (coreaudioVoiceOut *) hw;
audio/dsound_template.h +4 -2
@@ -174,9 +174,11 @@ static void dsound_fini_out (HWVoiceOut *hw) }#ifdef DSBTYPE_IN -static int dsound_init_in (HWVoiceIn *hw, struct audsettings *as) +static int dsound_init_in (HWVoiceIn *hw,struct audsettings *as, + void *drv_opaque)#else -static int dsound_init_out (HWVoiceOut *hw, struct audsettings *as) +static int dsound_init_out (HWVoiceOut *hw,struct audsettings *as, + void *drv_opaque)#endif {int err;
audio/noaudio.c +2 -2
@@ -63,7 +63,7 @@ static int no_write (SWVoiceOut *sw, void *buf, int len)return audio_pcm_sw_write (sw, buf, len); } -static int no_init_out (HWVoiceOut *hw,struct audsettings *as) +static int no_init_out (HWVoiceOut *hw,struct audsettings *as,void *drv_opaque) {audio_pcm_init_info (&hw->info, as); hw->samples =1024 ;
@@ -82,7 +82,7 @@ static int no_ctl_out (HWVoiceOut *hw, int cmd, ...)return 0 ; } -static int no_init_in (HWVoiceIn *hw,struct audsettings *as) +static int no_init_in (HWVoiceIn *hw,struct audsettings *as,void *drv_opaque) {audio_pcm_init_info (&hw->info, as); hw->samples =1024 ;
audio/ossaudio.c +3 -2
@@ -510,7 +510,8 @@ static void oss_fini_out (HWVoiceOut *hw) } } -static int oss_init_out (HWVoiceOut *hw,struct audsettings *as) +static int oss_init_out (HWVoiceOut *hw,struct audsettings *as, +void *drv_opaque) {OSSVoiceOut *oss = (OSSVoiceOut *) hw;struct oss_params req, obt;
@@ -676,7 +677,7 @@ static int oss_ctl_out (HWVoiceOut *hw, int cmd, ...)return 0 ; } -static int oss_init_in (HWVoiceIn *hw,struct audsettings *as) +static int oss_init_in (HWVoiceIn *hw,struct audsettings *as,void *drv_opaque) {OSSVoiceIn *oss = (OSSVoiceIn *) hw;struct oss_params req, obt;
audio/paaudio.c +3 -2
@@ -534,7 +534,8 @@ fail:return NULL ; } -static int qpa_init_out (HWVoiceOut *hw,struct audsettings *as) +static int qpa_init_out (HWVoiceOut *hw,struct audsettings *as, +void *drv_opaque) {int error;static pa_sample_spec ss;
@@ -601,7 +602,7 @@ static int qpa_init_out (HWVoiceOut *hw, struct audsettings *as)return -1 ; } -static int qpa_init_in (HWVoiceIn *hw,struct audsettings *as) +static int qpa_init_in (HWVoiceIn *hw,struct audsettings *as,void *drv_opaque) {int error;static pa_sample_spec ss;
audio/sdlaudio.c +2 -1
@@ -332,7 +332,8 @@ static void sdl_fini_out (HWVoiceOut *hw)sdl_close (&glob_sdl); } -static int sdl_init_out (HWVoiceOut *hw,struct audsettings *as) +static int sdl_init_out (HWVoiceOut *hw,struct audsettings *as, +void *drv_opaque) {SDLVoiceOut *sdl = (SDLVoiceOut *) hw;SDLAudioState *s = &glob_sdl;
audio/spiceaudio.c +3 -2
@@ -115,7 +115,8 @@ static int rate_get_samples (struct audio_pcm_info *info, SpiceRateCtl *rate)/* playback */ -static int line_out_init (HWVoiceOut *hw,struct audsettings *as) +static int line_out_init (HWVoiceOut *hw,struct audsettings *as, +void *drv_opaque) {SpiceVoiceOut *out =container_of (hw, SpiceVoiceOut, hw);struct audsettings settings;
@@ -243,7 +244,7 @@ static int line_out_ctl (HWVoiceOut *hw, int cmd, ...)/* record */ -static int line_in_init (HWVoiceIn *hw,struct audsettings *as) +static int line_in_init (HWVoiceIn *hw,struct audsettings *as,void *drv_opaque) {SpiceVoiceIn *in =container_of (hw, SpiceVoiceIn, hw);struct audsettings settings;
audio/wavaudio.c +2 -3
@@ -105,7 +105,8 @@ static void le_store (uint8_t *buf, uint32_t val, int len) } } -static int wav_init_out (HWVoiceOut *hw,struct audsettings *as) +static int wav_init_out (HWVoiceOut *hw,struct audsettings *as, +void *drv_opaque) {WAVVoiceOut *wav = (WAVVoiceOut *) hw;int bits16 =0 , stereo =0 ;
@@ -117,8 +118,6 @@ static int wav_init_out (HWVoiceOut *hw, struct audsettings *as) };struct audsettings wav_as = conf.settings; - (void ) as; - stereo = wav_as.nchannels ==2 ;switch (wav_as.fmt) {case AUD_FMT_S8 :
Signature · 1 line
2.4.2
PATCH v3 5/12 alsaaudio: do not use global variables
In reply to Kővágó, Zoltán--- audio/alsaaudio.c | 160 +++++++++++++++++++++++++++++------------------------- 1 file changed, 87 insertions(+), 73 deletions(-)
audio/alsaaudio.c +87 -73
@@ -33,30 +33,7 @@#define AUDIO_CAP "alsa"#include "audio_int.h" -struct pollhlp { -snd_pcm_t *handle; -struct pollfd *pfds; -int count; -int mask; -}; - -typedef struct ALSAVoiceOut { -HWVoiceOut hw; -int wpos; -int pending; -void *pcm_buf; -snd_pcm_t *handle; -struct pollhlp pollhlp; -}ALSAVoiceOut ; - -typedef struct ALSAVoiceIn { -HWVoiceIn hw; -snd_pcm_t *handle; -void *pcm_buf; -struct pollhlp pollhlp; -}ALSAVoiceIn ; - -static struct { +typedef struct ALSAConf { int size_in_usec_in; int size_in_usec_out; const char *pcm_name_in;
@@ -73,13 +50,32 @@ static struct {int buffer_size_out_overridden;int period_size_out_overridden;int verbose; -} conf = { - .buffer_size_out = 4096, - .period_size_out = 1024, - .pcm_name_out = "default", - .pcm_name_in = "default", +} ALSAConf; + +struct pollhlp { +snd_pcm_t *handle; +struct pollfd *pfds; +ALSAConf *conf; +int count; +int mask; }; +typedef struct ALSAVoiceOut { +HWVoiceOut hw; +int wpos; +int pending; +void *pcm_buf; +snd_pcm_t *handle; +struct pollhlp pollhlp; +}ALSAVoiceOut ; + +typedef struct ALSAVoiceIn { +HWVoiceIn hw; +snd_pcm_t *handle; +void *pcm_buf; +struct pollhlp pollhlp; +}ALSAVoiceIn ; +struct alsa_params_req {int freq;snd_pcm_format_t fmt;
@@ -184,6 +180,7 @@ static void alsa_poll_handler (void *opaque)snd_pcm_state_t state;struct pollhlp *hlp = opaque;unsigned short revents; +ALSAConf *conf = hlp->conf; count =poll (hlp->pfds, hlp->count,0 );if (count <0 ) {
@@ -205,7 +202,7 @@ static void alsa_poll_handler (void *opaque) }if (!(revents & hlp->mask)) { -if (conf.verbose) { +if (conf->verbose) {dolog ("revents = %d\n" , revents); }return ;
@@ -242,6 +239,7 @@ static int alsa_poll_helper (snd_pcm_t *handle, struct pollhlp *hlp, int mask) {int i, count, err;struct pollfd *pfds; +ALSAConf *conf = hlp->conf; count =snd_pcm_poll_descriptors_count (handle);if (count <=0 ) {
@@ -270,13 +268,13 @@ static int alsa_poll_helper (snd_pcm_t *handle, struct pollhlp *hlp, int mask) NULL, hlp); }if (pfds[i].events &POLLOUT ) { -if (conf.verbose) { +if (conf->verbose) {dolog ("POLLOUT %d %d\n" , i, pfds[i].fd); } err =qemu_set_fd_handler (pfds[i].fd,NULL , alsa_poll_handler, hlp); } -if (conf.verbose) { +if (conf->verbose) {dolog ("Set handler events=%#x index=%d fd=%d err=%d\n" , pfds[i].events, i, pfds[i].fd, err); }
@@ -476,14 +474,15 @@ static void alsa_set_threshold (snd_pcm_t *handle, snd_pcm_uframes_t threshold) }static int alsa_open (int in,struct alsa_params_req *req, -struct alsa_params_obt *obt,snd_pcm_t **handlep) +struct alsa_params_obt *obt,snd_pcm_t **handlep, +ALSAConf *conf) {snd_pcm_t *handle;snd_pcm_hw_params_t *hw_params;int err;int size_in_usec;unsigned int freq, nchannels; -const char *pcm_name = in ? conf.pcm_name_in : conf.pcm_name_out; +const char *pcm_name = in ? conf->pcm_name_in : conf->pcm_name_out;snd_pcm_uframes_t obt_buffer_size;const char *typ = in ?"ADC" :"DAC" ;snd_pcm_format_t obtfmt;
@@ -522,7 +521,7 @@ static int alsa_open (int in, struct alsa_params_req *req, } err =snd_pcm_hw_params_set_format (handle, hw_params, req->fmt); -if (err <0 && conf.verbose) { +if (err <0 && conf->verbose) {alsa_logerr2 (err, typ,"Failed to set format %d\n" , req->fmt); }
@@ -654,7 +653,7 @@ static int alsa_open (int in, struct alsa_params_req *req, goto err; } -if (!in && conf.threshold) { +if (!in && conf->threshold) {snd_pcm_uframes_t threshold;int bytes_per_sec;
@@ -676,7 +675,7 @@ static int alsa_open (int in, struct alsa_params_req *req,break ; } - threshold = (conf.threshold * bytes_per_sec) /1000 ; + threshold = (conf->threshold * bytes_per_sec) /1000 ;alsa_set_threshold (handle, threshold); }
@@ -686,7 +685,7 @@ static int alsa_open (int in, struct alsa_params_req *req, *handlep = handle; -if (conf.verbose && +if (conf->verbose && (obtfmt != req->fmt || obt->nchannels != req->nchannels || obt->freq != req->freq)) {
@@ -729,6 +728,7 @@ static snd_pcm_sframes_t alsa_get_avail (snd_pcm_t *handle)static void alsa_write_pending (ALSAVoiceOut *alsa) {HWVoiceOut *hw = &alsa->hw; +ALSAConf *conf = alsa->pollhlp.conf;while (alsa->pending) {int left_till_end_samples = hw->samples - alsa->wpos;
@@ -743,7 +743,7 @@ static void alsa_write_pending (ALSAVoiceOut *alsa)if (written <=0 ) {switch (written) {case 0 : -if (conf.verbose) { +if (conf->verbose) {dolog ("Failed to write %d frames (wrote zero)\n" , len); }return ;
@@ -754,7 +754,7 @@ static void alsa_write_pending (ALSAVoiceOut *alsa) len);return ; } -if (conf.verbose) { +if (conf->verbose) {dolog ("Recovering from playback xrun\n" ); }continue ;
@@ -767,7 +767,7 @@ static void alsa_write_pending (ALSAVoiceOut *alsa) len);return ; } -if (conf.verbose) { +if (conf->verbose) {dolog ("Resuming suspended output stream\n" ); }continue ;
@@ -827,18 +827,19 @@ static int alsa_init_out(HWVoiceOut *hw, struct audsettings *as,struct alsa_params_obt obt;snd_pcm_t *handle;struct audsettings obt_as; +ALSAConf *conf = drv_opaque; req.fmt =aud_to_alsafmt (as->fmt, as->endianness); req.freq = as->freq; req.nchannels = as->nchannels; - req.period_size = conf.period_size_out; - req.buffer_size = conf.buffer_size_out; - req.size_in_usec = conf.size_in_usec_out; + req.period_size = conf->period_size_out; + req.buffer_size = conf->buffer_size_out; + req.size_in_usec = conf->size_in_usec_out; req.override_mask = - (conf.period_size_out_overridden ?1 :0 ) | - (conf.buffer_size_out_overridden ?2 :0 ); + (conf->period_size_out_overridden ?1 :0 ) | + (conf->buffer_size_out_overridden ?2 :0 ); -if (alsa_open (0 , &req, &obt, &handle)) { +if (alsa_open (0 , &req, &obt, &handle, conf)) {return -1 ; }
@@ -859,6 +860,7 @@ static int alsa_init_out(HWVoiceOut *hw, struct audsettings *as, } alsa->handle = handle; + alsa->pollhlp.conf = conf;return 0 ; }
@@ -936,18 +938,19 @@ static int alsa_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque)struct alsa_params_obt obt;snd_pcm_t *handle;struct audsettings obt_as; +ALSAConf *conf = drv_opaque; req.fmt =aud_to_alsafmt (as->fmt, as->endianness); req.freq = as->freq; req.nchannels = as->nchannels; - req.period_size = conf.period_size_in; - req.buffer_size = conf.buffer_size_in; - req.size_in_usec = conf.size_in_usec_in; + req.period_size = conf->period_size_in; + req.buffer_size = conf->buffer_size_in; + req.size_in_usec = conf->size_in_usec_in; req.override_mask = - (conf.period_size_in_overridden ?1 :0 ) | - (conf.buffer_size_in_overridden ?2 :0 ); + (conf->period_size_in_overridden ?1 :0 ) | + (conf->buffer_size_in_overridden ?2 :0 ); -if (alsa_open (1 , &req, &obt, &handle)) { +if (alsa_open (1 , &req, &obt, &handle, conf)) {return -1 ; }
@@ -968,6 +971,7 @@ static int alsa_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque) } alsa->handle = handle; + alsa->pollhlp.conf = conf;return 0 ; }
@@ -998,6 +1002,7 @@ static int alsa_run_in (HWVoiceIn *hw) };snd_pcm_sframes_t avail;snd_pcm_uframes_t read_samples =0 ; +ALSAConf *conf = alsa->pollhlp.conf;if (!dead) {return 0 ;
@@ -1023,12 +1028,12 @@ static int alsa_run_in (HWVoiceIn *hw)dolog ("Failed to resume suspended input stream\n" );return 0 ; } -if (conf.verbose) { +if (conf->verbose) {dolog ("Resuming suspended input stream\n" ); }break ;default : -if (conf.verbose) { +if (conf->verbose) {dolog ("No frames available and ALSA state is %d\n" , state); }return 0 ;
@@ -1065,7 +1070,7 @@ static int alsa_run_in (HWVoiceIn *hw)if (nread <=0 ) {switch (nread) {case 0 : -if (conf.verbose) { +if (conf->verbose) {dolog ("Failed to read %ld frames (read zero)\n" , len); } goto exit;
@@ -1075,7 +1080,7 @@ static int alsa_run_in (HWVoiceIn *hw)alsa_logerr (nread,"Failed to read %ld frames\n" , len); goto exit; } -if (conf.verbose) { +if (conf->verbose) {dolog ("Recovering from capture xrun\n" ); }continue ;
@@ -1149,80 +1154,89 @@ static int alsa_ctl_in (HWVoiceIn *hw, int cmd, ...)return -1 ; } +static ALSAConf glob_conf = { + .buffer_size_out =4096 , + .period_size_out =1024 , + .pcm_name_out ="default" , + .pcm_name_in ="default" , +}; +static void *alsa_audio_init (void ) { -return &conf; +ALSAConf *conf =g_malloc (sizeof (ALSAConf)); + *conf = glob_conf; +return conf; }static void alsa_audio_fini (void *opaque) { - (void ) opaque; +g_free (opaque); }static struct audio_option alsa_options[] = { { .name ="DAC_SIZE_IN_USEC" , .tag =AUD_OPT_BOOL , - .valp = &conf.size_in_usec_out, + .valp = &glob_conf.size_in_usec_out, .descr ="DAC period/buffer size in microseconds (otherwise in frames)" }, { .name ="DAC_PERIOD_SIZE" , .tag =AUD_OPT_INT , - .valp = &conf.period_size_out, + .valp = &glob_conf.period_size_out, .descr ="DAC period size (0 to go with system default)" , - .overriddenp = &conf.period_size_out_overridden + .overriddenp = &glob_conf.period_size_out_overridden }, { .name ="DAC_BUFFER_SIZE" , .tag =AUD_OPT_INT , - .valp = &conf.buffer_size_out, + .valp = &glob_conf.buffer_size_out, .descr ="DAC buffer size (0 to go with system default)" , - .overriddenp = &conf.buffer_size_out_overridden + .overriddenp = &glob_conf.buffer_size_out_overridden }, { .name ="ADC_SIZE_IN_USEC" , .tag =AUD_OPT_BOOL , - .valp = &conf.size_in_usec_in, + .valp = &glob_conf.size_in_usec_in, .descr ="ADC period/buffer size in microseconds (otherwise in frames)" }, { .name ="ADC_PERIOD_SIZE" , .tag =AUD_OPT_INT , - .valp = &conf.period_size_in, + .valp = &glob_conf.period_size_in, .descr ="ADC period size (0 to go with system default)" , - .overriddenp = &conf.period_size_in_overridden + .overriddenp = &glob_conf.period_size_in_overridden }, { .name ="ADC_BUFFER_SIZE" , .tag =AUD_OPT_INT , - .valp = &conf.buffer_size_in, + .valp = &glob_conf.buffer_size_in, .descr ="ADC buffer size (0 to go with system default)" , - .overriddenp = &conf.buffer_size_in_overridden + .overriddenp = &glob_conf.buffer_size_in_overridden }, { .name ="THRESHOLD" , .tag =AUD_OPT_INT , - .valp = &conf.threshold, + .valp = &glob_conf.threshold, .descr ="(undocumented)" }, { .name ="DAC_DEV" , .tag =AUD_OPT_STR , - .valp = &conf.pcm_name_out, + .valp = &glob_conf.pcm_name_out, .descr ="DAC device name (for instance dmix)" }, { .name ="ADC_DEV" , .tag =AUD_OPT_STR , - .valp = &conf.pcm_name_in, + .valp = &glob_conf.pcm_name_in, .descr ="ADC device name" }, { .name ="VERBOSE" , .tag =AUD_OPT_BOOL , - .valp = &conf.verbose, + .valp = &glob_conf.verbose, .descr ="Behave in a more verbose way" }, {/* End of list */ }
Signature · 1 line
2.4.2
PATCH v3 6/12 paaudio: do not use global variables
In reply to Kővágó, Zoltán--- audio/paaudio.c | 98 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 52 insertions(+), 46 deletions(-)
audio/paaudio.c +52 -46
@@ -9,6 +9,19 @@#include "audio_pt_int.h" typedef struct { +int samples; +char *server; +char *sink; +char *source; +}PAConf ; + +typedef struct { +PAConf conf; +pa_threaded_mainloop *mainloop; +pa_context *context; +}paaudio ; + +typedef struct { HWVoiceOut hw; int done; int live;
@@ -17,6 +30,7 @@ typedef struct {pa_stream *stream;void *pcm_buf;struct audio_pt pt; +paaudio *g; } PAVoiceOut; typedef struct {
@@ -30,21 +44,9 @@ typedef struct {struct audio_pt pt;const void *read_data;size_t read_index, read_length; +paaudio *g; } PAVoiceIn; -typedef struct { -int samples; -char *server; -char *sink; -char *source; -pa_threaded_mainloop *mainloop; -pa_context *context; -}paaudio ; - -static paaudio glob_paaudio = { - .samples =4096 , -}; - static void GCC_FMT_ATTR (2, 3) qpa_logerr (int err, const char *fmt, ...) { va_list ap;
@@ -106,7 +108,7 @@ static inline int PA_STREAM_IS_GOOD(pa_stream_state_t x)static int qpa_simple_read (PAVoiceIn *p,void *data,size_t length,int *rerror) { -paaudio *g = &glob_paaudio; +paaudio *g = p->g;pa_threaded_mainloop_lock (g->mainloop);
@@ -160,7 +162,7 @@ unlock_and_fail:static int qpa_simple_write (PAVoiceOut *p,const void *data,size_t length,int *rerror) { -paaudio *g = &glob_paaudio; +paaudio *g = p->g;pa_threaded_mainloop_lock (g->mainloop);
@@ -222,7 +224,7 @@ static void *qpa_thread_out (void *arg) } } - decr = to_mix =audio_MIN (pa->live, glob_paaudio.samples >>2 ); + decr = to_mix =audio_MIN (pa->live, pa->g->conf.samples >>2 ); rpos = pa->rpos;if (audio_pt_unlock (&pa->pt,AUDIO_FUNC )) {
@@ -314,7 +316,7 @@ static void *qpa_thread_in (void *arg) } } - incr = to_grab =audio_MIN (pa->dead, glob_paaudio.samples >>2 ); + incr = to_grab =audio_MIN (pa->dead, pa->g->conf.samples >>2 ); wpos = pa->wpos;if (audio_pt_unlock (&pa->pt,AUDIO_FUNC )) {
@@ -430,7 +432,7 @@ static audfmt_e pa_to_audfmt (pa_sample_format_t fmt, int *endianness)static void context_state_cb (pa_context *c,void *userdata) { -paaudio *g = &glob_paaudio; +paaudio *g = userdata;switch (pa_context_get_state (c)) {case PA_CONTEXT_READY :
@@ -449,7 +451,7 @@ static void context_state_cb (pa_context *c, void *userdata)static void stream_state_cb (pa_stream *s,void * userdata) { -paaudio *g = &glob_paaudio; +paaudio *g = userdata;switch (pa_stream_get_state (s)) {
@@ -467,23 +469,21 @@ static void stream_state_cb (pa_stream *s, void * userdata)static void stream_request_cb (pa_stream *s,size_t length,void *userdata) { -paaudio *g = &glob_paaudio; +paaudio *g = userdata;pa_threaded_mainloop_signal (g->mainloop,0 ); }static pa_stream *qpa_simple_new ( -const char *server, +paaudio *g,const char *name,pa_stream_direction_t dir,const char *dev, -const char *stream_name,const pa_sample_spec *ss,const pa_channel_map *map,const pa_buffer_attr *attr,int *rerror) { -paaudio *g = &glob_paaudio;int r;pa_stream *stream;
@@ -538,10 +538,11 @@ static int qpa_init_out(HWVoiceOut *hw, struct audsettings *as, void *drv_opaque) {int error; -static pa_sample_spec ss; -static pa_buffer_attr ba; +pa_sample_spec ss; +pa_buffer_attr ba;struct audsettings obt_as = *as;PAVoiceOut *pa = (PAVoiceOut *) hw; +paaudio *g = pa->g = drv_opaque; ss.format =audfmt_to_pa (as->fmt, as->endianness); ss.channels = as->nchannels;
@@ -559,11 +560,10 @@ static int qpa_init_out(HWVoiceOut *hw, struct audsettings *as, obt_as.fmt =pa_to_audfmt (ss.format, &obt_as.endianness); pa->stream = qpa_simple_new ( - glob_paaudio.server, + g, "qemu", PA_STREAM_PLAYBACK, - glob_paaudio.sink, - "pcm.playback", + g->conf.sink, &ss, NULL, /* channel map */ &ba, /* buffering attributes */
@@ -575,7 +575,7 @@ static int qpa_init_out(HWVoiceOut *hw, struct audsettings *as, }audio_pcm_init_info (&hw->info, &obt_as); - hw->samples = glob_paaudio.samples; + hw->samples = g->conf.samples; pa->pcm_buf =audio_calloc (AUDIO_FUNC , hw->samples,1 << hw->info.shift); pa->rpos = hw->rpos;if (!pa->pcm_buf) {
@@ -605,9 +605,10 @@ static int qpa_init_out(HWVoiceOut *hw, struct audsettings *as,static int qpa_init_in (HWVoiceIn *hw,struct audsettings *as,void *drv_opaque) {int error; -static pa_sample_spec ss; +pa_sample_spec ss;struct audsettings obt_as = *as;PAVoiceIn *pa = (PAVoiceIn *) hw; +paaudio *g = pa->g = drv_opaque; ss.format =audfmt_to_pa (as->fmt, as->endianness); ss.channels = as->nchannels;
@@ -616,11 +617,10 @@ static int qpa_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque) obt_as.fmt =pa_to_audfmt (ss.format, &obt_as.endianness); pa->stream = qpa_simple_new ( - glob_paaudio.server, + g, "qemu", PA_STREAM_RECORD, - glob_paaudio.source, - "pcm.capture", + g->conf.source, &ss, NULL, /* channel map */ NULL, /* buffering attributes */
@@ -632,7 +632,7 @@ static int qpa_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque) }audio_pcm_init_info (&hw->info, &obt_as); - hw->samples = glob_paaudio.samples; + hw->samples = g->conf.samples; pa->pcm_buf =audio_calloc (AUDIO_FUNC , hw->samples,1 << hw->info.shift); pa->wpos = hw->wpos;if (!pa->pcm_buf) {
@@ -704,7 +704,7 @@ static int qpa_ctl_out (HWVoiceOut *hw, int cmd, ...)PAVoiceOut *pa = (PAVoiceOut *) hw;pa_operation *op;pa_cvolume v; -paaudio *g = &glob_paaudio; +paaudio *g = pa->g;#ifdef PA_CHECK_VERSION /* macro is present in 0.9.16+ */ pa_cvolume_init (&v);/* function is present in 0.9.13+ */
@@ -756,7 +756,7 @@ static int qpa_ctl_in (HWVoiceIn *hw, int cmd, ...)PAVoiceIn *pa = (PAVoiceIn *) hw;pa_operation *op;pa_cvolume v; -paaudio *g = &glob_paaudio; +paaudio *g = pa->g;#ifdef PA_CHECK_VERSION pa_cvolume_init (&v);
@@ -806,23 +806,29 @@ static int qpa_ctl_in (HWVoiceIn *hw, int cmd, ...) }/* common */ +static PAConf glob_conf = { + .samples =4096 , +}; +static void *qpa_audio_init (void ) { -paaudio *g = &glob_paaudio; +paaudio *g =g_malloc (sizeof (paaudio)); + g->conf = glob_conf; g->mainloop =pa_threaded_mainloop_new ();if (!g->mainloop) { goto fail; } - g->context =pa_context_new (pa_threaded_mainloop_get_api (g->mainloop), glob_paaudio.server); + g->context =pa_context_new (pa_threaded_mainloop_get_api (g->mainloop), + g->conf.server);if (!g->context) { goto fail; }pa_context_set_state_callback (g->context, context_state_cb, g); -if (pa_context_connect (g->context, glob_paaudio.server,0 ,NULL ) <0 ) { +if (pa_context_connect (g->context, g->conf.server,0 ,NULL ) <0 ) {qpa_logerr (pa_context_errno (g->context),"pa_context_connect() failed\n" ); goto fail;
@@ -855,12 +861,13 @@ static void *qpa_audio_init (void)pa_threaded_mainloop_unlock (g->mainloop); -return &glob_paaudio; +return g; unlock_and_fail:pa_threaded_mainloop_unlock (g->mainloop); fail:AUD_log (AUDIO_CAP ,"Failed to initialize PA context" ); +g_free (g);return NULL ; }
@@ -875,39 +882,38 @@ static void qpa_audio_fini (void *opaque)if (g->context) {pa_context_disconnect (g->context);pa_context_unref (g->context); - g->context =NULL ; }if (g->mainloop) {pa_threaded_mainloop_free (g->mainloop); } - g->mainloop =NULL ; +g_free (g); }struct audio_option qpa_options[] = { { .name ="SAMPLES" , .tag =AUD_OPT_INT , - .valp = &glob_paaudio.samples, + .valp = &glob_conf.samples, .descr ="buffer size in samples" }, { .name ="SERVER" , .tag =AUD_OPT_STR , - .valp = &glob_paaudio.server, + .valp = &glob_conf.server, .descr ="server address" }, { .name ="SINK" , .tag =AUD_OPT_STR , - .valp = &glob_paaudio.sink, + .valp = &glob_conf.sink, .descr ="sink device name" }, { .name ="SOURCE" , .tag =AUD_OPT_STR , - .valp = &glob_paaudio.source, + .valp = &glob_conf.source, .descr ="source device name" }, {/* End of list */ }
Signature · 1 line
2.4.2
PATCH v3 7/12 ossaudio: do not use global variables
In reply to Kővágó, Zoltán--- audio/ossaudio.c | 110 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 61 insertions(+), 49 deletions(-)
audio/ossaudio.c +61 -49
@@ -38,6 +38,17 @@#define USE_DSP_POLICY #endif +typedef struct OSSConf { +int try_mmap; +int nfrags; +int fragsize; +const char *devpath_out; +const char *devpath_in; +int debug; +int exclusive; +int policy; +}OSSConf ; + typedef struct OSSVoiceOut { HWVoiceOut hw; void *pcm_buf;
@@ -47,6 +58,7 @@ typedef struct OSSVoiceOut {int fragsize;int mmapped;int pending; +OSSConf *conf; } OSSVoiceOut; typedef struct OSSVoiceIn {
@@ -55,28 +67,9 @@ typedef struct OSSVoiceIn {int fd;int nfrags;int fragsize; +OSSConf *conf; } OSSVoiceIn; -static struct { -int try_mmap; -int nfrags; -int fragsize; -const char *devpath_out; -const char *devpath_in; -int debug; -int exclusive; -int policy; -} conf = { - .try_mmap =0 , - .nfrags =4 , - .fragsize =4096 , - .devpath_out ="/dev/dsp" , - .devpath_in ="/dev/dsp" , - .debug =0 , - .exclusive =0 , - .policy =5 -}; -struct oss_params {int freq;audfmt_e fmt;
@@ -272,18 +265,18 @@ static int oss_get_version (int fd, int *version, const char *typ)#endif static int oss_open (int in,struct oss_params *req, -struct oss_params *obt,int *pfd) +struct oss_params *obt,int *pfd,OSSConf * conf) {int fd; -int oflags = conf.exclusive ?O_EXCL :0 ; +int oflags = conf->exclusive ?O_EXCL :0 ;audio_buf_info abinfo;int fmt, freq, nchannels;int setfragment =1 ; -const char *dspname = in ? conf.devpath_in : conf.devpath_out; +const char *dspname = in ? conf->devpath_in : conf->devpath_out;const char *typ = in ?"ADC" :"DAC" ;/* Kludge needed to have working mmap on Linux */ - oflags |= conf.try_mmap ?O_RDWR : (in ?O_RDONLY :O_WRONLY ); + oflags |= conf->try_mmap ?O_RDWR : (in ?O_RDONLY :O_WRONLY ); fd =open (dspname, oflags |O_NONBLOCK );if (-1 == fd) {
@@ -317,20 +310,20 @@ static int oss_open (int in, struct oss_params *req, }#ifdef USE_DSP_POLICY -if (conf.policy >=0 ) { +if (conf->policy >=0 ) {int version;if (!oss_get_version (fd, &version, typ)) { -if (conf.debug) { +if (conf->debug) {dolog ("OSS version = %#x\n" , version); }if (version >=0x040000 ) { -int policy = conf.policy; +int policy = conf->policy;if (ioctl (fd,SNDCTL_DSP_POLICY , &policy)) {oss_logerr2 (errno, typ,"Failed to set timing policy to %d\n" , - conf.policy); + conf->policy); goto err; } setfragment =0 ;
@@ -434,6 +427,7 @@ static int oss_run_out (HWVoiceOut *hw, int live)struct audio_buf_info abinfo;struct count_info cntinfo;int bufsize; +OSSConf *conf = oss->conf; bufsize = hw->samples << hw->info.shift;
@@ -458,7 +452,7 @@ static int oss_run_out (HWVoiceOut *hw, int live) }if (abinfo.bytes > bufsize) { -if (conf.debug) { +if (conf->debug) {dolog ("warning: Invalid available size, size=%d bufsize=%d\n" "please report your OS/audio hw to [email protected]\n" , abinfo.bytes, bufsize);
@@ -467,7 +461,7 @@ static int oss_run_out (HWVoiceOut *hw, int live) }if (abinfo.bytes <0 ) { -if (conf.debug) { +if (conf->debug) {dolog ("warning: Invalid available size, size=%d bufsize=%d\n" , abinfo.bytes, bufsize); }
@@ -520,16 +514,17 @@ static int oss_init_out(HWVoiceOut *hw, struct audsettings *as,int fd;audfmt_e effective_fmt;struct audsettings obt_as; +OSSConf *conf = drv_opaque; oss->fd =-1 ; req.fmt =aud_to_ossfmt (as->fmt, as->endianness); req.freq = as->freq; req.nchannels = as->nchannels; - req.fragsize = conf.fragsize; - req.nfrags = conf.nfrags; + req.fragsize = conf->fragsize; + req.nfrags = conf->nfrags; -if (oss_open (0 , &req, &obt, &fd)) { +if (oss_open (0 , &req, &obt, &fd, conf)) {return -1 ; }
@@ -556,7 +551,7 @@ static int oss_init_out(HWVoiceOut *hw, struct audsettings *as, hw->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift; oss->mmapped =0 ; -if (conf.try_mmap) { +if (conf->try_mmap) { oss->pcm_buf = mmap ( NULL, hw->samples << hw->info.shift,
@@ -616,6 +611,7 @@ static int oss_init_out(HWVoiceOut *hw, struct audsettings *as, } oss->fd = fd; + oss->conf = conf;return 0 ; }
@@ -686,15 +682,16 @@ static int oss_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque)int fd;audfmt_e effective_fmt;struct audsettings obt_as; +OSSConf *conf = drv_opaque; oss->fd =-1 ; req.fmt =aud_to_ossfmt (as->fmt, as->endianness); req.freq = as->freq; req.nchannels = as->nchannels; - req.fragsize = conf.fragsize; - req.nfrags = conf.nfrags; -if (oss_open (1 , &req, &obt, &fd)) { + req.fragsize = conf->fragsize; + req.nfrags = conf->nfrags; +if (oss_open (1 , &req, &obt, &fd, conf)) {return -1 ; }
@@ -728,6 +725,7 @@ static int oss_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque) } oss->fd = fd; + oss->conf = conf;return 0 ; }
@@ -846,69 +844,83 @@ static int oss_ctl_in (HWVoiceIn *hw, int cmd, ...)return 0 ; } +static OSSConf glob_conf = { + .try_mmap =0 , + .nfrags =4 , + .fragsize =4096 , + .devpath_out ="/dev/dsp" , + .devpath_in ="/dev/dsp" , + .debug =0 , + .exclusive =0 , + .policy =5 +}; +static void *oss_audio_init (void ) { -if (access (conf.devpath_in,R_OK |W_OK ) <0 || -access (conf.devpath_out,R_OK |W_OK ) <0 ) { +OSSConf *conf =g_malloc (sizeof (OSSConf)); + *conf = glob_conf; + +if (access (conf->devpath_in,R_OK |W_OK ) <0 || +access (conf->devpath_out,R_OK |W_OK ) <0 ) {return NULL ; } -return &conf; +return conf; }static void oss_audio_fini (void *opaque) { - (void ) opaque; +g_free (opaque); }static struct audio_option oss_options[] = { { .name ="FRAGSIZE" , .tag =AUD_OPT_INT , - .valp = &conf.fragsize, + .valp = &glob_conf.fragsize, .descr ="Fragment size in bytes" }, { .name ="NFRAGS" , .tag =AUD_OPT_INT , - .valp = &conf.nfrags, + .valp = &glob_conf.nfrags, .descr ="Number of fragments" }, { .name ="MMAP" , .tag =AUD_OPT_BOOL , - .valp = &conf.try_mmap, + .valp = &glob_conf.try_mmap, .descr ="Try using memory mapped access" }, { .name ="DAC_DEV" , .tag =AUD_OPT_STR , - .valp = &conf.devpath_out, + .valp = &glob_conf.devpath_out, .descr ="Path to DAC device" }, { .name ="ADC_DEV" , .tag =AUD_OPT_STR , - .valp = &conf.devpath_in, + .valp = &glob_conf.devpath_in, .descr ="Path to ADC device" }, { .name ="EXCLUSIVE" , .tag =AUD_OPT_BOOL , - .valp = &conf.exclusive, + .valp = &glob_conf.exclusive, .descr ="Open device in exclusive mode (vmix wont work)" }, #ifdef USE_DSP_POLICY { .name ="POLICY" , .tag =AUD_OPT_INT , - .valp = &conf.policy, + .valp = &glob_conf.policy, .descr ="Set the timing policy of the device, -1 to use fragment mode" , }, #endif { .name ="DEBUG" , .tag =AUD_OPT_BOOL , - .valp = &conf.debug, + .valp = &glob_conf.debug, .descr ="Turn on some debugging messages" }, {/* End of list */ }
Signature · 1 line
2.4.2
PATCH v3 8/12 wavaudio: do not use global variables
In reply to Kővágó, Zoltán--- audio/wavaudio.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-)
audio/wavaudio.c +21 -16
@@ -36,15 +36,10 @@ typedef struct WAVVoiceOut {int total_samples; } WAVVoiceOut; -static struct { +typedef struct {struct audsettings settings;const char *wav_path; -} conf = { - .settings.freq =44100 , - .settings.nchannels =2 , - .settings.fmt =AUD_FMT_S16 , - .wav_path ="qemu.wav" -}; +}WAVConf ;static int wav_run_out (HWVoiceOut *hw,int live) {
@@ -116,7 +111,8 @@ static int wav_init_out(HWVoiceOut *hw, struct audsettings *as,0x02 ,0x00 ,0x44 ,0xac ,0x00 ,0x00 ,0x10 ,0xb1 ,0x02 ,0x00 ,0x04 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61 ,0x00 ,0x00 ,0x00 ,0x00 }; -struct audsettings wav_as = conf.settings; +WAVConf *conf = drv_opaque; +struct audsettings wav_as = conf->settings; stereo = wav_as.nchannels ==2 ;switch (wav_as.fmt) {
@@ -154,10 +150,10 @@ static int wav_init_out(HWVoiceOut *hw, struct audsettings *as,le_store (hdr +28 , hw->info.freq << (bits16 + stereo),4 );le_store (hdr +32 ,1 << (bits16 + stereo),2 ); - wav->f =fopen (conf.wav_path,"wb" ); + wav->f =fopen (conf->wav_path,"wb" );if (!wav->f) {dolog ("Failed to open wave file `%s'\nReason: %s\n" , - conf.wav_path,strerror (errno)); + conf->wav_path,strerror (errno));g_free (wav->pcm_buf); wav->pcm_buf =NULL ;return -1 ;
@@ -225,40 +221,49 @@ static int wav_ctl_out (HWVoiceOut *hw, int cmd, ...)return 0 ; } +static WAVConf glob_conf = { + .settings.freq =44100 , + .settings.nchannels =2 , + .settings.fmt =AUD_FMT_S16 , + .wav_path ="qemu.wav" +}; +static void *wav_audio_init (void ) { -return &conf; +WAVConf *conf =g_malloc (sizeof (WAVConf)); + *conf = glob_conf; +return conf; }static void wav_audio_fini (void *opaque) { - (void ) opaque;ldebug ("wav_fini" ); +g_free (opaque); }static struct audio_option wav_options[] = { { .name ="FREQUENCY" , .tag =AUD_OPT_INT , - .valp = &conf.settings.freq, + .valp = &glob_conf.settings.freq, .descr ="Frequency" }, { .name ="FORMAT" , .tag =AUD_OPT_FMT , - .valp = &conf.settings.fmt, + .valp = &glob_conf.settings.fmt, .descr ="Format" }, { .name ="DAC_FIXED_CHANNELS" , .tag =AUD_OPT_INT , - .valp = &conf.settings.nchannels, + .valp = &glob_conf.settings.nchannels, .descr ="Number of channels (1 - mono, 2 - stereo)" }, { .name ="PATH" , .tag =AUD_OPT_STR , - .valp = &conf.wav_path, + .valp = &glob_conf.wav_path, .descr ="Path to wave file" }, {/* End of list */ }
Signature · 1 line
2.4.2
PATCH v3 9/12 dsoundaudio: do not use global variables
In reply to Kővágó, Zoltán--- audio/dsound_template.h | 18 ++++---- audio/dsoundaudio.c | 106 ++++++++++++++++++++++++++++-------------------- 2 files changed, 74 insertions(+), 50 deletions(-)
audio/dsound_template.h +11 -7
@@ -67,7 +67,8 @@ static int glue (dsound_lock_, TYPE) ( LPVOID *p2p, DWORD *blen1p, DWORD *blen2p, - int entire + int entire, + dsound *s ) {HRESULT hr;
@@ -75,13 +76,14 @@ static int glue (dsound_lock_, TYPE) (LPVOID p1 =NULL , p2 =NULL ;DWORD blen1 =0 , blen2 =0 ;DWORD flag; +DSoundConf *conf = &s->conf;#ifdef DSBTYPE_IN flag = entire ?DSCBLOCK_ENTIREBUFFER :0 ;#else flag = entire ?DSBLOCK_ENTIREBUFFER :0 ;#endif -for (i =0 ; i < conf.lock_retries; ++i) { +for (i =0 ; i < conf->lock_retries; ++i) { hr = glue (IFACE, _Lock) ( buf, pos,
@@ -96,7 +98,7 @@ static int glue (dsound_lock_, TYPE) (if (FAILED (hr)) {#ifndef DSBTYPE_IN if (hr ==DSERR_BUFFERLOST ) { -if (glue (dsound_restore_,TYPE ) (buf)) { +if (glue (dsound_restore_,TYPE ) (buf, s)) {dsound_logerr (hr,"Could not lock " NAME "\n" ); goto fail; }
@@ -110,7 +112,7 @@ static int glue (dsound_lock_, TYPE) (break ; } -if (i == conf.lock_retries) { +if (i == conf->lock_retries) {dolog ("%d attempts to lock " NAME " failed\n" , i); goto fail; }
@@ -183,9 +185,10 @@ static int dsound_init_out(HWVoiceOut *hw, struct audsettings *as, {int err;HRESULT hr; -dsound *s = &glob_dsound; +dsound *s = drv_opaque;WAVEFORMATEX wfx;struct audsettings obt_as; +DSoundConf *conf = &s->conf;#ifdef DSBTYPE_IN const char *typ ="ADC" ;DSoundVoiceIn *ds = (DSoundVoiceIn *) hw;
@@ -212,7 +215,7 @@ static int dsound_init_out(HWVoiceOut *hw, struct audsettings *as, bd.dwSize =sizeof (bd); bd.lpwfxFormat = &wfx;#ifdef DSBTYPE_IN - bd.dwBufferBytes = conf.bufsize_in; + bd.dwBufferBytes = conf->bufsize_in; hr = IDirectSoundCapture_CreateCaptureBuffer ( s->dsound_capture, &bd,
@@ -221,7 +224,7 @@ static int dsound_init_out(HWVoiceOut *hw, struct audsettings *as, );#else bd.dwFlags =DSBCAPS_STICKYFOCUS |DSBCAPS_GETCURRENTPOSITION2 ; - bd.dwBufferBytes = conf.bufsize_out; + bd.dwBufferBytes = conf->bufsize_out; hr = IDirectSound_CreateSoundBuffer ( s->dsound, &bd,
@@ -271,6 +274,7 @@ static int dsound_init_out(HWVoiceOut *hw, struct audsettings *as, ); } hw->samples = bc.dwBufferBytes >> hw->info.shift; + ds->s = s;#ifdef DEBUG_DSOUND dolog ("caps %ld, desc %ld\n",
audio/dsoundaudio.c +63 -43
347 lines not on this page · raw message
Signature · 1 line
2.4.2
PATCH v3 10/12 paaudio: fix possible resource leak
In reply to Kővágó, Zoltánqpa_audio_init did not clean up resources properly if the initialization failed. This hopefully fixes it.
--- audio/paaudio.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
audio/paaudio.c +5 -1
@@ -47,6 +47,8 @@ typedef struct {paaudio *g; } PAVoiceIn; +static void qpa_audio_fini (void *opaque); + static void GCC_FMT_ATTR (2, 3) qpa_logerr (int err, const char *fmt, ...) { va_list ap;
@@ -814,6 +816,8 @@ static void *qpa_audio_init (void) {paaudio *g =g_malloc (sizeof (paaudio)); g->conf = glob_conf; + g->mainloop =NULL ; + g->context =NULL ; g->mainloop =pa_threaded_mainloop_new ();if (!g->mainloop) {
@@ -867,7 +871,7 @@ unlock_and_fail:pa_threaded_mainloop_unlock (g->mainloop); fail:AUD_log (AUDIO_CAP ,"Failed to initialize PA context" ); -g_free (g); +qpa_audio_fini (g);return NULL ; }
Signature · 1 line
2.4.2
PATCH v3 11/12 coreaudio: do not use global variables where possible
In reply to Kővágó, Zoltán--- audio/coreaudio.c | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-)
audio/coreaudio.c +24 -19
@@ -32,20 +32,16 @@#define AUDIO_CAP "coreaudio"#include "audio_int.h" -struct { +static int isAtexit; + +typedef struct {int buffer_frames;int nbuffers; -int isAtexit; -} conf = { - .buffer_frames =512 , - .nbuffers =4 , - .isAtexit =0 -}; +}CoreaudioConf ; typedef struct coreaudioVoiceOut { HWVoiceOut hw; pthread_mutex_t mutex; - int isAtexit; AudioDeviceID outputDeviceID; UInt32 audioDevicePropertyBufferFrameSize; AudioStreamBasicDescription outputStreamBasicDescription;
@@ -161,7 +157,7 @@ static inline UInt32 isPlaying (AudioDeviceID outputDeviceID)static void coreaudio_atexit (void ) { - conf.isAtexit =1 ; + isAtexit =1 ; }static int coreaudio_lock (coreaudioVoiceOut *core,const char *fn_name)
@@ -296,6 +292,7 @@ static int coreaudio_init_out(HWVoiceOut *hw, struct audsettings *as,int err;const char *typ ="playback" ;AudioValueRange frameRange; +CoreaudioConf *conf = drv_opaque;/* create mutex */ err =pthread_mutex_init (&core->mutex,NULL );
@@ -337,16 +334,16 @@ static int coreaudio_init_out(HWVoiceOut *hw, struct audsettings *as,return -1 ; } -if (frameRange.mMinimum > conf.buffer_frames) { +if (frameRange.mMinimum > conf->buffer_frames) { core->audioDevicePropertyBufferFrameSize = (UInt32 ) frameRange.mMinimum;dolog ("warning: Upsizing Buffer Frames to %f\n" , frameRange.mMinimum); } -else if (frameRange.mMaximum < conf.buffer_frames) { +else if (frameRange.mMaximum < conf->buffer_frames) { core->audioDevicePropertyBufferFrameSize = (UInt32 ) frameRange.mMaximum;dolog ("warning: Downsizing Buffer Frames to %f\n" , frameRange.mMaximum); }else { - core->audioDevicePropertyBufferFrameSize = conf.buffer_frames; + core->audioDevicePropertyBufferFrameSize = conf->buffer_frames; }/* set Buffer Frame Size */
@@ -380,7 +377,7 @@ static int coreaudio_init_out(HWVoiceOut *hw, struct audsettings *as, "Could not get device buffer frame size\n");return -1 ; } - hw->samples = conf.nbuffers * core->audioDevicePropertyBufferFrameSize; + hw->samples = conf->nbuffers * core->audioDevicePropertyBufferFrameSize;/* get StreamFormat */ propertySize =sizeof (core->outputStreamBasicDescription);
@@ -444,7 +441,7 @@ static void coreaudio_fini_out (HWVoiceOut *hw)int err;coreaudioVoiceOut *core = (coreaudioVoiceOut *) hw; -if (!conf.isAtexit) { +if (!isAtexit) {/* stop playback */ if (isPlaying (core->outputDeviceID)) { status =AudioDeviceStop (core->outputDeviceID, audioDeviceIOProc);
@@ -487,7 +484,7 @@ static int coreaudio_ctl_out (HWVoiceOut *hw, int cmd, ...)case VOICE_DISABLE :/* stop playback */ -if (!conf.isAtexit) { +if (!isAtexit) {if (isPlaying (core->outputDeviceID)) { status =AudioDeviceStop (core->outputDeviceID, audioDeviceIOProc);if (status != kAudioHardwareNoError) {
@@ -500,28 +497,36 @@ static int coreaudio_ctl_out (HWVoiceOut *hw, int cmd, ...)return 0 ; } +static CoreaudioConf glob_conf = { + .buffer_frames =512 , + .nbuffers =4 , +}; +static void *coreaudio_audio_init (void ) { +CoreaudioConf *conf =g_malloc (sizeof (CoreaudioConf)); + *conf = glob_conf; +atexit (coreaudio_atexit); -return &coreaudio_audio_init; +return conf; }static void coreaudio_audio_fini (void *opaque) { - (void ) opaque; +g_free (opaque); }static struct audio_option coreaudio_options[] = { { .name ="BUFFER_SIZE" , .tag =AUD_OPT_INT , - .valp = &conf.buffer_frames, + .valp = &glob_conf.buffer_frames, .descr ="Size of the buffer in frames" }, { .name ="BUFFER_COUNT" , .tag =AUD_OPT_INT , - .valp = &conf.nbuffers, + .valp = &glob_conf.nbuffers, .descr ="Number of buffers" }, {/* End of list */ }
Signature · 1 line
2.4.2
PATCH v3 12/12 sdlaudio: do not allow multiple instances
In reply to Kővágó, ZoltánSince SDL uses a lot of global data, we can't create independent instances of sdl audio backend.
--- audio/sdlaudio.c | 7 +++++++ 1 file changed, 7 insertions(+)
audio/sdlaudio.c +7 -0
@@ -55,6 +55,7 @@ static struct SDLAudioState {SDL_mutex *mutex;SDL_sem *sem;int initialized; +bool driver_created; } glob_sdl;typedef struct SDLAudioState SDLAudioState ;
@@ -393,6 +394,10 @@ static int sdl_ctl_out (HWVoiceOut *hw, int cmd, ...)static void *sdl_audio_init (void ) {SDLAudioState *s = &glob_sdl; +if (s->driver_created) { +sdl_logerr ("Can't create multiple sdl backends\n" ); +return NULL ; + }if (SDL_InitSubSystem (SDL_INIT_AUDIO )) {sdl_logerr ("SDL failed to initialize audio subsystem\n" );
@@ -414,6 +419,7 @@ static void *sdl_audio_init (void)return NULL ; } + s->driver_created = true;return s; }
@@ -424,6 +430,7 @@ static void sdl_audio_fini (void *opaque)SDL_DestroySemaphore (s->sem);SDL_DestroyMutex (s->mutex);SDL_QuitSubSystem (SDL_INIT_AUDIO ); + s->driver_created = false; }static struct audio_option sdl_options[] = {
Signature · 1 line
2.4.2