[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 10/11] RFC: allow controlling volume with PulseAudio
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH 10/11] RFC: allow controlling volume with PulseAudio backend |
Date: |
Wed, 21 Sep 2011 18:11:07 +0200 |
---
audio/paaudio.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 91 insertions(+), 5 deletions(-)
diff --git a/audio/paaudio.c b/audio/paaudio.c
index beed434..7ddc16d 100644
--- a/audio/paaudio.c
+++ b/audio/paaudio.c
@@ -664,15 +664,100 @@ static void qpa_fini_in (HWVoiceIn *hw)
static int qpa_ctl_out (HWVoiceOut *hw, int cmd, ...)
{
- (void) hw;
- (void) cmd;
+ PAVoiceOut *pa = (PAVoiceOut *) hw;
+ pa_operation *op;
+ pa_cvolume v;
+ paaudio *g = &glob_paaudio;
+
+ pa_cvolume_init (&v);
+
+ switch (cmd) {
+ case VOICE_VOLUME:
+ {
+ SWVoiceOut *sw;
+ va_list ap;
+
+ va_start (ap, cmd);
+ sw = va_arg (ap, SWVoiceOut *);
+ va_end (ap);
+
+ v.channels = 2;
+ v.values[0] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * sw->vol.l) /
UINT32_MAX;
+ v.values[1] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * sw->vol.r) /
UINT32_MAX;
+
+ pa_threaded_mainloop_lock (g->mainloop);
+
+ op = pa_context_set_sink_input_volume (g->context,
+ pa_stream_get_index (pa->stream),
+ &v, NULL, NULL);
+ if (!op)
+ qpa_logerr (pa_context_errno (g->context),
+ "set_sink_input_volume() failed\n");
+ else
+ pa_operation_unref (op);
+
+ op = pa_context_set_sink_input_mute (g->context,
+ pa_stream_get_index (pa->stream),
+ sw->vol.mute, NULL, NULL);
+ if (!op)
+ qpa_logerr (pa_context_errno (g->context),
+ "set_sink_input_mute() failed\n");
+ else
+ pa_operation_unref (op);
+
+ pa_threaded_mainloop_unlock (g->mainloop);
+ }
+ }
return 0;
}
static int qpa_ctl_in (HWVoiceIn *hw, int cmd, ...)
{
- (void) hw;
- (void) cmd;
+ PAVoiceIn *pa = (PAVoiceIn *) hw;
+ pa_operation *op;
+ pa_cvolume v;
+ paaudio *g = &glob_paaudio;
+
+ pa_cvolume_init (&v);
+
+ switch (cmd) {
+ case VOICE_VOLUME:
+ {
+ SWVoiceIn *sw;
+ va_list ap;
+
+ va_start (ap, cmd);
+ sw = va_arg (ap, SWVoiceIn *);
+ va_end (ap);
+
+ v.channels = 2;
+ v.values[0] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * sw->vol.l) /
UINT32_MAX;
+ v.values[1] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * sw->vol.r) /
UINT32_MAX;
+
+ pa_threaded_mainloop_lock (g->mainloop);
+
+ /* FIXME: use the upcoming "set_source_output_{volume,mute}" */
+ op = pa_context_set_source_volume_by_index (g->context,
+ pa_stream_get_device_index (pa->stream),
+ &v, NULL, NULL);
+ if (!op)
+ qpa_logerr (pa_context_errno (g->context),
+ "set_source_volume() failed\n");
+ else
+ pa_operation_unref(op);
+
+ op = pa_context_set_source_mute_by_index (g->context,
+ pa_stream_get_index (pa->stream),
+ sw->vol.mute, NULL, NULL);
+ if (!op)
+ qpa_logerr (pa_context_errno (g->context),
+ "set_source_mute() failed\n");
+ else
+ pa_operation_unref (op);
+
+ pa_threaded_mainloop_unlock (g->mainloop);
+ }
+ }
return 0;
}
@@ -801,5 +886,6 @@ struct audio_driver pa_audio_driver = {
.max_voices_out = INT_MAX,
.max_voices_in = INT_MAX,
.voice_size_out = sizeof (PAVoiceOut),
- .voice_size_in = sizeof (PAVoiceIn)
+ .voice_size_in = sizeof (PAVoiceIn),
+ .ctl_caps = VOICE_VOLUME_CAP
};
--
1.7.6.2
- [Qemu-devel] [PATCH 00/11] RFC: apply volume on client stream, Marc-André Lureau, 2011/09/21
- [Qemu-devel] [PATCH 01/11] audio: add VOICE_VOLUME ctl, Marc-André Lureau, 2011/09/21
- [Qemu-devel] [PATCH 03/11] audio: use a nominal volume of 1^32-1, Marc-André Lureau, 2011/09/21
- [Qemu-devel] [PATCH 05/11] hw/ac97: the volume mask was not always 0x1f, Marc-André Lureau, 2011/09/21
- [Qemu-devel] [PATCH 04/11] hw/ac97: remove USE_MIXER code, Marc-André Lureau, 2011/09/21
- [Qemu-devel] [PATCH 08/11] RFC: use full PulseAudio API, largely adapted from pa_simple*, Marc-André Lureau, 2011/09/21
- [Qemu-devel] [PATCH 07/11] audio/spice: add support for volume control, Marc-André Lureau, 2011/09/21
- [Qemu-devel] [PATCH 09/11] RFC: configure: pa_simple is not needed anymore, Marc-André Lureau, 2011/09/21
- [Qemu-devel] [PATCH 06/11] hw/ac97: new support for volume control, Marc-André Lureau, 2011/09/21
- [Qemu-devel] [PATCH 10/11] RFC: allow controlling volume with PulseAudio backend,
Marc-André Lureau <=
- [Qemu-devel] [PATCH 11/11] RFC: make mixemu mandatory, Marc-André Lureau, 2011/09/21
- [Qemu-devel] [PATCH 02/11] audio: don't apply volume effect if backend has VOICE_VOLUME_CAP, Marc-André Lureau, 2011/09/21