In order to allow backend audio to update channel's volume/mute values when necessary. --- gtk/channel-playback.c | 30 ++++++++++++++++++++++++------ gtk/channel-record.c | 30 ++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/gtk/channel-playback.c b/gtk/channel-playback.c index ae8a75d..7fa4386 100644 --- a/gtk/channel-playback.c +++ b/gtk/channel-playback.c @@ -84,6 +84,8 @@ enum { static guint signals[SPICE_PLAYBACK_LAST_SIGNAL]; static void channel_set_handlers(SpiceChannelClass *klass); +static void playback_set_prop_volume(SpicePlaybackChannel *channel, + guint8 nchannels, const guint16 *volume); /* ------------------------------------------------------------------ */ @@ -153,11 +155,18 @@ static void spice_playback_channel_set_property(GObject *gobject, const GValue *value, GParamSpec *pspec) { + SpicePlaybackChannel *channel = SPICE_PLAYBACK_CHANNEL(gobject); + SpicePlaybackChannelPrivate *c = channel->priv; + switch (prop_id) { - case PROP_VOLUME: + case PROP_VOLUME: { + const guint16 *volume = g_value_get_pointer(value); + playback_set_prop_volume (channel, c->nchannels, volume); /* TODO: request guest volume change */ break; + } case PROP_MUTE: + c->mute = g_value_get_boolean(value); /* TODO: request guest mute change */ break; default: @@ -396,7 +405,6 @@ static void playback_handle_stop(SpiceChannel *channel, SpiceMsgIn *in) /* coroutine context */ static void playback_handle_set_volume(SpiceChannel *channel, SpiceMsgIn *in) { - SpicePlaybackChannelPrivate *c = SPICE_PLAYBACK_CHANNEL(channel)->priv; SpiceMsgAudioVolume *vol = spice_msg_in_parsed(in); if (vol->nchannels == 0) { @@ -404,10 +412,8 @@ static void playback_handle_set_volume(SpiceChannel *channel, SpiceMsgIn *in) return; } - g_free(c->volume); - c->nchannels = vol->nchannels; - c->volume = g_new(guint16, c->nchannels); - memcpy(c->volume, vol->volume, sizeof(guint16) * c->nchannels); + playback_set_prop_volume (SPICE_PLAYBACK_CHANNEL(channel), + vol->nchannels, vol->volume); g_coroutine_object_notify(G_OBJECT(channel), "volume"); } @@ -486,3 +492,15 @@ void spice_playback_channel_sync_latency(SpicePlaybackChannel *channel) SPICE_DEBUG("%s: notify latency update %u", __FUNCTION__, channel->priv->min_latency); g_coroutine_object_notify(G_OBJECT(SPICE_CHANNEL(channel)), "min-latency"); } + +static void +playback_set_prop_volume(SpicePlaybackChannel *channel, guint8 nchannels, const guint16 *volume) +{ + SpicePlaybackChannelPrivate *c = channel->priv; + if (c->nchannels != nchannels) { + g_free(c->volume); + c->nchannels = nchannels; + c->volume = g_new(guint16, nchannels); + } + memcpy(c->volume, volume, sizeof(guint16) * nchannels); +} diff --git a/gtk/channel-record.c b/gtk/channel-record.c index ac71999..99d9946 100644 --- a/gtk/channel-record.c +++ b/gtk/channel-record.c @@ -84,6 +84,8 @@ static guint signals[SPICE_RECORD_LAST_SIGNAL]; static void channel_set_handlers(SpiceChannelClass *klass); +static void record_set_prop_volume(SpiceRecordChannel *channel, guint8 nchannels, const guint16 *volume); + /* ------------------------------------------------------------------ */ static void spice_record_channel_reset_capabilities(SpiceChannel *channel) @@ -149,11 +151,18 @@ static void spice_record_channel_set_property(GObject *gobject, const GValue *value, GParamSpec *pspec) { + SpiceRecordChannel *channel = SPICE_RECORD_CHANNEL(gobject); + SpiceRecordChannelPrivate *c = channel->priv; + switch (prop_id) { - case PROP_VOLUME: + case PROP_VOLUME: { + const guint16 *volume = g_value_get_pointer(value); + record_set_prop_volume(channel, c->nchannels, volume); /* TODO: request guest volume change */ break; + } case PROP_MUTE: + c->mute = g_value_get_boolean(value); /* TODO: request guest mute change */ break; default: @@ -437,7 +446,6 @@ static void record_handle_stop(SpiceChannel *channel, SpiceMsgIn *in) /* coroutine context */ static void record_handle_set_volume(SpiceChannel *channel, SpiceMsgIn *in) { - SpiceRecordChannelPrivate *c = SPICE_RECORD_CHANNEL(channel)->priv; SpiceMsgAudioVolume *vol = spice_msg_in_parsed(in); if (vol->nchannels == 0) { @@ -445,10 +453,8 @@ static void record_handle_set_volume(SpiceChannel *channel, SpiceMsgIn *in) return; } - g_free(c->volume); - c->nchannels = vol->nchannels; - c->volume = g_new(guint16, c->nchannels); - memcpy(c->volume, vol->volume, sizeof(guint16) * c->nchannels); + record_set_prop_volume(SPICE_RECORD_CHANNEL(channel), + vol->nchannels, vol->volume); g_coroutine_object_notify(G_OBJECT(channel), "volume"); } @@ -473,3 +479,15 @@ static void channel_set_handlers(SpiceChannelClass *klass) spice_channel_set_handlers(klass, handlers, G_N_ELEMENTS(handlers)); } + +static void +record_set_prop_volume(SpiceRecordChannel *channel, guint8 nchannels, const guint16 *volume) +{ + SpiceRecordChannelPrivate *c = channel->priv; + if (c->nchannels != nchannels) { + g_free(c->volume); + c->nchannels = nchannels; + c->volume = g_new(guint16, nchannels); + } + memcpy(c->volume, volume, sizeof(guint16) * nchannels); +} -- 2.1.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel