audio/chmap: add mp_iterate_builtin_layouts

Mostly useful for unit tests in order to access the channel
layouts from chmap which have mapped channels.
This commit is contained in:
Jan Ekström 2022-06-12 23:26:22 +03:00
parent 0411acf5f6
commit 8123adadbd
2 changed files with 32 additions and 0 deletions

View File

@ -470,6 +470,23 @@ char *mp_chmap_to_str_hr_buf(char *buf, size_t buf_size, const struct mp_chmap *
return mp_chmap_to_str_buf(buf, buf_size, &map);
}
mp_ch_layout_tuple *mp_iterate_builtin_layouts(void **opaque)
{
uintptr_t i = (uintptr_t)*opaque;
if (i >= MP_ARRAY_SIZE(std_layout_names) ||
!std_layout_names[i][0])
return NULL;
*opaque = (void *)(i + 1);
if (std_layout_names[i][1][0] == '\0') {
return mp_iterate_builtin_layouts(opaque);
}
return &std_layout_names[i];
}
void mp_chmap_print_help(struct mp_log *log)
{
mp_info(log, "Speakers:\n");

View File

@ -75,6 +75,8 @@ struct mp_chmap {
uint8_t speaker[MP_NUM_CHANNELS];
};
typedef const char * const (mp_ch_layout_tuple)[2];
#define MP_SP(speaker) MP_SPEAKER_ID_ ## speaker
#define MP_CHMAP2(a, b) \
@ -129,6 +131,19 @@ char *mp_chmap_to_str_hr_buf(char *buf, size_t buf_size, const struct mp_chmap *
bool mp_chmap_from_str(struct mp_chmap *dst, bstr src);
/**
* Iterate over all built-in channel layouts which have mapped channels.
*
* @param opaque a pointer where the iteration state is stored. Must point
* to nullptr to start the iteration.
*
* @return nullptr when the iteration is finished.
* Otherwise a pointer to an array of two char pointers.
* - [0] being the human-readable layout name.
* - [1] being the string representation of the layout.
*/
mp_ch_layout_tuple *mp_iterate_builtin_layouts(void **opaque);
struct mp_log;
void mp_chmap_print_help(struct mp_log *log);