diff options
author | Andrew Eikum <aeikum@codeweavers.com> | 2012-09-13 13:38:50 -0500 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2012-10-01 19:13:12 +0200 |
commit | d958fc100c0d14c8f55016df417c7587f670b037 (patch) | |
tree | b5fdef226f9f4da5dfbe70566a35a9c78ed49da0 /server/snd_worker.c | |
parent | 0a62e332119abf5d21790e125f51c599a5c651dd (diff) | |
download | spice-d958fc100c0d14c8f55016df417c7587f670b037.tar.gz spice-d958fc100c0d14c8f55016df417c7587f670b037.tar.xz spice-d958fc100c0d14c8f55016df417c7587f670b037.zip |
server: Access the correct SndChannel for a given AudioFrame
The client of _get_buffer() holds a ref to the SndChannel, and we
should access that SndChannel when _put_samples() is called, not the one
that happens to currently be attached to the Interface.
Diffstat (limited to 'server/snd_worker.c')
-rw-r--r-- | server/snd_worker.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/server/snd_worker.c b/server/snd_worker.c index 13f8c4dd..6034aec0 100644 --- a/server/snd_worker.c +++ b/server/snd_worker.c @@ -122,10 +122,14 @@ struct SndChannel { snd_channel_cleanup_channel_proc cleanup; }; +struct PlaybackChannel; +typedef struct PlaybackChannel PlaybackChannel; + typedef struct AudioFrame AudioFrame; struct AudioFrame { uint32_t time; uint32_t samples[FRAME_SIZE]; + PlaybackChannel *channel; AudioFrame *next; }; @@ -227,6 +231,7 @@ static void snd_disconnect_channel(SndChannel *channel) static void snd_playback_free_frame(PlaybackChannel *playback_channel, AudioFrame *frame) { + frame->channel = playback_channel; frame->next = playback_channel->free_frames; playback_channel->free_frames = frame; } @@ -1067,14 +1072,16 @@ SPICE_GNUC_VISIBLE void spice_server_playback_get_buffer(SpicePlaybackInstance * SPICE_GNUC_VISIBLE void spice_server_playback_put_samples(SpicePlaybackInstance *sin, uint32_t *samples) { - SndChannel *channel = sin->st->worker.connection; - PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base); + PlaybackChannel *playback_channel; AudioFrame *frame; - if (!channel) { + if (!sin->st->worker.connection) { return; } - if (!snd_channel_put(channel)) { + + frame = SPICE_CONTAINEROF(samples, AudioFrame, samples); + playback_channel = frame->channel; + if (!snd_channel_put(&playback_channel->base) || !playback_channel->base.worker->connection) { /* lost last reference, channel has been destroyed previously */ return; } @@ -1083,7 +1090,6 @@ SPICE_GNUC_VISIBLE void spice_server_playback_put_samples(SpicePlaybackInstance if (playback_channel->pending_frame) { snd_playback_free_frame(playback_channel, playback_channel->pending_frame); } - frame = SPICE_CONTAINEROF(samples, AudioFrame, samples); frame->time = reds_get_mm_time(); red_dispatcher_set_mm_time(frame->time); playback_channel->pending_frame = frame; |