Skip to content

Commit

Permalink
ALSA: firewire-tascam: pick up data of state from tx isochronous pakcets
Browse files Browse the repository at this point in the history
Units of TASCAM FireWire series multiplex PCM frames and state of
control surface into the same tx isochronous packets. One isochronous
packet includes a part of the state in a quadlet data. An image of the
state consists of 64 quadlet data.

This commit demultiplexes the state from tx isochronous packets.

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 Nov 23, 2018
1 parent c12faa2 commit 33b2e14
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 1 deletion.
2 changes: 2 additions & 0 deletions include/uapi/sound/firewire.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,6 @@ struct snd_firewire_get_info {
* Returns -EBUSY if the driver is already streaming.
*/

#define SNDRV_FIREWIRE_TASCAM_STATE_COUNT 64

#endif /* _UAPI_SOUND_FIREWIRE_H_INCLUDED */
17 changes: 16 additions & 1 deletion sound/firewire/tascam/amdtp-tascam.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,21 @@ int amdtp_tscm_add_pcm_hw_constraints(struct amdtp_stream *s,
return amdtp_stream_add_pcm_hw_constraints(s, runtime);
}

static void read_status_messages(struct amdtp_stream *s,
__be32 *buffer, unsigned int data_blocks)
{
struct snd_tscm *tscm = container_of(s, struct snd_tscm, tx_stream);
int i;

for (i = 0; i < data_blocks; i++) {
unsigned int index;

index = be32_to_cpu(buffer[0]) % SNDRV_FIREWIRE_TASCAM_STATE_COUNT;
tscm->state[index] = buffer[s->data_block_quadlets - 1];
buffer += s->data_block_quadlets;
}
}

static unsigned int process_tx_data_blocks(struct amdtp_stream *s,
__be32 *buffer,
unsigned int data_blocks,
Expand All @@ -128,7 +143,7 @@ static unsigned int process_tx_data_blocks(struct amdtp_stream *s,
if (data_blocks > 0 && pcm)
read_pcm_s32(s, pcm, buffer, data_blocks);

/* A place holder for control messages. */
read_status_messages(s, buffer, data_blocks);

return data_blocks;
}
Expand Down
3 changes: 3 additions & 0 deletions sound/firewire/tascam/tascam.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ struct snd_tscm {

/* For MIDI message outgoing transactions. */
struct snd_fw_async_midi_port out_ports[TSCM_MIDI_OUT_PORT_MAX];

// A cache of status information in tx isoc packets.
__be32 state[SNDRV_FIREWIRE_TASCAM_STATE_COUNT];
};

#define TSCM_ADDR_BASE 0xffff00000000ull
Expand Down

0 comments on commit 33b2e14

Please sign in to comment.