diff options
Diffstat (limited to 'audio/pwaudio.c')
-rw-r--r-- | audio/pwaudio.c | 85 |
1 files changed, 34 insertions, 51 deletions
diff --git a/audio/pwaudio.c b/audio/pwaudio.c index d0bc4680a6..70f0c46240 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,40 +633,34 @@ 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); @@ -671,21 +668,20 @@ qpw_enable_out(HWVoiceOut *hw, bool enable) } 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) |