diff options
author | Jaroslav Kysela <perex@suse.cz> | 2006-01-18 02:02:24 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-03-22 04:26:21 -0500 |
commit | 5a25c5cfd4f61f514decca3c4106210fb168ce19 (patch) | |
tree | b79f15c8dd90d682233c231b43ce0ed932a5b126 /sound/pci/ymfpci/ymfpci_main.c | |
parent | 12aa757905d09b1dc2c1c3d0de3fa8f4c9726f2b (diff) |
[ALSA] ymfpci - make rear channel swap optional
Modules: YMFPCI driver
Added rear_swap module option / kernel parameter to configure the rear
channel swapping. Default value is enable to make the AC3 passthrough
working, but analog only users might revert the previous behaviour.
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Diffstat (limited to 'sound/pci/ymfpci/ymfpci_main.c')
-rw-r--r-- | sound/pci/ymfpci/ymfpci_main.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c index 30ee53adb494..8ac5ab50b5c7 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c | |||
@@ -536,19 +536,30 @@ static void snd_ymfpci_pcm_init_voice(struct snd_ymfpci_pcm *ypcm, unsigned int | |||
536 | } | 536 | } |
537 | } | 537 | } |
538 | if (ypcm->output_rear) { | 538 | if (ypcm->output_rear) { |
539 | /* The SPDIF out channels seem to be swapped, so we have | 539 | if (!ypcm->swap_rear) { |
540 | * to swap them here, too. The rear analog out channels | 540 | if (use_left) { |
541 | * will be wrong, but otherwise AC3 would not work. | 541 | bank->eff2_gain = |
542 | */ | 542 | bank->eff2_gain_end = vol_left; |
543 | if (use_left) { | 543 | } |
544 | bank->eff3_gain = | 544 | if (use_right) { |
545 | bank->eff3_gain_end = vol_left; | 545 | bank->eff3_gain = |
546 | } | 546 | bank->eff3_gain_end = vol_right; |
547 | if (use_right) { | 547 | } |
548 | bank->eff2_gain = | 548 | } else { |
549 | bank->eff2_gain_end = vol_right; | 549 | /* The SPDIF out channels seem to be swapped, so we have |
550 | } | 550 | * to swap them here, too. The rear analog out channels |
551 | } | 551 | * will be wrong, but otherwise AC3 would not work. |
552 | */ | ||
553 | if (use_left) { | ||
554 | bank->eff3_gain = | ||
555 | bank->eff3_gain_end = vol_left; | ||
556 | } | ||
557 | if (use_right) { | ||
558 | bank->eff2_gain = | ||
559 | bank->eff2_gain_end = vol_right; | ||
560 | } | ||
561 | } | ||
562 | } | ||
552 | } | 563 | } |
553 | } | 564 | } |
554 | 565 | ||
@@ -898,6 +909,7 @@ static int snd_ymfpci_playback_open(struct snd_pcm_substream *substream) | |||
898 | ypcm = runtime->private_data; | 909 | ypcm = runtime->private_data; |
899 | ypcm->output_front = 1; | 910 | ypcm->output_front = 1; |
900 | ypcm->output_rear = chip->mode_dup4ch ? 1 : 0; | 911 | ypcm->output_rear = chip->mode_dup4ch ? 1 : 0; |
912 | ypcm->swap_rear = chip->rear_swap; | ||
901 | spin_lock_irq(&chip->reg_lock); | 913 | spin_lock_irq(&chip->reg_lock); |
902 | if (ypcm->output_rear) { | 914 | if (ypcm->output_rear) { |
903 | ymfpci_open_extension(chip); | 915 | ymfpci_open_extension(chip); |
@@ -1738,7 +1750,7 @@ static void snd_ymfpci_mixer_free_ac97(struct snd_ac97 *ac97) | |||
1738 | chip->ac97 = NULL; | 1750 | chip->ac97 = NULL; |
1739 | } | 1751 | } |
1740 | 1752 | ||
1741 | int __devinit snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch) | 1753 | int __devinit snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch, int rear_swap) |
1742 | { | 1754 | { |
1743 | struct snd_ac97_template ac97; | 1755 | struct snd_ac97_template ac97; |
1744 | struct snd_kcontrol *kctl; | 1756 | struct snd_kcontrol *kctl; |
@@ -1750,6 +1762,7 @@ int __devinit snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch) | |||
1750 | .read = snd_ymfpci_codec_read, | 1762 | .read = snd_ymfpci_codec_read, |
1751 | }; | 1763 | }; |
1752 | 1764 | ||
1765 | chip->rear_swap = rear_swap; | ||
1753 | if ((err = snd_ac97_bus(chip->card, 0, &ops, chip, &chip->ac97_bus)) < 0) | 1766 | if ((err = snd_ac97_bus(chip->card, 0, &ops, chip, &chip->ac97_bus)) < 0) |
1754 | return err; | 1767 | return err; |
1755 | chip->ac97_bus->private_free = snd_ymfpci_mixer_free_ac97_bus; | 1768 | chip->ac97_bus->private_free = snd_ymfpci_mixer_free_ac97_bus; |
@@ -2297,6 +2310,7 @@ int __devinit snd_ymfpci_create(struct snd_card *card, | |||
2297 | return -EIO; | 2310 | return -EIO; |
2298 | } | 2311 | } |
2299 | 2312 | ||
2313 | chip->rear_swap = 1; | ||
2300 | if ((err = snd_ymfpci_ac3_init(chip)) < 0) { | 2314 | if ((err = snd_ymfpci_ac3_init(chip)) < 0) { |
2301 | snd_ymfpci_free(chip); | 2315 | snd_ymfpci_free(chip); |
2302 | return err; | 2316 | return err; |