From be454366324b31922a2460c63c65d5e3cebe9641 Mon Sep 17 00:00:00 2001 From: Clemens Ladisch Date: Tue, 15 Mar 2011 07:55:02 +0100 Subject: [PATCH] ALSA: firewire-lib: use no-info SYT for packets without SYT sample In non-blocking mode, the SYT_INTERVAL is larger than the number of audio frames in each packet, so there are packets that do not contain any frame to which the SYT could be applied. For these packets, the SYT must not be the timestamp of the next valid SYT frame, but the special no-info SYT value. This fixes broken playback on the FireWave at 44.1 kHz. Signed-off-by: Clemens Ladisch Signed-off-by: Takashi Iwai --- sound/firewire/amdtp.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c index 09f70ee4d04a..046007ddbcae 100644 --- a/sound/firewire/amdtp.c +++ b/sound/firewire/amdtp.c @@ -228,11 +228,15 @@ static unsigned int calculate_syt(struct amdtp_out_stream *s, syt_offset = s->last_syt_offset - TICKS_PER_CYCLE; s->last_syt_offset = syt_offset; - syt_offset += TRANSFER_DELAY_TICKS - TICKS_PER_CYCLE; - syt = (cycle + syt_offset / TICKS_PER_CYCLE) << 12; - syt += syt_offset % TICKS_PER_CYCLE; + if (syt_offset < TICKS_PER_CYCLE) { + syt_offset += TRANSFER_DELAY_TICKS - TICKS_PER_CYCLE; + syt = (cycle + syt_offset / TICKS_PER_CYCLE) << 12; + syt += syt_offset % TICKS_PER_CYCLE; - return syt & 0xffff; + return syt & 0xffff; + } else { + return 0xffff; /* no info */ + } } static void amdtp_write_s32(struct amdtp_out_stream *s, -- 2.20.1