summaryrefslogtreecommitdiffstats
path: root/server/snd_worker.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2010-05-20 13:32:00 +0200
committerGerd Hoffmann <kraxel@redhat.com>2010-05-21 09:28:25 +0200
commitd351bb35ce981d39e839528f4a23bc5b501adab8 (patch)
treec8b31943c9cfaeb57b8524742ac93dcae9299526 /server/snd_worker.c
parent45e62d5368f055ae1d64008086a7e4721cba0ac3 (diff)
downloadspice-d351bb35ce981d39e839528f4a23bc5b501adab8.tar.gz
spice-d351bb35ce981d39e839528f4a23bc5b501adab8.tar.xz
spice-d351bb35ce981d39e839528f4a23bc5b501adab8.zip
sound channels: restart audio on client reconnect.
Diffstat (limited to 'server/snd_worker.c')
-rw-r--r--server/snd_worker.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/server/snd_worker.c b/server/snd_worker.c
index 1c9da5a9..e8d67153 100644
--- a/server/snd_worker.c
+++ b/server/snd_worker.c
@@ -140,17 +140,19 @@ typedef struct PlaybackChannel {
struct SndWorker {
Channel base;
- SpiceBaseInterface *interface;
SndChannel *connection;
SndWorker *next;
+ int active;
};
struct SpicePlaybackState {
struct SndWorker worker;
+ SpicePlaybackInstance *sin;
};
struct SpiceRecordState {
struct SndWorker worker;
+ SpiceRecordInstance *sin;
};
#define RECORD_MIG_VERSION 1
@@ -855,6 +857,7 @@ __visible__ void spice_server_playback_start(SpicePlaybackInstance *sin)
SndChannel *channel = sin->st->worker.connection;
PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base);
+ sin->st->worker.active = 1;
if (!channel)
return;
ASSERT(!playback_channel->base.active);
@@ -873,6 +876,7 @@ __visible__ void spice_server_playback_stop(SpicePlaybackInstance *sin)
SndChannel *channel = sin->st->worker.connection;
PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base);
+ sin->st->worker.active = 0;
if (!channel)
return;
ASSERT(playback_channel->base.active);
@@ -966,6 +970,7 @@ static void snd_set_playback_peer(Channel *channel, RedsStreamContext *peer, int
uint32_t *caps)
{
SndWorker *worker = (SndWorker *)channel;
+ SpicePlaybackState *st = SPICE_CONTAINEROF(worker, SpicePlaybackState, worker);
PlaybackChannel *playback_channel;
CELTEncoder *celt_encoder;
CELTMode *celt_mode;
@@ -1007,6 +1012,8 @@ static void snd_set_playback_peer(Channel *channel, RedsStreamContext *peer, int
SPICE_AUDIO_DATA_MODE_RAW;
on_new_playback_channel(worker);
+ if (worker->active)
+ spice_server_playback_start(st->sin);
snd_playback_send(worker->connection);
return;
@@ -1031,6 +1038,7 @@ __visible__ void spice_server_record_start(SpiceRecordInstance *sin)
SndChannel *channel = sin->st->worker.connection;
RecordChannel *record_channel = SPICE_CONTAINEROF(channel, RecordChannel, base);
+ sin->st->worker.active = 1;
if (!channel)
return;
ASSERT(!record_channel->base.active);
@@ -1050,6 +1058,7 @@ __visible__ void spice_server_record_stop(SpiceRecordInstance *sin)
SndChannel *channel = sin->st->worker.connection;
RecordChannel *record_channel = SPICE_CONTAINEROF(channel, RecordChannel, base);
+ sin->st->worker.active = 0;
if (!channel)
return;
ASSERT(record_channel->base.active);
@@ -1125,6 +1134,7 @@ static void snd_set_record_peer(Channel *channel, RedsStreamContext *peer, int m
uint32_t *caps)
{
SndWorker *worker = (SndWorker *)channel;
+ SpiceRecordState *st = SPICE_CONTAINEROF(worker, SpiceRecordState, worker);
RecordChannel *record_channel;
CELTDecoder *celt_decoder;
CELTMode *celt_mode;
@@ -1161,6 +1171,8 @@ static void snd_set_record_peer(Channel *channel, RedsStreamContext *peer, int m
record_channel->celt_decoder = celt_decoder;
on_new_record_channel(worker);
+ if (worker->active)
+ spice_server_record_start(st->sin);
snd_record_send(worker->connection);
return;
@@ -1205,6 +1217,7 @@ void snd_attach_playback(SpicePlaybackInstance *sin)
SndWorker *playback_worker;
sin->st = spice_new0(SpicePlaybackState, 1);
+ sin->st->sin = sin;
playback_worker = &sin->st->worker;
playback_worker->base.type = SPICE_CHANNEL_PLAYBACK;
@@ -1226,6 +1239,7 @@ void snd_attach_record(SpiceRecordInstance *sin)
SndWorker *record_worker;
sin->st = spice_new0(SpiceRecordState, 1);
+ sin->st->sin = sin;
record_worker = &sin->st->worker;
record_worker->base.type = SPICE_CHANNEL_RECORD;