Skip to content

Commit

Permalink
ALSA: firewire-lib: cache maximum length of payload to reduce functio…
Browse files Browse the repository at this point in the history
…n calls

During packet streaming, maximum length of payload for isochronous packet
is invariable, therefore no need to recalculate. Current ALSA IEC 61883-1/6
engine calls a function to calculate it 8,000 or more times per second
for incoming packet processing.

This commit adds a member to have maximum length of payload into 'struct
amdtp_stream', to reduces the function calls. At first callback from
isochronous context, the length is calculated and stored for later
processing.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
takaswie authored and tiwai committed Apr 12, 2017
1 parent 12ee402 commit f91c9d7
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 4 deletions.
9 changes: 5 additions & 4 deletions sound/firewire/amdtp-stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -412,8 +412,7 @@ static inline int queue_out_packet(struct amdtp_stream *s,

static inline int queue_in_packet(struct amdtp_stream *s)
{
return queue_packet(s, IN_PACKET_HEADER_SIZE,
amdtp_stream_get_max_payload(s));
return queue_packet(s, IN_PACKET_HEADER_SIZE, s->max_payload_length);
}

static int handle_out_packet(struct amdtp_stream *s,
Expand Down Expand Up @@ -713,12 +712,12 @@ static void in_stream_callback(struct fw_iso_context *context, u32 tstamp,
cycle = decrement_cycle_count(cycle, packets);

/* For buffer-over-run prevention. */
max_payload_length = amdtp_stream_get_max_payload(s);
max_payload_length = s->max_payload_length;

for (i = 0; i < packets; i++) {
cycle = increment_cycle_count(cycle, 1);

/* The number of quadlets in this packet */
/* The number of bytes in this packet */
payload_length =
(be32_to_cpu(headers[i]) >> ISO_DATA_LENGTH_SHIFT);
if (payload_length > max_payload_length) {
Expand Down Expand Up @@ -751,6 +750,8 @@ static void amdtp_stream_first_callback(struct fw_iso_context *context,
u32 cycle;
unsigned int packets;

s->max_payload_length = amdtp_stream_get_max_payload(s);

/*
* For in-stream, first packet has come.
* For out-stream, prepared to transmit first packet
Expand Down
1 change: 1 addition & 0 deletions sound/firewire/amdtp-stream.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ struct amdtp_stream {
int (*handle_packet)(struct amdtp_stream *s,
unsigned int payload_quadlets, unsigned int cycle,
unsigned int index);
unsigned int max_payload_length;

/* For CIP headers. */
unsigned int source_node_id_field;
Expand Down

0 comments on commit f91c9d7

Please sign in to comment.