Skip to content

Commit

Permalink
ALSA: firewire-lib: compute pointer to payload buffer in context handler
Browse files Browse the repository at this point in the history
The value of pointer to payload buffer is computed in each packet
handler, however the pointer can be decided before call of packet
handler.

This commit adds an argument for the pointer to the packet handler to
reduce codes to compute for the pointer.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Takashi Sakamoto authored and Takashi Iwai committed May 23, 2019
1 parent 6f3c07d commit 8a400b9
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 16 deletions.
28 changes: 13 additions & 15 deletions sound/firewire/amdtp-stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,16 +475,15 @@ static inline int queue_in_packet(struct amdtp_stream *s)
}

static int handle_out_packet(struct amdtp_stream *s, unsigned int cycle,
const __be32 *ctx_header, unsigned int index)
const __be32 *ctx_header, __be32 *buffer,
unsigned int index)
{
__be32 *buffer;
unsigned int syt;
unsigned int data_blocks;
unsigned int pcm_frames;
unsigned int payload_length;
struct snd_pcm_substream *pcm;

buffer = s->buffer.packets[s->packet_index].buffer;
syt = calculate_syt(s, cycle);
data_blocks = calculate_data_blocks(s, syt);
pcm_frames = s->process_data_blocks(s, buffer + 2, data_blocks, &syt);
Expand Down Expand Up @@ -522,16 +521,14 @@ static int handle_out_packet(struct amdtp_stream *s, unsigned int cycle,

static int handle_out_packet_without_header(struct amdtp_stream *s,
unsigned int cycle, const __be32 *ctx_header,
unsigned int index)
__be32 *buffer, unsigned int index)
{
__be32 *buffer;
unsigned int syt;
unsigned int data_blocks;
unsigned int pcm_frames;
unsigned int payload_length;
struct snd_pcm_substream *pcm;

buffer = s->buffer.packets[s->packet_index].buffer;
syt = calculate_syt(s, cycle);
data_blocks = calculate_data_blocks(s, syt);
pcm_frames = s->process_data_blocks(s, buffer, data_blocks, &syt);
Expand All @@ -553,9 +550,9 @@ static int handle_out_packet_without_header(struct amdtp_stream *s,
}

static int handle_in_packet(struct amdtp_stream *s, unsigned int cycle,
const __be32 *ctx_header, unsigned int index)
const __be32 *ctx_header, __be32 *buffer,
unsigned int index)
{
__be32 *buffer;
unsigned int payload_length;
u32 cip_header[2];
unsigned int sph, fmt, fdf, syt;
Expand All @@ -573,7 +570,6 @@ static int handle_in_packet(struct amdtp_stream *s, unsigned int cycle,
return -EIO;
}

buffer = s->buffer.packets[s->packet_index].buffer;
cip_header[0] = be32_to_cpu(buffer[0]);
cip_header[1] = be32_to_cpu(buffer[1]);

Expand Down Expand Up @@ -678,17 +674,15 @@ static int handle_in_packet(struct amdtp_stream *s, unsigned int cycle,

static int handle_in_packet_without_header(struct amdtp_stream *s,
unsigned int cycle, const __be32 *ctx_header,
unsigned int index)
__be32 *buffer, unsigned int index)
{
__be32 *buffer;
unsigned int payload_length;
unsigned int data_blocks;
struct snd_pcm_substream *pcm;
unsigned int pcm_frames;

payload_length = be32_to_cpu(ctx_header[0]) >> ISO_DATA_LENGTH_SHIFT;
buffer = s->buffer.packets[s->packet_index].buffer;
data_blocks = payload_length / sizeof(__be32) / s->data_block_quadlets;
data_blocks = payload_length / 4 / s->data_block_quadlets;

trace_amdtp_packet(s, cycle, NULL, payload_length, data_blocks, index);

Expand Down Expand Up @@ -753,10 +747,12 @@ static void out_stream_callback(struct fw_iso_context *context, u32 tstamp,

for (i = 0; i < packets; ++i) {
u32 cycle;
__be32 *buffer;

cycle = compute_it_cycle(*ctx_header);
buffer = s->buffer.packets[s->packet_index].buffer;

if (s->handle_packet(s, cycle, ctx_header, i) < 0) {
if (s->handle_packet(s, cycle, ctx_header, buffer, i) < 0) {
cancel_stream(s);
return;
}
Expand All @@ -783,10 +779,12 @@ static void in_stream_callback(struct fw_iso_context *context, u32 tstamp,

for (i = 0; i < packets; i++) {
u32 cycle;
__be32 *buffer;

cycle = compute_cycle_count(ctx_header[1]);
buffer = s->buffer.packets[s->packet_index].buffer;

if (s->handle_packet(s, cycle, ctx_header, i) < 0)
if (s->handle_packet(s, cycle, ctx_header, buffer, i) < 0)
break;

ctx_header += s->ctx_data.tx.ctx_header_size / sizeof(*ctx_header);
Expand Down
3 changes: 2 additions & 1 deletion sound/firewire/amdtp-stream.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,8 @@ struct amdtp_stream {
int packet_index;
int tag;
int (*handle_packet)(struct amdtp_stream *s, unsigned int cycle,
const __be32 *ctx_header, unsigned int index);
const __be32 *ctx_header, __be32 *buffer,
unsigned int index);
union {
struct {
unsigned int ctx_header_size;
Expand Down

0 comments on commit 8a400b9

Please sign in to comment.