diff options
-rw-r--r-- | include/pcm.h | 7 | ||||
-rw-r--r-- | include/sound/asound.h | 9 | ||||
-rw-r--r-- | test/chmap.c | 14 |
3 files changed, 23 insertions, 7 deletions
diff --git a/include/pcm.h b/include/pcm.h index 22194fcd..ee89a7ea 100644 --- a/include/pcm.h +++ b/include/pcm.h @@ -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); diff --git a/include/sound/asound.h b/include/sound/asound.h index bb6db9d2..cb1b9c58 100644 --- a/include/sound/asound.h +++ b/include/sound/asound.h @@ -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), diff --git a/test/chmap.c b/test/chmap.c index ce665c4c..c4d4b351 100644 --- a/test/chmap.c +++ b/test/chmap.c @@ -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"); } |