[Spice-devel] [PATCH spice-gtk 3/8] channel-playback: provide access to playback properties via the session
Alon Levy
alevy at redhat.com
Wed Apr 17 08:23:00 PDT 2013
> Support checking whether an audio playback is active and what its latency
> is.
ACK, one comment.
> ---
> gtk/Makefile.am | 1 +
> gtk/channel-playback-priv.h | 23 +++++++++++++++++++++++
> gtk/channel-playback.c | 24 ++++++++++++++++++++++++
> gtk/spice-session-priv.h | 3 +++
> gtk/spice-session.c | 30 ++++++++++++++++++++++++++++++
> 5 files changed, 81 insertions(+)
> create mode 100644 gtk/channel-playback-priv.h
>
> diff --git a/gtk/Makefile.am b/gtk/Makefile.am
> index eb64b13..6b4219f 100644
> --- a/gtk/Makefile.am
> +++ b/gtk/Makefile.am
> @@ -235,6 +235,7 @@ libspice_client_glib_2_0_la_SOURCES = \
> channel-inputs.c \
> channel-main.c \
> channel-playback.c \
> + channel-playback-priv.h \
> channel-port.c \
> channel-record.c \
> channel-smartcard.c \
> diff --git a/gtk/channel-playback-priv.h b/gtk/channel-playback-priv.h
> new file mode 100644
> index 0000000..dc89e2d
> --- /dev/null
> +++ b/gtk/channel-playback-priv.h
> @@ -0,0 +1,23 @@
> +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> +/*
> + Copyright (C) 2013 Red Hat, Inc.
> +
> + This library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + This library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with this library; if not, see
> <http://www.gnu.org/licenses/>.
> +*/
> +#ifndef __SPICE_CLIENT_PLAYBACK_CHANNEL_PRIV_H__
> +#define __SPICE_CLIENT_PLAYBACK_CHANNEL_PRIV_H__
> +
> +gboolean spice_playback_channel_is_active(SpicePlaybackChannel *channel);
> +guint32 spice_playback_channel_get_latency(SpicePlaybackChannel *channel);
> +#endif
> diff --git a/gtk/channel-playback.c b/gtk/channel-playback.c
> index 2d542a7..7cbfa36 100644
> --- a/gtk/channel-playback.c
> +++ b/gtk/channel-playback.c
> @@ -55,6 +55,8 @@ struct _SpicePlaybackChannelPrivate {
> guint8 nchannels;
> guint16 *volume;
> guint8 mute;
> + gboolean is_active;
> + guint32 latency;
> };
>
> G_DEFINE_TYPE(SpicePlaybackChannel, spice_playback_channel,
> SPICE_TYPE_CHANNEL)
> @@ -416,6 +418,7 @@ static void playback_handle_start(SpiceChannel *channel,
> SpiceMsgIn *in)
>
> c->frame_count = 0;
> c->last_time = start->time;
> + c->is_active = TRUE;
>
> switch (c->mode) {
> case SPICE_AUDIO_DATA_MODE_RAW:
> @@ -450,7 +453,10 @@ static void playback_handle_start(SpiceChannel *channel,
> SpiceMsgIn *in)
> /* coroutine context */
> static void playback_handle_stop(SpiceChannel *channel, SpiceMsgIn *in)
> {
> + SpicePlaybackChannelPrivate *c = SPICE_PLAYBACK_CHANNEL(channel)->priv;
> +
> emit_main_context(channel, SPICE_PLAYBACK_STOP);
> + c->is_active = FALSE;
> }
>
> /* coroutine context */
> @@ -512,6 +518,24 @@ void
> spice_playback_channel_set_delay(SpicePlaybackChannel *channel, guint32 del
> CHANNEL_DEBUG(channel, "playback set_delay %u ms", delay_ms);
>
> c = channel->priv;
> + c->latency = delay_ms;
> spice_session_set_mm_time(spice_channel_get_session(SPICE_CHANNEL(channel)),
> c->last_time - delay_ms);
> }
> +
> +G_GNUC_INTERNAL
> +gboolean spice_playback_channel_is_active(SpicePlaybackChannel *channel)
> +{
> + g_return_val_if_fail(SPICE_IS_PLAYBACK_CHANNEL(channel), FALSE);
> + return channel->priv->is_active;
> +}
> +
> +G_GNUC_INTERNAL
> +guint32 spice_playback_channel_get_latency(SpicePlaybackChannel *channel)
> +{
> + g_return_val_if_fail(SPICE_IS_PLAYBACK_CHANNEL(channel), 0);
> + if (!channel->priv->is_active) {
> + return 0;
> + }
> + return channel->priv->latency;
> +}
> diff --git a/gtk/spice-session-priv.h b/gtk/spice-session-priv.h
> index 7ee6b6c..4cf5fe9 100644
> --- a/gtk/spice-session-priv.h
> +++ b/gtk/spice-session-priv.h
> @@ -106,6 +106,7 @@ struct _SpiceSessionPrivate {
> SpiceDesktopIntegration *desktop_integration;
> SpiceGtkSession *gtk_session;
> SpiceUsbDeviceManager *usb_manager;
> + SpicePlaybackChannel *playback_channel;
> };
>
> SpiceSession *spice_session_new_from_session(SpiceSession *session);
> @@ -154,6 +155,8 @@ gboolean
> spice_session_migrate_after_main_init(SpiceSession *session);
> SpiceChannel* spice_session_lookup_channel(SpiceSession *session, gint id,
> gint type);
> void spice_session_set_uuid(SpiceSession *session, guint8 uuid[16]);
> void spice_session_set_name(SpiceSession *session, const gchar *name);
> +gboolean spice_session_is_playback_active(SpiceSession *session);
> +guint32 spice_session_get_playback_latency(SpiceSession *session);
>
> G_END_DECLS
>
> diff --git a/gtk/spice-session.c b/gtk/spice-session.c
> index ccc9367..25cd6e4 100644
> --- a/gtk/spice-session.c
> +++ b/gtk/spice-session.c
> @@ -29,6 +29,7 @@
> #include "glib-compat.h"
> #include "wocky-http-proxy.h"
> #include "spice-proxy.h"
> +#include "channel-playback-priv.h"
>
> struct channel {
> SpiceChannel *channel;
> @@ -1800,6 +1801,8 @@ void spice_session_channel_new(SpiceSession *session,
> SpiceChannel *channel)
>
> CHANNEL_DEBUG(channel, "new main channel, switching");
> s->cmain = channel;
> + } else if (SPICE_IS_PLAYBACK_CHANNEL(channel)) {
Should warn if (!s->playback_channel), i.e. in practice I don't think anyone uses more then one playback channel, but it is possible with the protocol.
> + s->playback_channel = SPICE_PLAYBACK_CHANNEL(channel);
> }
>
> g_signal_emit(session, signals[SPICE_SESSION_CHANNEL_NEW], 0, channel);
> @@ -2062,3 +2065,30 @@ void spice_session_set_name(SpiceSession *session,
> const gchar *name)
>
> g_object_notify(G_OBJECT(session), "name");
> }
> +
> +G_GNUC_INTERNAL
> +gboolean spice_session_is_playback_active(SpiceSession *session)
> +{
> + SpiceSessionPrivate *s = SPICE_SESSION_GET_PRIVATE(session);
> +
> + g_return_val_if_fail(s != NULL, FALSE);
> +
> + return (s->playback_channel &&
> + spice_playback_channel_is_active(s->playback_channel));
> +}
> +
> +G_GNUC_INTERNAL
> +guint32 spice_session_get_playback_latency(SpiceSession *session)
> +{
> + SpiceSessionPrivate *s = SPICE_SESSION_GET_PRIVATE(session);
> +
> + g_return_val_if_fail(s != NULL, 0);
> +
> + if (s->playback_channel &&
> + spice_playback_channel_is_active(s->playback_channel)) {
> + return spice_playback_channel_get_latency(s->playback_channel);
> + } else {
> + SPICE_DEBUG("%s: not implemented when there isn't audio playback",
> __FUNCTION__);
> + return 0;
> + }
> +}
> --
> 1.8.1
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
More information about the Spice-devel
mailing list