#define CIP_FMT_AM 0x10
+/* "Clock-based rate control mode" is just supported. */
+#define AMDTP_FDF_AM824 0x00
+
+/**
+ * amdtp_am824_set_parameters - set stream parameters
+ * @s: the AMDTP stream to configure
+ * @rate: the sample rate
+ * @pcm_channels: the number of PCM samples in each data block, to be encoded
+ * as AM824 multi-bit linear audio
+ * @midi_ports: the number of MIDI ports (i.e., MPX-MIDI Data Channels)
+ * @double_pcm_frames: one data block transfers two PCM frames
+ *
+ * The parameters must be set before the stream is started, and must not be
+ * changed while the stream is running.
+ */
+int amdtp_am824_set_parameters(struct amdtp_stream *s, unsigned int rate,
+ unsigned int pcm_channels,
+ unsigned int midi_ports,
+ bool double_pcm_frames)
+{
+ int err;
+
+ err = amdtp_stream_set_parameters(s, rate, pcm_channels, midi_ports);
+ if (err < 0)
+ return err;
+
+ s->fdf = AMDTP_FDF_AM824 | s->sfc;
+
+ /*
+ * In IEC 61883-6, one data block represents one event. In ALSA, one
+ * event equals to one PCM frame. But Dice has a quirk at higher
+ * sampling rate to transfer two PCM frames in one data block.
+ */
+ if (double_pcm_frames)
+ s->frame_multiplier = 2;
+ else
+ s->frame_multiplier = 1;
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(amdtp_am824_set_parameters);
+
/**
* amdtp_am824_init - initialize an AMDTP stream structure to handle AM824
* data block
#include "amdtp-stream.h"
+int amdtp_am824_set_parameters(struct amdtp_stream *s, unsigned int rate,
+ unsigned int pcm_channels,
+ unsigned int midi_ports,
+ bool double_pcm_frames);
+
int amdtp_am824_init(struct amdtp_stream *s, struct fw_unit *unit,
enum amdtp_stream_direction dir, enum cip_flags flags);
#endif
#define CIP_SYT_MASK 0x0000ffff
#define CIP_SYT_NO_INFO 0xffff
-/*
- * Audio and Music transfer protocol specific parameters
- * only "Clock-based rate control mode" is supported
- */
+/* Audio and Music transfer protocol specific parameters */
#define CIP_FMT_AM 0x10
-#define AMDTP_FDF_AM824 0x00
#define AMDTP_FDF_NO_DATA 0xff
/* TODO: make these configurable */
int amdtp_stream_set_parameters(struct amdtp_stream *s,
unsigned int rate,
unsigned int pcm_channels,
- unsigned int midi_ports,
- bool double_pcm_frames)
+ unsigned int midi_ports)
{
unsigned int i, sfc, midi_channels;
s->data_block_quadlets = s->pcm_channels + midi_channels;
s->midi_ports = midi_ports;
- s->fdf = AMDTP_FDF_AM824 | s->sfc;
-
- /*
- * In IEC 61883-6, one data block represents one event. In ALSA, one
- * event equals to one PCM frame. But Dice has a quirk at higher
- * sampling rate to transfer two PCM frames in one data block.
- */
- if (double_pcm_frames)
- s->frame_multiplier = 2;
- else
- s->frame_multiplier = 1;
-
s->syt_interval = amdtp_syt_intervals[sfc];
/* default buffering in the device */
int amdtp_stream_set_parameters(struct amdtp_stream *s,
unsigned int rate,
unsigned int pcm_channels,
- unsigned int midi_ports,
- bool double_pcm_frames);
+ unsigned int midi_ports);
unsigned int amdtp_stream_get_max_payload(struct amdtp_stream *s);
int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed);
index = get_formation_index(rate);
pcm_channels = bebob->tx_stream_formations[index].pcm;
midi_channels = bebob->tx_stream_formations[index].midi;
- err = amdtp_stream_set_parameters(&bebob->tx_stream, rate,
- pcm_channels, midi_channels * 8,
- false);
+ err = amdtp_am824_set_parameters(&bebob->tx_stream, rate,
+ pcm_channels, midi_channels * 8,
+ false);
if (err < 0)
goto end;
pcm_channels = bebob->rx_stream_formations[index].pcm;
midi_channels = bebob->rx_stream_formations[index].midi;
- err = amdtp_stream_set_parameters(&bebob->rx_stream, rate,
- pcm_channels, midi_channels * 8,
- false);
+ err = amdtp_am824_set_parameters(&bebob->rx_stream, rate,
+ pcm_channels, midi_channels * 8,
+ false);
if (err < 0)
goto end;
pcm_chs *= 2;
}
- err = amdtp_stream_set_parameters(stream, rate, pcm_chs, midi_ports,
- false);
+ err = amdtp_am824_set_parameters(stream, rate, pcm_chs, midi_ports,
+ double_pcm_frames);
if (err < 0)
goto end;
midi_ports = efw->midi_in_ports;
}
- err = amdtp_stream_set_parameters(stream, sampling_rate,
- pcm_channels, midi_ports, false);
+ err = amdtp_am824_set_parameters(stream, sampling_rate,
+ pcm_channels, midi_ports, false);
if (err < 0)
goto end;
err = -EINVAL;
goto end;
}
- err = amdtp_stream_set_parameters(stream, rate,
- pcm_channels, midi_ports, false);
+ err = amdtp_am824_set_parameters(stream, rate, pcm_channels, midi_ports,
+ false);
if (err < 0)
goto end;