ALSA: dice: fix wrong channel mappping at higher sampling rate
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Fri, 29 Aug 2014 04:40:44 +0000 (13:40 +0900)
committerTakashi Iwai <tiwai@suse.de>
Fri, 29 Aug 2014 07:51:45 +0000 (09:51 +0200)
The channel mapping is initialized by amdtp_stream_set_parameters(), however
Dice driver set it before calling this function. Furthermore, the setting is
wrong because the index is the value of array, and vice versa.

This commit moves codes for channel mapping after the function and set it correctly.

Reported-by: Daniel Robbins <drobbins@funtoo.org>
Fixes: 10550bea44a8 ("ALSA: dice/firewire-lib: Keep dualwire mode but obsolete CIP_HI_DUALWIRE")
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Cc: <stable@vger.kernel.org> # 3.16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/dice.c

index a9a30c0161f17be87e9c79403d1c913f85ab4c86..4cf8eb704045995a36ae65e20129a1f2ccc21a75 100644 (file)
@@ -579,11 +579,6 @@ static int dice_hw_params(struct snd_pcm_substream *substream,
                        return err;
                }
 
-               for (i = 0; i < channels; i++) {
-                       dice->stream.pcm_positions[i * 2] = i;
-                       dice->stream.pcm_positions[i * 2 + 1] = i + channels;
-               }
-
                rate /= 2;
                channels *= 2;
        }
@@ -591,6 +586,15 @@ static int dice_hw_params(struct snd_pcm_substream *substream,
        mode = rate_index_to_mode(rate_index);
        amdtp_stream_set_parameters(&dice->stream, rate, channels,
                                    dice->rx_midi_ports[mode]);
+       if (rate_index > 4) {
+               channels /= 2;
+
+               for (i = 0; i < channels; i++) {
+                       dice->stream.pcm_positions[i] = i * 2;
+                       dice->stream.pcm_positions[i + channels] = i * 2 + 1;
+               }
+       }
+
        amdtp_stream_set_pcm_format(&dice->stream,
                                    params_format(hw_params));