ALSA: oxygen: allow different number of PCM and mixer channels
authorClemens Ladisch <clemens@ladisch.de>
Mon, 10 Jan 2011 14:59:38 +0000 (15:59 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 10 Jan 2011 15:45:53 +0000 (16:45 +0100)
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: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/oxygen/oxygen.c
sound/pci/oxygen/oxygen.h
sound/pci/oxygen/oxygen_mixer.c
sound/pci/oxygen/oxygen_pcm.c
sound/pci/oxygen/xonar_cs43xx.c
sound/pci/oxygen/xonar_pcm179x.c
sound/pci/oxygen/xonar_wm87x6.c

index dc47977becaed89a6c33a814297438ccac4152dc..fe7ed4fc9f4627a23597f3e6da64c04eaab6f0a3 100644 (file)
@@ -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 ||
index b8fbc15b89a30ec8d1c11cdfcc158efca8ac707b..3d9535c2debb3d9e0c51de1543439caf688d7f3d 100644 (file)
@@ -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;
index 605e84b9e1ecbaea1820103ec53e87c8e7b10c6b..242c1cac69b80077ddb5ce5645acc217627b6181 100644 (file)
@@ -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))
index 60e4aa00c042a8fe166b209045bd56a21c05fd0a..dc3c68f76df495ec2421afa9822433ca36268314 100644 (file)
@@ -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)
index de32895b31720a7cb5ff5617f43d210f60c916dd..a25197ca39a15b05413d9b09c533239728093560 100644 (file)
@@ -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,
index bf357c01afd24d7e7fec6cc767f73b24a2cb5539..b55149e9be818b96724a569b21871ce4626cfc54 100644 (file)
@@ -1094,7 +1094,8 @@ static const struct oxygen_model model_xonar_d2 = {
                         MIDI_OUTPUT |
                         MIDI_INPUT |
                         AC97_CD_INPUT,
-       .dac_channels = 8,
+       .dac_channels_pcm = 8,
+       .dac_channels_mixer = 8,
        .dac_volume_min = 255 - 2*60,
        .dac_volume_max = 255,
        .misc_flags = OXYGEN_MISC_MIDI,
@@ -1127,7 +1128,8 @@ static const struct oxygen_model model_xonar_hdav = {
                         PLAYBACK_1_TO_SPDIF |
                         CAPTURE_0_FROM_I2S_2 |
                         CAPTURE_1_FROM_SPDIF,
-       .dac_channels = 8,
+       .dac_channels_pcm = 8,
+       .dac_channels_mixer = 2,
        .dac_volume_min = 255 - 2*60,
        .dac_volume_max = 255,
        .misc_flags = OXYGEN_MISC_MIDI,
@@ -1157,7 +1159,8 @@ static const struct oxygen_model model_xonar_st = {
                         PLAYBACK_1_TO_SPDIF |
                         CAPTURE_0_FROM_I2S_2 |
                         AC97_FMIC_SWITCH,
-       .dac_channels = 2,
+       .dac_channels_pcm = 2,
+       .dac_channels_mixer = 2,
        .dac_volume_min = 255 - 2*60,
        .dac_volume_max = 255,
        .function_flags = OXYGEN_FUNCTION_2WIRE,
@@ -1187,6 +1190,7 @@ int __devinit get_xonar_pcm179x_model(struct oxygen *chip,
                        break;
                case GPIO_DB_H6:
                        chip->model.shortname = "Xonar HDAV1.3+H6";
+                       chip->model.dac_channels_mixer = 8;
                        chip->model.private_data = 1;
                        break;
                }
@@ -1200,7 +1204,8 @@ int __devinit get_xonar_pcm179x_model(struct oxygen *chip,
                        break;
                case GPIO_DB_H6:
                        chip->model.shortname = "Xonar ST+H6";
-                       chip->model.dac_channels = 8;
+                       chip->model.dac_channels_pcm = 8;
+                       chip->model.dac_channels_mixer = 8;
                        chip->model.private_data = 1;
                        break;
                }
index 1705d1e93115a5d288c4993b85b086b961f247a9..da92cc24eed2525de0d0c7c064cfe63cfc80a4e2 100644 (file)
@@ -1135,7 +1135,8 @@ static const struct oxygen_model model_xonar_ds = {
        .device_config = PLAYBACK_0_TO_I2S |
                         PLAYBACK_1_TO_SPDIF |
                         CAPTURE_0_FROM_I2S_1,
-       .dac_channels = 8,
+       .dac_channels_pcm = 8,
+       .dac_channels_mixer = 8,
        .dac_volume_min = 255 - 2*60,
        .dac_volume_max = 255,
        .function_flags = OXYGEN_FUNCTION_SPI,