Message ID | 20230506163735.3481387-9-marcandre.lureau@redhat.com |
---|---|
State | New |
Headers | show |
Series | audio: pipewire backend improvements | expand |
> From: Marc-André Lureau <marcandre.lureau@redhat.com> > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > audio/pwaudio.c | 85 ++++++++++++++++++++----------------------------- > 1 file changed, 34 insertions(+), 51 deletions(-) Reviewed-by: Volker Rümelin <vr_qemu@t-online.de> > diff --git a/audio/pwaudio.c b/audio/pwaudio.c > index d0bc4680a6..67df53948c 100644 > --- a/audio/pwaudio.c > +++ b/audio/pwaudio.c > @@ -66,6 +66,9 @@ typedef struct PWVoiceIn { > PWVoice v; > } PWVoiceIn; > > +#define PW_VOICE_IN(v) ((PWVoiceIn*)v) > +#define PW_VOICE_OUT(v) ((PWVoiceOut*)v) > + > static void > stream_destroy(void *data) > { > @@ -630,62 +633,55 @@ qpw_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque) > } > > static void > -qpw_fini_out(HWVoiceOut *hw) > +qpw_voice_fini(PWVoice *v) > { > - PWVoiceOut *pw = (PWVoiceOut *) hw; > - PWVoice *v = &pw->v; > + pwaudio *c = v->g; > > - if (v->stream) { > - pwaudio *c = v->g; > - pw_thread_loop_lock(c->thread_loop); > - pw_stream_destroy(v->stream); > - v->stream = NULL; > - pw_thread_loop_unlock(c->thread_loop); > + if (!v->stream) { > + return; > } > + pw_thread_loop_lock(c->thread_loop); > + pw_stream_destroy(v->stream); > + v->stream = NULL; > + pw_thread_loop_unlock(c->thread_loop); > } > > static void > -qpw_fini_in(HWVoiceIn *hw) > +qpw_fini_out(HWVoiceOut *hw) > { > - PWVoiceIn *pw = (PWVoiceIn *) hw; > - PWVoice *v = &pw->v; > + qpw_voice_fini(&PW_VOICE_OUT(hw)->v); > +} > > - if (v->stream) { > - pwaudio *c = v->g; > - pw_thread_loop_lock(c->thread_loop); > - pw_stream_destroy(v->stream); > - v->stream = NULL; > - pw_thread_loop_unlock(c->thread_loop); > - } > +static void > +qpw_fini_in(HWVoiceIn *hw) > +{ > + qpw_voice_fini(&PW_VOICE_IN(hw)->v); > } > > static void > -qpw_enable_out(HWVoiceOut *hw, bool enable) > +qpw_voice_set_enabled(PWVoice *v, bool enable) > { > - PWVoiceOut *po = (PWVoiceOut *) hw; > - PWVoice *v = &po->v; > pwaudio *c = v->g; > pw_thread_loop_lock(c->thread_loop); > pw_stream_set_active(v->stream, enable); > pw_thread_loop_unlock(c->thread_loop); > } > > +static void > +qpw_enable_out(HWVoiceOut *hw, bool enable) > +{ > + qpw_voice_set_enabled(&PW_VOICE_OUT(hw)->v, enable); > +} > + > static void > qpw_enable_in(HWVoiceIn *hw, bool enable) > { > - PWVoiceIn *pi = (PWVoiceIn *) hw; > - PWVoice *v = &pi->v; > - pwaudio *c = v->g; > - pw_thread_loop_lock(c->thread_loop); > - pw_stream_set_active(v->stream, enable); > - pw_thread_loop_unlock(c->thread_loop); > + qpw_voice_set_enabled(&PW_VOICE_IN(hw)->v, enable); > } > > static void > -qpw_volume_out(HWVoiceOut *hw, Volume *vol) > +qpw_voice_set_volume(PWVoice *v, Volume *vol) > { > - PWVoiceOut *pw = (PWVoiceOut *) hw; > - PWVoice *v = &pw->v; > pwaudio *c = v->g; > int i, ret; > > @@ -707,28 +703,15 @@ qpw_volume_out(HWVoiceOut *hw, Volume *vol) > } > > static void > -qpw_volume_in(HWVoiceIn *hw, Volume *vol) > +qpw_volume_out(HWVoiceOut *hw, Volume *vol) > { > - PWVoiceIn *pw = (PWVoiceIn *) hw; > - PWVoice *v = &pw->v; > - pwaudio *c = v->g; > - int i, ret; > - > - pw_thread_loop_lock(c->thread_loop); > - v->volume.channels = vol->channels; > - > - for (i = 0; i < vol->channels; ++i) { > - v->volume.values[i] = (float)vol->vol[i] / 255; > - } > - > - ret = pw_stream_set_control(v->stream, > - SPA_PROP_channelVolumes, v->volume.channels, v->volume.values, 0); > - trace_pw_vol(ret == 0 ? "success" : "failed"); > + qpw_voice_set_volume(&PW_VOICE_OUT(hw)->v, vol); > +} > > - v->muted = vol->mute; > - float val = v->muted ? 1.f : 0.f; > - ret = pw_stream_set_control(v->stream, SPA_PROP_mute, 1, &val, 0); > - pw_thread_loop_unlock(c->thread_loop); > +static void > +qpw_volume_in(HWVoiceIn *hw, Volume *vol) > +{ > + qpw_voice_set_volume(&PW_VOICE_IN(hw)->v, vol); > } > > static int wait_resync(pwaudio *pw)
diff --git a/audio/pwaudio.c b/audio/pwaudio.c index d0bc4680a6..67df53948c 100644 --- a/audio/pwaudio.c +++ b/audio/pwaudio.c @@ -66,6 +66,9 @@ typedef struct PWVoiceIn { PWVoice v; } PWVoiceIn; +#define PW_VOICE_IN(v) ((PWVoiceIn*)v) +#define PW_VOICE_OUT(v) ((PWVoiceOut*)v) + static void stream_destroy(void *data) { @@ -630,62 +633,55 @@ qpw_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque) } static void -qpw_fini_out(HWVoiceOut *hw) +qpw_voice_fini(PWVoice *v) { - PWVoiceOut *pw = (PWVoiceOut *) hw; - PWVoice *v = &pw->v; + pwaudio *c = v->g; - if (v->stream) { - pwaudio *c = v->g; - pw_thread_loop_lock(c->thread_loop); - pw_stream_destroy(v->stream); - v->stream = NULL; - pw_thread_loop_unlock(c->thread_loop); + if (!v->stream) { + return; } + pw_thread_loop_lock(c->thread_loop); + pw_stream_destroy(v->stream); + v->stream = NULL; + pw_thread_loop_unlock(c->thread_loop); } static void -qpw_fini_in(HWVoiceIn *hw) +qpw_fini_out(HWVoiceOut *hw) { - PWVoiceIn *pw = (PWVoiceIn *) hw; - PWVoice *v = &pw->v; + qpw_voice_fini(&PW_VOICE_OUT(hw)->v); +} - if (v->stream) { - pwaudio *c = v->g; - pw_thread_loop_lock(c->thread_loop); - pw_stream_destroy(v->stream); - v->stream = NULL; - pw_thread_loop_unlock(c->thread_loop); - } +static void +qpw_fini_in(HWVoiceIn *hw) +{ + qpw_voice_fini(&PW_VOICE_IN(hw)->v); } static void -qpw_enable_out(HWVoiceOut *hw, bool enable) +qpw_voice_set_enabled(PWVoice *v, bool enable) { - PWVoiceOut *po = (PWVoiceOut *) hw; - PWVoice *v = &po->v; pwaudio *c = v->g; pw_thread_loop_lock(c->thread_loop); pw_stream_set_active(v->stream, enable); pw_thread_loop_unlock(c->thread_loop); } +static void +qpw_enable_out(HWVoiceOut *hw, bool enable) +{ + qpw_voice_set_enabled(&PW_VOICE_OUT(hw)->v, enable); +} + static void qpw_enable_in(HWVoiceIn *hw, bool enable) { - PWVoiceIn *pi = (PWVoiceIn *) hw; - PWVoice *v = &pi->v; - pwaudio *c = v->g; - pw_thread_loop_lock(c->thread_loop); - pw_stream_set_active(v->stream, enable); - pw_thread_loop_unlock(c->thread_loop); + qpw_voice_set_enabled(&PW_VOICE_IN(hw)->v, enable); } static void -qpw_volume_out(HWVoiceOut *hw, Volume *vol) +qpw_voice_set_volume(PWVoice *v, Volume *vol) { - PWVoiceOut *pw = (PWVoiceOut *) hw; - PWVoice *v = &pw->v; pwaudio *c = v->g; int i, ret; @@ -707,28 +703,15 @@ qpw_volume_out(HWVoiceOut *hw, Volume *vol) } static void -qpw_volume_in(HWVoiceIn *hw, Volume *vol) +qpw_volume_out(HWVoiceOut *hw, Volume *vol) { - PWVoiceIn *pw = (PWVoiceIn *) hw; - PWVoice *v = &pw->v; - pwaudio *c = v->g; - int i, ret; - - pw_thread_loop_lock(c->thread_loop); - v->volume.channels = vol->channels; - - for (i = 0; i < vol->channels; ++i) { - v->volume.values[i] = (float)vol->vol[i] / 255; - } - - ret = pw_stream_set_control(v->stream, - SPA_PROP_channelVolumes, v->volume.channels, v->volume.values, 0); - trace_pw_vol(ret == 0 ? "success" : "failed"); + qpw_voice_set_volume(&PW_VOICE_OUT(hw)->v, vol); +} - v->muted = vol->mute; - float val = v->muted ? 1.f : 0.f; - ret = pw_stream_set_control(v->stream, SPA_PROP_mute, 1, &val, 0); - pw_thread_loop_unlock(c->thread_loop); +static void +qpw_volume_in(HWVoiceIn *hw, Volume *vol) +{ + qpw_voice_set_volume(&PW_VOICE_IN(hw)->v, vol); } static int wait_resync(pwaudio *pw)