Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f4d7be7 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Takashi Iwai
Browse files

ALSA: oxygen: allow different number of PCM and mixer channels



For cards like the Xonar HDAV1.3, differentiate between the number of
PCM channels that can be played and the number of channels whose volume
can be adjusted.

Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3daa7ea6
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -185,7 +185,7 @@ static void ak4396_init(struct oxygen *chip)
{
	struct generic_data *data = chip->model_data;

	data->dacs = chip->model.dac_channels / 2;
	data->dacs = chip->model.dac_channels_pcm / 2;
	data->ak4396_regs[0][AK4396_CONTROL_2] =
		AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL;
	ak4396_registers_init(chip);
@@ -583,7 +583,8 @@ static const struct oxygen_model model_generic = {
			 CAPTURE_1_FROM_SPDIF |
			 CAPTURE_2_FROM_AC97_1 |
			 AC97_CD_INPUT,
	.dac_channels = 8,
	.dac_channels_pcm = 8,
	.dac_channels_mixer = 8,
	.dac_volume_min = 0,
	.dac_volume_max = 255,
	.function_flags = OXYGEN_FUNCTION_SPI |
@@ -643,7 +644,8 @@ static int __devinit get_oxygen_model(struct oxygen *chip,
					    PLAYBACK_1_TO_SPDIF;
		if (id->driver_data == MODEL_FANTASIA)
			chip->model.device_config |= CAPTURE_0_FROM_I2S_1;
		chip->model.dac_channels = 2;
		chip->model.dac_channels_pcm = 2;
		chip->model.dac_channels_mixer = 2;
		break;
	}
	if (id->driver_data == MODEL_MERIDIAN ||
+2 −1
Original line number Diff line number Diff line
@@ -100,7 +100,8 @@ struct oxygen_model {
	unsigned long private_data;
	size_t model_data_size;
	unsigned int device_config;
	u8 dac_channels;
	u8 dac_channels_pcm;
	u8 dac_channels_mixer;
	u8 dac_volume_min;
	u8 dac_volume_max;
	u8 misc_flags;
+4 −4
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ static int dac_volume_info(struct snd_kcontrol *ctl,
	struct oxygen *chip = ctl->private_data;

	info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
	info->count = chip->model.dac_channels;
	info->count = chip->model.dac_channels_mixer;
	info->value.integer.min = chip->model.dac_volume_min;
	info->value.integer.max = chip->model.dac_volume_max;
	return 0;
@@ -44,7 +44,7 @@ static int dac_volume_get(struct snd_kcontrol *ctl,
	unsigned int i;

	mutex_lock(&chip->mutex);
	for (i = 0; i < chip->model.dac_channels; ++i)
	for (i = 0; i < chip->model.dac_channels_mixer; ++i)
		value->value.integer.value[i] = chip->dac_volume[i];
	mutex_unlock(&chip->mutex);
	return 0;
@@ -59,7 +59,7 @@ static int dac_volume_put(struct snd_kcontrol *ctl,

	changed = 0;
	mutex_lock(&chip->mutex);
	for (i = 0; i < chip->model.dac_channels; ++i)
	for (i = 0; i < chip->model.dac_channels_mixer; ++i)
		if (value->value.integer.value[i] != chip->dac_volume[i]) {
			chip->dac_volume[i] = value->value.integer.value[i];
			changed = 1;
@@ -1022,7 +1022,7 @@ static int add_controls(struct oxygen *chip,
				continue;
		}
		if (!strcmp(template.name, "Stereo Upmixing") &&
		    chip->model.dac_channels == 2)
		    chip->model.dac_channels_pcm == 2)
			continue;
		if (!strcmp(template.name, "Mic Source Capture Enum") &&
		    !(chip->model.device_config & AC97_FMIC_SWITCH))
+1 −1
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ static int oxygen_open(struct snd_pcm_substream *substream,
		runtime->hw.rate_min = 44100;
		break;
	case PCM_MULTICH:
		runtime->hw.channels_max = chip->model.dac_channels;
		runtime->hw.channels_max = chip->model.dac_channels_pcm;
		break;
	}
	if (chip->model.pcm_hardware_filter)
+2 −1
Original line number Diff line number Diff line
@@ -426,7 +426,8 @@ static const struct oxygen_model model_xonar_d1 = {
			 PLAYBACK_1_TO_SPDIF |
			 CAPTURE_0_FROM_I2S_2 |
			 AC97_FMIC_SWITCH,
	.dac_channels = 8,
	.dac_channels_pcm = 8,
	.dac_channels_mixer = 8,
	.dac_volume_min = 127 - 60,
	.dac_volume_max = 127,
	.function_flags = OXYGEN_FUNCTION_2WIRE,
Loading