pulse: returns the value stored in playback and record channels as they are updated by pulse itself. gstreamer: pulsesink and pulsesrc returns the current volume/mute of the stream but it can vary if other elements are used. --- gtk/spice-audio-priv.h | 9 ++++++ gtk/spice-audio.c | 23 +++++++++++++++ gtk/spice-gstaudio.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ gtk/spice-pulse.c | 41 ++++++++++++++++++++++++++ 4 files changed, 152 insertions(+) diff --git a/gtk/spice-audio-priv.h b/gtk/spice-audio-priv.h index 898c5a7..c27831e 100644 --- a/gtk/spice-audio-priv.h +++ b/gtk/spice-audio-priv.h @@ -31,4 +31,13 @@ struct _SpiceAudioPrivate { G_END_DECLS +gboolean spice_audio_get_playback_sync_data (SpiceAudio *self, guint8 *nchannels, guint16 **volume, gboolean *mute); +gboolean spice_audio_get_record_sync_data (SpiceAudio *self, guint8 *nchannels, guint16 **volume, gboolean *mute); + +gboolean spice_pulse_get_playback_sync_data (SpiceAudio *audio, guint8 *nchannels, guint16 **volume, gboolean *mute); +gboolean spice_pulse_get_record_sync_data (SpiceAudio *audio, guint8 *nchannels, guint16 **volume, gboolean *mute); + +gboolean spice_gstaudio_get_playback_sync_data (SpiceAudio *audio, guint8 *nchannels, guint16 **volume, gboolean *mute); +gboolean spice_gstaudio_get_record_sync_data (SpiceAudio *audio, guint8 *nchannels, guint16 **volume, gboolean *mute); + #endif /* __SPICE_AUDIO_PRIVATE_H__ */ diff --git a/gtk/spice-audio.c b/gtk/spice-audio.c index 329ab6a..fddf963 100644 --- a/gtk/spice-audio.c +++ b/gtk/spice-audio.c @@ -191,6 +191,29 @@ static void session_enable_audio(GObject *gobject, GParamSpec *pspec, update_audio_channels(SPICE_AUDIO(user_data), SPICE_SESSION(gobject)); } +G_GNUC_INTERNAL +gboolean spice_audio_get_playback_sync_data (SpiceAudio *self, guint8 *nchannels, + guint16 **volume, gboolean *mute) +{ +#ifdef WITH_PULSE + return spice_pulse_get_playback_sync_data (self, nchannels, volume, mute); +#elif defined(WITH_GSTAUDIO) + return spice_gstaudio_get_playback_sync_data (self, nchannels, volume, mute); +#endif +} + +G_GNUC_INTERNAL +gboolean spice_audio_get_record_sync_data (SpiceAudio *self, guint8 *nchannels, + guint16 **volume, gboolean *mute) +{ +#ifdef WITH_PULSE + return spice_pulse_get_record_sync_data (self, nchannels, volume, mute); +#elif defined(WITH_GSTAUDIO) + return spice_gstaudio_get_record_sync_data (self, nchannels, volume, mute); +#endif +} + + /** * spice_audio_new: * @session: the #SpiceSession to connect to diff --git a/gtk/spice-gstaudio.c b/gtk/spice-gstaudio.c index 892028c..48f8f8c 100644 --- a/gtk/spice-gstaudio.c +++ b/gtk/spice-gstaudio.c @@ -26,6 +26,7 @@ #include "spice-common.h" #include "spice-session.h" #include "spice-util.h" +#include "spice-audio-priv.h" #define SPICE_GSTAUDIO_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), SPICE_TYPE_GSTAUDIO, SpiceGstaudioPrivate)) @@ -543,3 +544,81 @@ SpiceGstaudio *spice_gstaudio_new(SpiceSession *session, GMainContext *context, return gstaudio; } + +G_GNUC_INTERNAL +gboolean spice_gstaudio_get_playback_sync_data(SpiceAudio *audio, + guint8 *nchannels, + guint16 **volume, + gboolean *mute) +{ + SpiceGstaudioPrivate *p = SPICE_GSTAUDIO(audio)->priv; + gint i; + gdouble vol; + GstElement *e; + + if (p->playback.sink == NULL) { + SPICE_DEBUG("calling '%s' before start", __func__); + return FALSE; + } + + if (GST_IS_BIN(p->playback.sink)) + e = gst_bin_get_by_interface(GST_BIN(p->playback.sink), GST_TYPE_STREAM_VOLUME); + else + e = g_object_ref(p->playback.sink); + + if (GST_IS_STREAM_VOLUME(e)) { + vol = gst_stream_volume_get_volume(GST_STREAM_VOLUME(e), GST_STREAM_VOLUME_FORMAT_LINEAR); + *mute = gst_stream_volume_get_mute(GST_STREAM_VOLUME(e)); + } else { + g_object_get(e, + "volume", &vol, + "mute", mute, + NULL); + } + + *nchannels = p->playback.channels; + *volume = g_new(guint16, p->playback.channels); + for (i = 0; i < p->playback.channels; i++) { + *volume[i] = (guint16) (vol * VOLUME_NORMAL); + } + return TRUE; +} + +G_GNUC_INTERNAL +gboolean spice_gstaudio_get_record_sync_data(SpiceAudio *audio, + guint8 *nchannels, + guint16 **volume, + gboolean *mute) +{ + SpiceGstaudioPrivate *p = SPICE_GSTAUDIO(audio)->priv; + gint i; + gdouble vol; + GstElement *e; + + if (p->record.src != NULL) { + SPICE_DEBUG("calling '%s' before start", __func__); + return FALSE; + } + + if (GST_IS_BIN(p->record.src)) + e = gst_bin_get_by_interface(GST_BIN(p->record.src), GST_TYPE_STREAM_VOLUME); + else + e = g_object_ref(p->record.src); + + if (GST_IS_STREAM_VOLUME(e)) { + vol = gst_stream_volume_get_volume(GST_STREAM_VOLUME(e), GST_STREAM_VOLUME_FORMAT_LINEAR); + *mute = gst_stream_volume_get_mute(GST_STREAM_VOLUME(e)); + } else { + g_object_get(e, + "volume", &vol, + "mute", mute, + NULL); + } + + *nchannels = p->record.channels; + *volume = g_new(guint16, p->record.channels); + for (i = 0; i < p->record.channels; i++) { + *volume[i] = (guint16) (vol * VOLUME_NORMAL); + } + return TRUE; +} diff --git a/gtk/spice-pulse.c b/gtk/spice-pulse.c index b9ced66..7ac26b2 100644 --- a/gtk/spice-pulse.c +++ b/gtk/spice-pulse.c @@ -22,6 +22,7 @@ #include "spice-session-priv.h" #include "spice-channel-priv.h" #include "spice-util-priv.h" +#include "spice-audio-priv.h" #include <pulse/glib-mainloop.h> #include <pulse/pulseaudio.h> @@ -1001,3 +1002,43 @@ error: g_object_unref(pulse); return NULL; } + +G_GNUC_INTERNAL +gboolean spice_pulse_get_playback_sync_data(SpiceAudio *audio, + guint8 *nchannels, + guint16 **volume, + gboolean *mute) +{ + SpicePulsePrivate *p = SPICE_PULSE(audio)->priv; + guint16 *pvol; + + g_object_get(p->pchannel, + "nchannels", nchannels, + "volume", &pvol, + "mute", mute, + NULL); + *volume = g_new(guint16, *nchannels); + memcpy (*volume, pvol, sizeof(guint16) * (*nchannels)); + /* Always return TRUE as we get the value stored in the channel */ + return TRUE; +} + +G_GNUC_INTERNAL +gboolean spice_pulse_get_record_sync_data (SpiceAudio *audio, + guint8 *nchannels, + guint16 **volume, + gboolean *mute) +{ + SpicePulsePrivate *p = SPICE_PULSE(audio)->priv; + guint16 *rvol; + + g_object_get(p->rchannel, + "nchannels", nchannels, + "volume", &rvol, + "mute", mute, + NULL); + *volume = g_new(guint16, *nchannels); + memcpy (*volume, rvol, sizeof(guint16) * (*nchannels)); + /* Always return TRUE as we get the value stored in the channel */ + return TRUE; +} -- 2.1.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel