Commit df075fee authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

ALSA: firewire-lib: complete AM824 data block processing layer

This commit moves the codes related to data block processing from packet
streaming layer to AM824 layer.

Each driver initializes amdtp stream structure for AM824 data block by
calling amdtp_am824_init(). Then, a memory block is allocated for AM824
specific structure. This memory block is released by calling
amdtp_stream_destroy().

When setting streaming parameters, it calls amdtp_am824_set_parameters().
When starting packet streaming, it calls amdtp_stream_start(). When
stopping packet streaming, it calls amdtp_stream_stop().
Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 49c7b3fc
This diff is collapsed.
...@@ -6,6 +6,27 @@ ...@@ -6,6 +6,27 @@
#include "amdtp-stream.h" #include "amdtp-stream.h"
#define AM824_IN_PCM_FORMAT_BITS SNDRV_PCM_FMTBIT_S32
#define AM824_OUT_PCM_FORMAT_BITS (SNDRV_PCM_FMTBIT_S16 | \
SNDRV_PCM_FMTBIT_S32)
/*
* This module supports maximum 64 PCM channels for one PCM stream
* This is for our convenience.
*/
#define AM824_MAX_CHANNELS_FOR_PCM 64
/*
* AMDTP packet can include channels for MIDI conformant data.
* Each MIDI conformant data channel includes 8 MPX-MIDI data stream.
* Each MPX-MIDI data stream includes one data stream from/to MIDI ports.
*
* This module supports maximum 1 MIDI conformant data channels.
* Then this AMDTP packets can transfer maximum 8 MIDI data streams.
*/
#define AM824_MAX_CHANNELS_FOR_MIDI 1
int amdtp_am824_set_parameters(struct amdtp_stream *s, unsigned int rate, int amdtp_am824_set_parameters(struct amdtp_stream *s, unsigned int rate,
unsigned int pcm_channels, unsigned int pcm_channels,
unsigned int midi_ports, unsigned int midi_ports,
...@@ -20,6 +41,9 @@ void amdtp_am824_set_midi_position(struct amdtp_stream *s, ...@@ -20,6 +41,9 @@ void amdtp_am824_set_midi_position(struct amdtp_stream *s,
int amdtp_am824_add_pcm_hw_constraints(struct amdtp_stream *s, int amdtp_am824_add_pcm_hw_constraints(struct amdtp_stream *s,
struct snd_pcm_runtime *runtime); struct snd_pcm_runtime *runtime);
void amdtp_am824_set_pcm_format(struct amdtp_stream *s,
snd_pcm_format_t format);
void amdtp_am824_midi_trigger(struct amdtp_stream *s, unsigned int port, void amdtp_am824_midi_trigger(struct amdtp_stream *s, unsigned int port,
struct snd_rawmidi_substream *midi); struct snd_rawmidi_substream *midi);
......
This diff is collapsed.
...@@ -81,39 +81,22 @@ enum cip_sfc { ...@@ -81,39 +81,22 @@ enum cip_sfc {
CIP_SFC_COUNT CIP_SFC_COUNT
}; };
#define AM824_IN_PCM_FORMAT_BITS SNDRV_PCM_FMTBIT_S32
#define AM824_OUT_PCM_FORMAT_BITS (SNDRV_PCM_FMTBIT_S16 | \
SNDRV_PCM_FMTBIT_S32)
/*
* This module supports maximum 64 PCM channels for one PCM stream
* This is for our convenience.
*/
#define AM824_MAX_CHANNELS_FOR_PCM 64
/*
* AMDTP packet can include channels for MIDI conformant data.
* Each MIDI conformant data channel includes 8 MPX-MIDI data stream.
* Each MPX-MIDI data stream includes one data stream from/to MIDI ports.
*
* This module supports maximum 1 MIDI conformant data channels.
* Then this AMDTP packets can transfer maximum 8 MIDI data streams.
*/
#define AM824_MAX_CHANNELS_FOR_MIDI 1
struct fw_unit; struct fw_unit;
struct fw_iso_context; struct fw_iso_context;
struct snd_pcm_substream; struct snd_pcm_substream;
struct snd_pcm_runtime; struct snd_pcm_runtime;
struct snd_rawmidi_substream;
enum amdtp_stream_direction { enum amdtp_stream_direction {
AMDTP_OUT_STREAM = 0, AMDTP_OUT_STREAM = 0,
AMDTP_IN_STREAM AMDTP_IN_STREAM
}; };
struct amdtp_stream;
typedef unsigned int (*amdtp_stream_process_data_blocks_t)(
struct amdtp_stream *s,
__be32 *buffer,
unsigned int data_blocks,
unsigned int *syt);
struct amdtp_stream { struct amdtp_stream {
struct fw_unit *unit; struct fw_unit *unit;
enum cip_flags flags; enum cip_flags flags;
...@@ -156,32 +139,20 @@ struct amdtp_stream { ...@@ -156,32 +139,20 @@ struct amdtp_stream {
wait_queue_head_t callback_wait; wait_queue_head_t callback_wait;
struct amdtp_stream *sync_slave; struct amdtp_stream *sync_slave;
/* For AM824 processing. */ /* For backends to process data blocks. */
struct snd_rawmidi_substream *midi[AM824_MAX_CHANNELS_FOR_MIDI * 8]; void *protocol;
int midi_fifo_limit; amdtp_stream_process_data_blocks_t process_data_blocks;
int midi_fifo_used[AM824_MAX_CHANNELS_FOR_MIDI * 8];
unsigned int pcm_channels;
unsigned int midi_ports;
u8 pcm_positions[AM824_MAX_CHANNELS_FOR_PCM];
u8 midi_position;
void (*transfer_samples)(struct amdtp_stream *s,
struct snd_pcm_substream *pcm,
__be32 *buffer, unsigned int frames);
unsigned int frame_multiplier;
}; };
int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit, int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit,
enum amdtp_stream_direction dir, enum amdtp_stream_direction dir, enum cip_flags flags,
enum cip_flags flags, unsigned int fmt); unsigned int fmt,
amdtp_stream_process_data_blocks_t process_data_blocks,
unsigned int protocol_size);
void amdtp_stream_destroy(struct amdtp_stream *s); void amdtp_stream_destroy(struct amdtp_stream *s);
int amdtp_stream_set_parameters(struct amdtp_stream *s, int amdtp_stream_set_parameters(struct amdtp_stream *s, unsigned int rate,
unsigned int rate, unsigned int data_block_quadlets);
unsigned int pcm_channels,
unsigned int midi_ports);
unsigned int amdtp_stream_get_max_payload(struct amdtp_stream *s); unsigned int amdtp_stream_get_max_payload(struct amdtp_stream *s);
int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed); int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed);
...@@ -190,8 +161,7 @@ void amdtp_stream_stop(struct amdtp_stream *s); ...@@ -190,8 +161,7 @@ void amdtp_stream_stop(struct amdtp_stream *s);
int amdtp_stream_add_pcm_hw_constraints(struct amdtp_stream *s, int amdtp_stream_add_pcm_hw_constraints(struct amdtp_stream *s,
struct snd_pcm_runtime *runtime); struct snd_pcm_runtime *runtime);
void amdtp_am824_set_pcm_format(struct amdtp_stream *s,
snd_pcm_format_t format);
void amdtp_stream_pcm_prepare(struct amdtp_stream *s); void amdtp_stream_pcm_prepare(struct amdtp_stream *s);
unsigned long amdtp_stream_pcm_pointer(struct amdtp_stream *s); unsigned long amdtp_stream_pcm_pointer(struct amdtp_stream *s);
void amdtp_stream_pcm_abort(struct amdtp_stream *s); void amdtp_stream_pcm_abort(struct amdtp_stream *s);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment