ALSA: firewire-lib: use no-info SYT for packets without SYT sample
authorClemens Ladisch <clemens@ladisch.de>
Tue, 15 Mar 2011 06:55:02 +0000 (07:55 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 15 Mar 2011 07:42:25 +0000 (08:42 +0100)
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>
sound/firewire/amdtp.c

index 09f70ee4d04a572a10d493a08906f5a36a6ab256..046007ddbcaed09a95c6d6688593bbd479feed88 100644 (file)
@@ -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,