]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ALSA: ctxfi: Implement channel maps
authorTakashi Iwai <tiwai@suse.de>
Fri, 3 Aug 2012 16:03:17 +0000 (18:03 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 6 Sep 2012 16:08:33 +0000 (18:08 +0200)
Assign the multi-channel map to front PCM, and other channel map to
each other channel PCM.

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

index d021876901bb63ce48a7559c29043a7122a95c6d..6c191429b126f1be9779539facd4982974d4687a 100644 (file)
@@ -395,12 +395,38 @@ static struct snd_pcm_ops ct_pcm_capture_ops = {
        .page           = snd_pcm_sgbuf_ops_page,
 };
 
+static const struct snd_pcm_chmap_elem surround_map[] = {
+       { .channels = 1,
+         .map = { SNDRV_CHMAP_RC } },
+       { .channels = 2,
+         .map = { SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
+       { }
+};
+
+static const struct snd_pcm_chmap_elem clfe_map[] = {
+       { .channels = 1,
+         .map = { SNDRV_CHMAP_FC } },
+       { .channels = 2,
+         .map = { SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE } },
+       { }
+};
+
+static const struct snd_pcm_chmap_elem side_map[] = {
+       { .channels = 1,
+         .map = { SNDRV_CHMAP_RC } },
+       { .channels = 2,
+         .map = { SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } },
+       { }
+};
+
 /* Create ALSA pcm device */
 int ct_alsa_pcm_create(struct ct_atc *atc,
                       enum CTALSADEVS device,
                       const char *device_name)
 {
        struct snd_pcm *pcm;
+       const struct snd_pcm_chmap_elem *map;
+       int chs;
        int err;
        int playback_count, capture_count;
 
@@ -427,6 +453,30 @@ int ct_alsa_pcm_create(struct ct_atc *atc,
        snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
                        snd_dma_pci_data(atc->pci), 128*1024, 128*1024);
 
+       chs = 2;
+       switch (device) {
+       case FRONT:
+               chs = 8;
+               map = snd_pcm_std_chmaps;
+               break;
+       case SURROUND:
+               map = surround_map;
+               break;
+       case CLFE:
+               map = clfe_map;
+               break;
+       case SIDE:
+               map = side_map;
+               break;
+       default:
+               map = snd_pcm_std_chmaps;
+               break;
+       }
+       err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, map, chs,
+                                    0, NULL);
+       if (err < 0)
+               return err;
+
 #ifdef CONFIG_PM_SLEEP
        atc->pcms[device] = pcm;
 #endif