[alsa-devel] [PATCH 10/38] firewire-lib: Add transfer delay to synchronized duplex streams
Takashi Sakamoto
o-takashi at sakamocchi.jp
Fri Dec 20 14:14:01 CET 2013
Currently, when duplex streams with synchronization mode, this module just pass
'presentation timestamp' from in-packets to out-packets. This is enough to
handle actual device but logically the timestamp should include
'transfer delay' and 'processing time'. This means the timestamp in out-packet
should be at future.
To be simple, this commit add only 'transfer delay'.
Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
---
sound/firewire/amdtp.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c
index b17ec9b..00d4485 100644
--- a/sound/firewire/amdtp.c
+++ b/sound/firewire/amdtp.c
@@ -785,6 +785,15 @@ static void packet_sort(struct sort_table *tbl, unsigned int len)
} while (i < len);
}
+static inline void add_transfer_delay(struct amdtp_stream *s, unsigned int *syt)
+{
+ if (*syt != CIP_SYT_NO_INFO) {
+ *syt += (s->transfer_delay / TICKS_PER_CYCLE) << 12;
+ *syt += s->transfer_delay % TICKS_PER_CYCLE;
+ *syt &= CIP_SYT_MASK;
+ }
+}
+
static void out_stream_callback(struct fw_iso_context *context, u32 cycle,
size_t header_length, void *header,
void *private_data)
@@ -856,6 +865,7 @@ static void in_stream_callback(struct fw_iso_context *context, u32 cycle,
(s->flags & CIP_SYNC_TO_DEVICE) &&
s->sync_slave->callbacked) {
syt = be32_to_cpu(buffer[1]) & CIP_SYT_MASK;
+ add_transfer_delay(s, &syt);
handle_out_packet(s->sync_slave, syt);
}
handle_in_packet(s, tbl[i].payload_size / 4, buffer);
--
1.8.3.2
More information about the Alsa-devel
mailing list