aboutsummaryrefslogtreecommitdiffstats
path: root/sound/firewire
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2011-03-15 02:55:02 -0400
committerTakashi Iwai <tiwai@suse.de>2011-03-15 03:42:25 -0400
commitbe454366324b31922a2460c63c65d5e3cebe9641 (patch)
tree8e1651f134e9dca6560f1f03c6f88e0449e4004e /sound/firewire
parent31ef9134eb52636d383a7d0626cbbd345cb94f2f (diff)
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 <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/firewire')
-rw-r--r--sound/firewire/amdtp.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c
index 09f70ee4d04..046007ddbca 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,
228 syt_offset = s->last_syt_offset - TICKS_PER_CYCLE; 228 syt_offset = s->last_syt_offset - TICKS_PER_CYCLE;
229 s->last_syt_offset = syt_offset; 229 s->last_syt_offset = syt_offset;
230 230
231 syt_offset += TRANSFER_DELAY_TICKS - TICKS_PER_CYCLE; 231 if (syt_offset < TICKS_PER_CYCLE) {
232 syt = (cycle + syt_offset / TICKS_PER_CYCLE) << 12; 232 syt_offset += TRANSFER_DELAY_TICKS - TICKS_PER_CYCLE;
233 syt += syt_offset % TICKS_PER_CYCLE; 233 syt = (cycle + syt_offset / TICKS_PER_CYCLE) << 12;
234 syt += syt_offset % TICKS_PER_CYCLE;
234 235
235 return syt & 0xffff; 236 return syt & 0xffff;
237 } else {
238 return 0xffff; /* no info */
239 }
236} 240}
237 241
238static void amdtp_write_s32(struct amdtp_out_stream *s, 242static void amdtp_write_s32(struct amdtp_out_stream *s,