----- Original Message ----- > Hi > > ----- Original Message ----- > > pulse: returns the value stored in playback and record channels as they > > are updated by pulse itself. > > Are they? Ah, with your patches. Hmm, that sounds wrong. let me comment on the patch. > > > > gstreamer: pulsesink and pulsesrc returns the current volume/mute of the > > stream but it can vary if other elements are used. > > Instead of adding "sync_data" function (the name is confusing btw), it would > be cleaner to have overridable getter get_volume() & get_mute() on > SpiceAudio. > > > --- > > 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 > > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel > _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel