summaryrefslogtreecommitdiffstats
path: root/sound/firewire/amdtp.c
diff options
context:
space:
mode:
authorTakashi Sakamoto2014-04-25 15:44:48 +0200
committerTakashi Iwai2014-05-26 14:13:44 +0200
commitccccad8646fad5f86f09adb040e02ca1a838585c (patch)
tree539472a8db665f9c2d5967cfb318e3f677ff20c4 /sound/firewire/amdtp.c
parentALSA: firewire-lib: Add support for MIDI capture/playback (diff)
downloadkernel-qcow2-linux-ccccad8646fad5f86f09adb040e02ca1a838585c.tar.gz
kernel-qcow2-linux-ccccad8646fad5f86f09adb040e02ca1a838585c.tar.xz
kernel-qcow2-linux-ccccad8646fad5f86f09adb040e02ca1a838585c.zip
ALSA: firewire-lib: Give syt value as parameter to handle_out_packet()
For duplex streams with synchronization, drivers should pick up 'presentation timestamp' from in-packets and use the timestamp for out-packets. This commit is preparation for this. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/firewire/amdtp.c')
-rw-r--r--sound/firewire/amdtp.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c
index a4553ec1b63e..24e9a961fe7e 100644
--- a/sound/firewire/amdtp.c
+++ b/sound/firewire/amdtp.c
@@ -257,7 +257,9 @@ static unsigned int calculate_data_blocks(struct amdtp_stream *s)
{
unsigned int phase, data_blocks;
- if (!cip_sfc_is_base_44100(s->sfc)) {
+ if (s->flags & CIP_BLOCKING)
+ data_blocks = s->syt_interval;
+ else if (!cip_sfc_is_base_44100(s->sfc)) {
/* Sample_rate / 8000 is an integer, and precomputed. */
data_blocks = s->data_block_state;
} else {
@@ -616,26 +618,22 @@ static inline int queue_in_packet(struct amdtp_stream *s)
amdtp_stream_get_max_payload(s), false);
}
-static void handle_out_packet(struct amdtp_stream *s, unsigned int cycle)
+static void handle_out_packet(struct amdtp_stream *s, unsigned int syt)
{
__be32 *buffer;
- unsigned int index, data_blocks, syt, payload_length;
+ unsigned int data_blocks, payload_length;
struct snd_pcm_substream *pcm;
if (s->packet_index < 0)
return;
- index = s->packet_index;
/* this module generate empty packet for 'no data' */
- syt = calculate_syt(s, cycle);
- if (!(s->flags & CIP_BLOCKING))
+ if (!(s->flags & CIP_BLOCKING) || (syt != CIP_SYT_NO_INFO))
data_blocks = calculate_data_blocks(s);
- else if (syt != CIP_SYT_NO_INFO)
- data_blocks = s->syt_interval;
else
data_blocks = 0;
- buffer = s->buffer.packets[index].buffer;
+ buffer = s->buffer.packets[s->packet_index].buffer;
buffer[0] = cpu_to_be32(ACCESS_ONCE(s->source_node_id_field) |
(s->data_block_quadlets << AMDTP_DBS_SHIFT) |
s->data_block_counter);
@@ -746,7 +744,7 @@ static void out_stream_callback(struct fw_iso_context *context, u32 cycle,
void *private_data)
{
struct amdtp_stream *s = private_data;
- unsigned int i, packets = header_length / 4;
+ unsigned int i, syt, packets = header_length / 4;
/*
* Compute the cycle of the last queued packet.
@@ -755,8 +753,10 @@ static void out_stream_callback(struct fw_iso_context *context, u32 cycle,
*/
cycle += QUEUE_LENGTH - packets;
- for (i = 0; i < packets; ++i)
- handle_out_packet(s, ++cycle);
+ for (i = 0; i < packets; ++i) {
+ syt = calculate_syt(s, ++cycle);
+ handle_out_packet(s, syt);
+ }
fw_iso_context_queue_flush(s->context);
}