Skip to content

Commit

Permalink
[ALSA] oxygen: make line-in switch exclusive
Browse files Browse the repository at this point in the history
The line input cannot be mixed with the other inputs, so we have to mute
the other input switches when it is selected.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
  • Loading branch information
Clemens Ladisch authored and Jaroslav Kysela committed Jan 31, 2008
1 parent 01a3aff commit 893e44b
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 1 deletion.
4 changes: 4 additions & 0 deletions sound/pci/oxygen/oxygen.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
enum {
CONTROL_SPDIF_PCM,
CONTROL_SPDIF_INPUT_BITS,
CONTROL_MIC_CAPTURE_SWITCH,
CONTROL_LINE_CAPTURE_SWITCH,
CONTROL_CD_CAPTURE_SWITCH,
CONTROL_AUX_CAPTURE_SWITCH,
CONTROL_COUNT
};

Expand Down
30 changes: 29 additions & 1 deletion sound/pci/oxygen/oxygen_mixer.c
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,19 @@ static int ac97_switch_get(struct snd_kcontrol *ctl,
return 0;
}

static void ac97_mute_ctl(struct oxygen *chip, unsigned int control)
{
unsigned int index = chip->controls[control]->private_value & 0xff;
u16 value;

value = oxygen_read_ac97(chip, 0, index);
if (!(value & 0x8000)) {
oxygen_write_ac97(chip, 0, index, value | 0x8000);
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
&chip->controls[control]->id);
}
}

static int ac97_switch_put(struct snd_kcontrol *ctl,
struct snd_ctl_elem_value *value)
{
Expand All @@ -422,9 +435,20 @@ static int ac97_switch_put(struct snd_kcontrol *ctl,
change = newreg != oldreg;
if (change) {
oxygen_write_ac97(chip, 0, index, newreg);
if (index == AC97_LINE)
if (index == AC97_LINE) {
oxygen_write_ac97_masked(chip, 0, 0x72,
!!(newreg & 0x8000), 0x0001);
if (!(newreg & 0x8000)) {
ac97_mute_ctl(chip, CONTROL_MIC_CAPTURE_SWITCH);
ac97_mute_ctl(chip, CONTROL_CD_CAPTURE_SWITCH);
ac97_mute_ctl(chip, CONTROL_AUX_CAPTURE_SWITCH);
}
} else if ((index == AC97_MIC || index == AC97_CD ||
index == AC97_VIDEO || index == AC97_AUX) &&
bitnr == 15 && !(newreg & 0x8000)) {
ac97_mute_ctl(chip, CONTROL_LINE_CAPTURE_SWITCH);
oxygen_write_ac97_masked(chip, 0, 0x72, 0x0001, 0x0001);
}
}
mutex_unlock(&chip->mutex);
return change;
Expand Down Expand Up @@ -600,6 +624,10 @@ int oxygen_mixer_init(struct oxygen *chip)
SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM),
[CONTROL_SPDIF_INPUT_BITS] =
SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
[CONTROL_MIC_CAPTURE_SWITCH] = "Mic Capture Switch",
[CONTROL_LINE_CAPTURE_SWITCH] = "Line Capture Switch",
[CONTROL_CD_CAPTURE_SWITCH] = "CD Capture Switch",
[CONTROL_AUX_CAPTURE_SWITCH] = "Aux Capture Switch",
};
unsigned int i, j;
struct snd_kcontrol *ctl;
Expand Down

0 comments on commit 893e44b

Please sign in to comment.