ALSA: firewire-lib: rename parameter setting function for AM824 with FDF field
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sat, 19 Sep 2015 02:21:56 +0000 (11:21 +0900)
committerTakashi Iwai <tiwai@suse.de>
Tue, 29 Sep 2015 10:48:02 +0000 (12:48 +0200)
The value of FDF field in CIP header is protocol-dependent. Thus, it's
better to allow data block processing layer to decide the value in any
timing.

In AM824 data format, the value of FDF field in CIP header indicates
N-flag and Nominal Sampling Frequency Code (sfc). The N-flag is for
switching 'Clock-based rate control mode' and 'Command-based rate control
mode'. In our implementation, 'Clock-based rate control mode' is just
supported. Therefore, When sampling transfer frequency is decided, then
the FDF can be set.

This commit replaces 'amdtp_stream_set_parameters' with
'amdtp_am824_set_parameters' to set the FDF. This is the same timing
to decide the ration between the number of data blocks and the number of
PCM frames.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/amdtp-am824.c
sound/firewire/amdtp-am824.h
sound/firewire/amdtp-stream.c
sound/firewire/amdtp-stream.h
sound/firewire/bebob/bebob_stream.c
sound/firewire/dice/dice-stream.c
sound/firewire/fireworks/fireworks_stream.c
sound/firewire/oxfw/oxfw-stream.c

index da4b643eff4066df7d1b3ed6a5fe7743bf60f8d2..f5edcbfa315788d0eae7a8cb5b32d5a37b88056d 100644 (file)
 
 #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
index ed96ac56628fab81552ca8612f6eae781d038caf..cfc0d61e0db40da10f4752a8af89b6b7030a07b7 100644 (file)
@@ -3,6 +3,11 @@
 
 #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
index 2254eec4521b998716249dae6c22d65a58cbde5e..53d84e9bf24194fc6fae68b7f4b8854f24883656 100644 (file)
 #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 */
@@ -204,8 +200,7 @@ EXPORT_SYMBOL(amdtp_stream_add_pcm_hw_constraints);
 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;
 
@@ -228,18 +223,6 @@ int amdtp_stream_set_parameters(struct amdtp_stream *s,
        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 */
index 5f96affe37b754d597a35d5d51e83632e55ce2d9..d915940a14c96cd18ff2055bd04ae3dd88f425c4 100644 (file)
@@ -181,8 +181,7 @@ void amdtp_stream_destroy(struct amdtp_stream *s);
 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 34bc3a419993491dde0dd1c9b08c094d5bbfe23b..fa510f30cf8f1645fb71ada341210a1537531e50 100644 (file)
@@ -427,17 +427,17 @@ make_both_connections(struct snd_bebob *bebob, unsigned int rate)
        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;
 
index 917860e88b66367be3ac73fb1705a239828cd67f..89483818785e97200621fe6d5e8e7d3d8bfae47c 100644 (file)
@@ -132,8 +132,8 @@ static int start_stream(struct snd_dice *dice, struct amdtp_stream *stream,
                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;
 
index 8cac5b987cc1cab2a8955df20940d689fdf13c86..759f6e3ed44ab08fb8d480b63dacf135ca734bab 100644 (file)
@@ -73,8 +73,8 @@ start_stream(struct snd_efw *efw, struct amdtp_stream *stream,
                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;
 
index 83683414793fae4e5f8759cddbf1d824dfdf196b..4982befc9c25317196d5656a25bf0622ab6bc083 100644 (file)
@@ -155,8 +155,8 @@ static int start_stream(struct snd_oxfw *oxfw, struct amdtp_stream *stream,
                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;