aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2014-08-29 00:40:44 -0400
committerTakashi Iwai <tiwai@suse.de>2014-08-29 03:51:45 -0400
commit1033eb5b5aeeb526c22068e0fb0cef9f3c14231e (patch)
tree06687fcaf8d15607bf356fd9c164abb1ecfc4489
parent1a22e7758eabc431d6d8af085dc6e4c5031779a6 (diff)
ALSA: dice: fix wrong channel mappping at higher sampling rate
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>
-rw-r--r--sound/firewire/dice.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/sound/firewire/dice.c b/sound/firewire/dice.c
index a9a30c0161f1..4cf8eb704045 100644
--- a/sound/firewire/dice.c
+++ b/sound/firewire/dice.c
@@ -579,11 +579,6 @@ static int dice_hw_params(struct snd_pcm_substream *substream,
579 return err; 579 return err;
580 } 580 }
581 581
582 for (i = 0; i < channels; i++) {
583 dice->stream.pcm_positions[i * 2] = i;
584 dice->stream.pcm_positions[i * 2 + 1] = i + channels;
585 }
586
587 rate /= 2; 582 rate /= 2;
588 channels *= 2; 583 channels *= 2;
589 } 584 }
@@ -591,6 +586,15 @@ static int dice_hw_params(struct snd_pcm_substream *substream,
591 mode = rate_index_to_mode(rate_index); 586 mode = rate_index_to_mode(rate_index);
592 amdtp_stream_set_parameters(&dice->stream, rate, channels, 587 amdtp_stream_set_parameters(&dice->stream, rate, channels,
593 dice->rx_midi_ports[mode]); 588 dice->rx_midi_ports[mode]);
589 if (rate_index > 4) {
590 channels /= 2;
591
592 for (i = 0; i < channels; i++) {
593 dice->stream.pcm_positions[i] = i * 2;
594 dice->stream.pcm_positions[i + channels] = i * 2 + 1;
595 }
596 }
597
594 amdtp_stream_set_pcm_format(&dice->stream, 598 amdtp_stream_set_pcm_format(&dice->stream,
595 params_format(hw_params)); 599 params_format(hw_params));
596 600