summaryrefslogtreecommitdiffstats
path: root/server/snd_worker.c
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2013-01-25 09:21:22 -0500
committerYonit Halperin <yhalperi@redhat.com>2013-04-22 16:30:54 -0400
commita9087c4c8a1cf38c9dae331a9255f0dc6823e7b8 (patch)
tree5ece0db95f38cbdfffd0455f87267e958cb8776c /server/snd_worker.c
parentba1aaef0fea69dc46297a5f85d50020fb728355b (diff)
downloadspice-a9087c4c8a1cf38c9dae331a9255f0dc6823e7b8.tar.gz
spice-a9087c4c8a1cf38c9dae331a9255f0dc6823e7b8.tar.xz
spice-a9087c4c8a1cf38c9dae331a9255f0dc6823e7b8.zip
snd_worker: support sending SPICE_MSG_PLAYBACK_LATENCY
also update spice-common submodule
Diffstat (limited to 'server/snd_worker.c')
-rw-r--r--server/snd_worker.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/server/snd_worker.c b/server/snd_worker.c
index 2647d878..d6ec47a8 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 {
@@ -610,6 +613,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 +836,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 +1119,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 =