ALSA: emu10k1x: Define channel maps
authorTakashi Iwai <tiwai@suse.de>
Wed, 12 Sep 2012 13:52:47 +0000 (15:52 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 12 Sep 2012 13:52:47 +0000 (15:52 +0200)
Provide channel maps for individual stereo streams of emu10k1x.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/emu10k1/emu10k1x.c

index 5c8978b2c4d9b1486afb26566a40b384e48106b0..556fd6f456e36809af61c5156a062db67f3de386 100644 (file)
@@ -830,9 +830,22 @@ static irqreturn_t snd_emu10k1x_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
+static const struct snd_pcm_chmap_elem surround_map[] = {
+       { .channels = 2,
+         .map = { SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
+       { }
+};
+
+static const struct snd_pcm_chmap_elem clfe_map[] = {
+       { .channels = 2,
+         .map = { SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE } },
+       { }
+};
+
 static int __devinit snd_emu10k1x_pcm(struct emu10k1x *emu, int device, struct snd_pcm **rpcm)
 {
        struct snd_pcm *pcm;
+       const struct snd_pcm_chmap_elem *map = NULL;
        int err;
        int capture = 0;
   
@@ -861,12 +874,15 @@ static int __devinit snd_emu10k1x_pcm(struct emu10k1x *emu, int device, struct s
        switch(device) {
        case 0:
                strcpy(pcm->name, "EMU10K1X Front");
+               map = snd_pcm_std_chmaps;
                break;
        case 1:
                strcpy(pcm->name, "EMU10K1X Rear");
+               map = surround_map;
                break;
        case 2:
                strcpy(pcm->name, "EMU10K1X Center/LFE");
+               map = clfe_map;
                break;
        }
        emu->pcm = pcm;
@@ -875,6 +891,11 @@ static int __devinit snd_emu10k1x_pcm(struct emu10k1x *emu, int device, struct s
                                              snd_dma_pci_data(emu->pci), 
                                              32*1024, 32*1024);
   
+       err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, map, 2,
+                                    1 << 2, NULL);
+       if (err < 0)
+               return err;
+
        if (rpcm)
                *rpcm = pcm;