Skip to content

Commit

Permalink
ALSA: firewire-motu: code refactoring for MOTU data block processing …
Browse files Browse the repository at this point in the history
…layer

This is code refactoring for MOTU data block processing layer so that
it can receive list of packet descriptor.

Signed-off-by: Takashi Sakamoto <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
takaswie authored and tiwai committed Jul 22, 2019
1 parent 806653b commit 00d004d
Showing 1 changed file with 33 additions and 24 deletions.
57 changes: 33 additions & 24 deletions sound/firewire/motu/amdtp-motu.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,19 +117,25 @@ int amdtp_motu_set_parameters(struct amdtp_stream *s, unsigned int rate,
return 0;
}

static void read_pcm_s32(struct amdtp_stream *s,
struct snd_pcm_runtime *runtime,
__be32 *buffer, unsigned int data_blocks)
static void read_pcm_s32(struct amdtp_stream *s, struct snd_pcm_substream *pcm,
__be32 *buffer, unsigned int data_blocks,
unsigned int pcm_frames)
{
struct amdtp_motu *p = s->protocol;
unsigned int channels, remaining_frames, i, c;
unsigned int channels = p->pcm_chunks;
struct snd_pcm_runtime *runtime = pcm->runtime;
unsigned int pcm_buffer_pointer;
int remaining_frames;
u8 *byte;
u32 *dst;
int i, c;

pcm_buffer_pointer = s->pcm_buffer_pointer + pcm_frames;
pcm_buffer_pointer %= runtime->buffer_size;

channels = p->pcm_chunks;
dst = (void *)runtime->dma_area +
frames_to_bytes(runtime, s->pcm_buffer_pointer);
remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer;
frames_to_bytes(runtime, pcm_buffer_pointer);
remaining_frames = runtime->buffer_size - pcm_buffer_pointer;

for (i = 0; i < data_blocks; ++i) {
byte = (u8 *)buffer + p->pcm_byte_offset;
Expand All @@ -147,19 +153,25 @@ static void read_pcm_s32(struct amdtp_stream *s,
}
}

static void write_pcm_s32(struct amdtp_stream *s,
struct snd_pcm_runtime *runtime,
__be32 *buffer, unsigned int data_blocks)
static void write_pcm_s32(struct amdtp_stream *s, struct snd_pcm_substream *pcm,
__be32 *buffer, unsigned int data_blocks,
unsigned int pcm_frames)
{
struct amdtp_motu *p = s->protocol;
unsigned int channels, remaining_frames, i, c;
unsigned int channels = p->pcm_chunks;
struct snd_pcm_runtime *runtime = pcm->runtime;
unsigned int pcm_buffer_pointer;
int remaining_frames;
u8 *byte;
const u32 *src;
int i, c;

pcm_buffer_pointer = s->pcm_buffer_pointer + pcm_frames;
pcm_buffer_pointer %= runtime->buffer_size;

channels = p->pcm_chunks;
src = (void *)runtime->dma_area +
frames_to_bytes(runtime, s->pcm_buffer_pointer);
remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer;
frames_to_bytes(runtime, pcm_buffer_pointer);
remaining_frames = runtime->buffer_size - pcm_buffer_pointer;

for (i = 0; i < data_blocks; ++i) {
byte = (u8 *)buffer + p->pcm_byte_offset;
Expand Down Expand Up @@ -303,7 +315,7 @@ static unsigned int process_tx_data_blocks(struct amdtp_stream *s,
struct snd_pcm_substream *pcm)
{
struct amdtp_motu *p = s->protocol;
unsigned int pcm_frames;
unsigned int pcm_frames = 0;

trace_data_block_sph(s, desc->data_blocks, desc->ctx_payload);
trace_data_block_message(s, desc->data_blocks, desc->ctx_payload);
Expand All @@ -312,11 +324,9 @@ static unsigned int process_tx_data_blocks(struct amdtp_stream *s,
read_midi_messages(s, desc->ctx_payload, desc->data_blocks);

if (pcm) {
read_pcm_s32(s, pcm->runtime, desc->ctx_payload,
desc->data_blocks);
read_pcm_s32(s, pcm, desc->ctx_payload, desc->data_blocks,
pcm_frames);
pcm_frames = desc->data_blocks;
} else {
pcm_frames = 0;
}

return pcm_frames;
Expand Down Expand Up @@ -368,21 +378,20 @@ static unsigned int process_rx_data_blocks(struct amdtp_stream *s,
const struct pkt_desc *desc,
struct snd_pcm_substream *pcm)
{
struct amdtp_motu *p = (struct amdtp_motu *)s->protocol;
unsigned int pcm_frames;
struct amdtp_motu *p = s->protocol;
unsigned int pcm_frames = 0;

/* TODO: how to interact control messages between userspace? */

if (p->midi_ports)
write_midi_messages(s, desc->ctx_payload, desc->data_blocks);

if (pcm) {
write_pcm_s32(s, pcm->runtime, desc->ctx_payload,
desc->data_blocks);
write_pcm_s32(s, pcm, desc->ctx_payload, desc->data_blocks,
pcm_frames);
pcm_frames = desc->data_blocks;
} else {
write_pcm_silence(s, desc->ctx_payload, desc->data_blocks);
pcm_frames = 0;
}

write_sph(s, desc->ctx_payload, desc->data_blocks);
Expand Down

0 comments on commit 00d004d

Please sign in to comment.