OSDN Git Service

Add SND_CHMAP_NA and bit flag definitions
authorTakashi Iwai <tiwai@suse.de>
Fri, 31 Aug 2012 20:53:22 +0000 (13:53 -0700)
committerTakashi Iwai <tiwai@suse.de>
Thu, 13 Sep 2012 06:24:58 +0000 (08:24 +0200)
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/pcm.h
include/sound/asound.h
test/chmap.c

index 22194fc..ee89a7e 100644 (file)
@@ -504,9 +504,14 @@ enum snd_pcm_chmap_position {
        SND_CHMAP_FCH,          /** front center high */
        SND_CHMAP_FRH,          /** front right high */
        SND_CHMAP_TC,           /** top center */
-       SND_CHMAP_LAST = SND_CHMAP_TC,  /** last entry */
+       SND_CHMAP_NA,           /** N/A, silent */
+       SND_CHMAP_LAST = SND_CHMAP_NA,  /** last entry */
 };
 
+#define SND_CHMAP_POSITION_MASK                0xffff /** bitmask for channel position */
+#define SND_CHMAP_PHASE_INVERSE                (0x01 << 16) /* the channel is phase inverted */
+#define SND_CHMAP_DRIVER_SPEC          (0x02 << 16) /* non-standard channel value */
+
 int **snd_pcm_query_chmaps(snd_pcm_t *pcm);
 void snd_pcm_free_chmaps(int **maps);
 int *snd_pcm_get_chmap(snd_pcm_t *pcm);
index bb6db9d..cb1b9c5 100644 (file)
@@ -479,7 +479,7 @@ enum {
 
 /* channel positions */
 enum {
-       /* this follows the alsa-lib mixer channel value + 1*/
+       /* this follows the alsa-lib mixer channel value + 1 */
        SNDRV_CHMAP_UNKNOWN = 0,
        SNDRV_CHMAP_FL,         /* front left */
        SNDRV_CHMAP_FR,         /* front right */
@@ -501,9 +501,14 @@ enum {
        SNDRV_CHMAP_FCH,        /* front center high */
        SNDRV_CHMAP_FRH,        /* front right high */
        SNDRV_CHMAP_TC,         /* top center */
-       SNDRV_CHMAP_LAST = SNDRV_CHMAP_TC,
+       SNDRV_CHMAP_NA,         /* N/A, silent */
+       SNDRV_CHMAP_LAST = SNDRV_CHMAP_NA,
 };
 
+#define SNDRV_CHMAP_POSITION_MASK      0xffff
+#define SNDRV_CHMAP_PHASE_INVERSE      (0x01 << 16)
+#define SNDRV_CHMAP_DRIVER_SPEC                (0x02 << 16)
+
 enum {
        SNDRV_PCM_IOCTL_PVERSION = _IOR('A', 0x00, int),
        SNDRV_PCM_IOCTL_INFO = _IOR('A', 0x01, struct sndrv_pcm_info),
index ce665c4..c4d4b35 100644 (file)
@@ -25,7 +25,8 @@ static const char * const chname[] = {
        "Unknown",
        "FL", "FR", "RL", "RR", "FC", "LFE", "SL", "SR", "RC",
        "FLC", "FRC", "RLC", "RRC", "FLW", "FRW", "FLH",
-       "FCH", "FCH", "FRH", "TC"
+       "FCH", "FCH", "FRH", "TC",
+       "N/A",
 };
 
 #define ARRAY_SIZE(x)  (sizeof(x) / sizeof(x[0]))
@@ -36,10 +37,15 @@ static void print_channels(int channels, int *map)
        printf("  ");
        for (i = 0; i < channels; i++) {
                unsigned int c = *map++;
-               if (c >= ARRAY_SIZE(chname))
-                       printf(" Ch%d", c);
+               unsigned int pos = c & SND_CHMAP_POSITION_MASK;
+               if (c & SND_CHMAP_DRIVER_SPEC)
+                       printf(" %d", p);
+               else if (p >= ARRAY_SIZE(chname))
+                       printf(" Ch%d", p);
                else
-                       printf(" %s", chname[c]);
+                       printf(" %s", chname[p]);
+               if (c & SND_CHMAP_PHASE_INVERSE)
+                       printf("[INV]");
        }
        printf("\n");
 }