summaryrefslogtreecommitdiffstats
path: root/server/snd_worker.c
diff options
context:
space:
mode:
authorAndrew Eikum <aeikum@codeweavers.com>2012-09-13 13:38:50 -0500
committerChristophe Fergeau <cfergeau@redhat.com>2012-10-01 19:13:12 +0200
commitd958fc100c0d14c8f55016df417c7587f670b037 (patch)
treeb5fdef226f9f4da5dfbe70566a35a9c78ed49da0 /server/snd_worker.c
parent0a62e332119abf5d21790e125f51c599a5c651dd (diff)
downloadspice-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.c16
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;