[Spice-devel] [PATCH spice-server 21/28] snd_worker: support sending SPICE_MSG_PLAYBACK_LATENCY

Yonit Halperin yhalperi at redhat.com
Tue Feb 26 10:04:07 PST 2013


also update spice-common submodule
---
 server/snd_worker.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
 server/snd_worker.h |  2 ++
 2 files changed, 47 insertions(+)

diff --git a/server/snd_worker.c b/server/snd_worker.c
index bc7be51..9353e82 100644
--- a/server/snd_worker.c
+++ b/server/snd_worker.c
@@ -58,6 +58,7 @@ enum PlaybackeCommand {
     SND_PLAYBACK_CTRL,
     SND_PLAYBACK_PCM,
     SND_PLAYBACK_VOLUME,
+    SND_PLAYBACK_LATENCY,
 };
 
 enum RecordCommand {
@@ -71,6 +72,7 @@ enum RecordCommand {
 #define SND_PLAYBACK_CTRL_MASK (1 << SND_PLAYBACK_CTRL)
 #define SND_PLAYBACK_PCM_MASK (1 << SND_PLAYBACK_PCM)
 #define SND_PLAYBACK_VOLUME_MASK (1 << SND_PLAYBACK_VOLUME)
+#define SND_PLAYBACK_LATENCY_MASK ( 1 << SND_PLAYBACK_LATENCY)
 
 #define SND_RECORD_MIGRATE_MASK (1 << SND_RECORD_MIGRATE)
 #define SND_RECORD_CTRL_MASK (1 << SND_RECORD_CTRL)
@@ -144,6 +146,7 @@ struct PlaybackChannel {
     struct {
         uint8_t celt_buf[CELT_COMPRESSED_FRAME_BYTES];
     } send_data;
+    uint32_t latency;
 };
 
 struct SndWorker {
@@ -157,6 +160,7 @@ typedef struct SpiceVolumeState {
     uint8_t volume_nchannels;
     uint16_t *volume;
     int mute;
+    uint32_t dealy;
 } SpiceVolumeState;
 
 struct SpicePlaybackState {
@@ -610,6 +614,20 @@ static int snd_playback_send_mute(PlaybackChannel *playback_channel)
     return snd_send_mute(channel, &st->volume, SPICE_MSG_PLAYBACK_MUTE);
 }
 
+static int snd_playback_send_latency(PlaybackChannel *playback_channel)
+{
+    SndChannel *channel = &playback_channel->base;
+    SpiceMsgPlaybackLatency latency_msg;
+
+    spice_debug("latency %u", playback_channel->latency);
+    if (!snd_reset_send_data(channel, SPICE_MSG_PLAYBACK_LATENCY)) {
+        return FALSE;
+    }
+    latency_msg.latency_ms = playback_channel->latency;
+    spice_marshall_msg_playback_latency(channel->send_data.marshaller, &latency_msg);
+
+    return snd_begin_send_message(channel);
+}
 static int snd_playback_send_start(PlaybackChannel *playback_channel)
 {
     SndChannel *channel = (SndChannel *)playback_channel;
@@ -819,6 +837,12 @@ static void snd_playback_send(void* data)
             }
             channel->command &= ~SND_PLAYBACK_MIGRATE_MASK;
         }
+        if (channel->command & SND_PLAYBACK_LATENCY_MASK) {
+            if (!snd_playback_send_latency(playback_channel)) {
+                return;
+            }
+            channel->command &= ~SND_PLAYBACK_LATENCY_MASK;
+        }
     }
 }
 
@@ -1096,6 +1120,27 @@ SPICE_GNUC_VISIBLE void spice_server_playback_put_samples(SpicePlaybackInstance
     snd_playback_send(&playback_channel->base);
 }
 
+void snd_set_playback_latency(RedClient *client, uint32_t latency)
+{
+    SndWorker *now = workers;
+
+    for (; now; now = now->next) {
+        if (now->base_channel->type == SPICE_CHANNEL_PLAYBACK && now->connection &&
+            now->connection->channel_client->client == client) {
+
+            if (red_channel_client_test_remote_cap(now->connection->channel_client,
+                SPICE_PLAYBACK_CAP_LATENCY)) {
+                PlaybackChannel* playback = (PlaybackChannel*)now->connection;
+
+                playback->latency = latency;
+                snd_set_command(now->connection, SND_PLAYBACK_LATENCY_MASK);
+                snd_playback_send(now->connection);
+            } else {
+                spice_debug("client doesn't not support SPICE_PLAYBACK_CAP_LATENCY");
+            }
+        }
+    }
+}
 static void on_new_playback_channel(SndWorker *worker)
 {
     PlaybackChannel *playback_channel =
diff --git a/server/snd_worker.h b/server/snd_worker.h
index 1811a61..8de746d 100644
--- a/server/snd_worker.h
+++ b/server/snd_worker.h
@@ -29,4 +29,6 @@ void snd_detach_record(SpiceRecordInstance *sin);
 void snd_set_playback_compression(int on);
 int snd_get_playback_compression(void);
 
+void snd_set_playback_latency(RedClient *client, uint32_t latency);
+
 #endif
-- 
1.8.1



More information about the Spice-devel mailing list