Skip to content

Commit

Permalink
ALSA: firewire-lib: code refactoring for cache position in sequence r…
Browse files Browse the repository at this point in the history
…eplay

When sequence replay is enabled for media clock recovery, current
implementation refers to cache of sequence descriptors in tx packets, then
fulfil sequence descriptors for rx packets. The initialization for rx
packets is done before starting packet streaming, while it can be postponed
till the cache has enough entries for the replay.

This commit refactors for the purpose as well as minor code change for
renaming of structure member.

Signed-off-by: Takashi Sakamoto <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
takaswie authored and tiwai committed Jan 8, 2023
1 parent cccddec commit c38d8cf
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 8 deletions.
16 changes: 9 additions & 7 deletions sound/firewire/amdtp-stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -546,16 +546,16 @@ static void pool_replayed_seq(struct amdtp_stream *s, struct seq_desc *descs, un
struct amdtp_stream *target = s->ctx_data.rx.replay_target;
const struct seq_desc *cache = target->ctx_data.tx.cache.descs;
const unsigned int cache_size = target->ctx_data.tx.cache.size;
unsigned int cache_head = s->ctx_data.rx.cache_head;
unsigned int cache_pos = s->ctx_data.rx.cache_pos;
int i;

for (i = 0; i < count; ++i) {
descs[pos] = cache[cache_head];
cache_head = (cache_head + 1) % cache_size;
descs[pos] = cache[cache_pos];
cache_pos = (cache_pos + 1) % cache_size;
pos = (pos + 1) % size;
}

s->ctx_data.rx.cache_head = cache_head;
s->ctx_data.rx.cache_pos = cache_pos;
}

static void pool_seq_descs(struct amdtp_stream *s, struct seq_desc *descs, unsigned int size,
Expand All @@ -573,8 +573,8 @@ static void pool_seq_descs(struct amdtp_stream *s, struct seq_desc *descs, unsig
} else {
struct amdtp_stream *tx = s->ctx_data.rx.replay_target;
const unsigned int cache_size = tx->ctx_data.tx.cache.size;
const unsigned int cache_head = s->ctx_data.rx.cache_head;
unsigned int cached_cycles = calculate_cached_cycle_count(tx, cache_head);
const unsigned int cache_pos = s->ctx_data.rx.cache_pos;
unsigned int cached_cycles = calculate_cached_cycle_count(tx, cache_pos);

if (cached_cycles > count && cached_cycles > cache_size / 2)
pool_seq_descs = pool_replayed_seq;
Expand Down Expand Up @@ -1181,6 +1181,9 @@ static void process_rx_packets_intermediately(struct fw_iso_context *context, u3
s->ready_processing = true;
wake_up(&s->ready_wait);

if (d->replay.enable)
s->ctx_data.rx.cache_pos = 0;

process_rx_packets(context, tstamp, header_length, ctx_header, private_data);
if (amdtp_streaming_error(s))
return;
Expand Down Expand Up @@ -1909,7 +1912,6 @@ static int make_association(struct amdtp_domain *d)
}

rx->ctx_data.rx.replay_target = tx;
rx->ctx_data.rx.cache_head = 0;

++dst_index;
}
Expand Down
2 changes: 1 addition & 1 deletion sound/firewire/amdtp-stream.h
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ struct amdtp_stream {
unsigned int last_syt_offset;

struct amdtp_stream *replay_target;
unsigned int cache_head;
unsigned int cache_pos;
} rx;
} ctx_data;

Expand Down

0 comments on commit c38d8cf

Please sign in to comment.