common: Remove legacy from converter, parse channels as values.

This commit is contained in:
Juho Hämäläinen 2022-02-23 10:59:08 +02:00
parent c02f917ebb
commit 1ac75ed3b0
2 changed files with 57 additions and 70 deletions

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2013-2018 Jolla Ltd. * Copyright (C) 2013-2022 Jolla Ltd.
* *
* Contact: Juho Hämäläinen <juho.hamalainen@jolla.com> * Contact: Juho Hämäläinen <juho.hamalainen@jolla.com>
* *
@ -55,7 +55,7 @@ CONVERT_FUNC(format);
CONVERT_FUNC(output_channel); CONVERT_FUNC(output_channel);
CONVERT_FUNC(input_channel); CONVERT_FUNC(input_channel);
#define value_separator(legacy) (legacy ? "|" : ",") #define VALUE_SEPARATOR ","
static bool string_convert_num_to_str(const struct string_conversion *list, const uint32_t value, const char **to_str) { static bool string_convert_num_to_str(const struct string_conversion *list, const uint32_t value, const char **to_str) {
pa_assert(list); pa_assert(list);
@ -88,18 +88,7 @@ static char *list_string(struct string_conversion *list, uint32_t flags) {
char *str = NULL; char *str = NULL;
char *tmp; char *tmp;
#if AUDIO_API_VERSION_MAJ >= 2
if (flags & AUDIO_DEVICE_BIT_IN)
flags &= ~AUDIO_DEVICE_BIT_IN;
#endif
for (unsigned int i = 0; list[i].str; i++) { for (unsigned int i = 0; list[i].str; i++) {
#if AUDIO_API_VERSION_MAJ >= 2
if (list[i].value & AUDIO_DEVICE_BIT_IN) {
if (popcount(list[i].value & ~AUDIO_DEVICE_BIT_IN) != 1)
continue;
} else
#endif
if (popcount(list[i].value) != 1) if (popcount(list[i].value) != 1)
continue; continue;
@ -189,10 +178,6 @@ bool pa_string_convert_output_device_str_to_num(const char *str, audio_devices_t
return string_convert_str_to_num(string_conversion_table_output_device, str, (uint32_t*) to_value); return string_convert_str_to_num(string_conversion_table_output_device, str, (uint32_t*) to_value);
} }
char *pa_list_string_output_device(audio_devices_t devices) {
return list_string(string_conversion_table_output_device, devices);
}
/* Input device */ /* Input device */
bool pa_string_convert_input_device_num_to_str(audio_devices_t value, const char **to_str) { bool pa_string_convert_input_device_num_to_str(audio_devices_t value, const char **to_str) {
return string_convert_num_to_str(string_conversion_table_input_device, (uint32_t) value, to_str); return string_convert_num_to_str(string_conversion_table_input_device, (uint32_t) value, to_str);
@ -202,10 +187,6 @@ bool pa_string_convert_input_device_str_to_num(const char *str, audio_devices_t
return string_convert_str_to_num(string_conversion_table_input_device, str, (uint32_t*) to_value); return string_convert_str_to_num(string_conversion_table_input_device, str, (uint32_t*) to_value);
} }
char *pa_list_string_input_device(audio_devices_t devices) {
return list_string(string_conversion_table_input_device, devices);
}
/* Flags */ /* Flags */
bool pa_string_convert_flag_num_to_str(audio_output_flags_t value, const char **to_str) { bool pa_string_convert_flag_num_to_str(audio_output_flags_t value, const char **to_str) {
return string_convert_num_to_str(string_conversion_table_output_flag, (uint32_t) value, to_str); return string_convert_num_to_str(string_conversion_table_output_flag, (uint32_t) value, to_str);
@ -221,13 +202,9 @@ char *pa_list_string_flags(audio_output_flags_t flags) {
bool pa_input_device_default_audio_source(audio_devices_t input_device, audio_source_t *default_source) bool pa_input_device_default_audio_source(audio_devices_t input_device, audio_source_t *default_source)
{ {
#if AUDIO_API_VERSION_MAJ >= 2
input_device &= ~AUDIO_DEVICE_BIT_IN;
#endif
/* Note converting HAL values to different HAL values! */ /* Note converting HAL values to different HAL values! */
for (unsigned int i = 0; i < sizeof(conversion_table_default_audio_source) / (sizeof(uint32_t) * 2); i++) { for (unsigned int i = 0; i < sizeof(conversion_table_default_audio_source) / (sizeof(uint32_t) * 2); i++) {
if (conversion_table_default_audio_source[i][0] & input_device) { if (conversion_table_default_audio_source[i][0] == input_device) {
*default_source = conversion_table_default_audio_source[i][1]; *default_source = conversion_table_default_audio_source[i][1];
return true; return true;
} }
@ -321,7 +298,7 @@ int pa_conversion_parse_list(pa_conversion_string_t type, const char *separator,
} }
bool pa_conversion_parse_sampling_rates(const char *fn, const unsigned ln, bool pa_conversion_parse_sampling_rates(const char *fn, const unsigned ln,
const char *str, bool legacy, const char *str,
uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]) { uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]) {
pa_assert(fn); pa_assert(fn);
pa_assert(str); pa_assert(str);
@ -330,16 +307,14 @@ bool pa_conversion_parse_sampling_rates(const char *fn, const unsigned ln,
const char *state = NULL; const char *state = NULL;
uint32_t pos = 0; uint32_t pos = 0;
while ((entry = pa_split(str, value_separator(legacy), &state))) { while ((entry = pa_split(str, VALUE_SEPARATOR, &state))) {
int32_t val; int32_t val;
#if AUDIO_API_VERSION_MAJ >= 3
if (pos == 0 && pa_streq(entry, "dynamic")) { if (pos == 0 && pa_streq(entry, "dynamic")) {
sampling_rates[pos++] = (uint32_t) -1; sampling_rates[pos++] = (uint32_t) -1;
pa_xfree(entry); pa_xfree(entry);
break; break;
} }
#endif
if (pos == AUDIO_MAX_SAMPLING_RATES) { if (pos == AUDIO_MAX_SAMPLING_RATES) {
pa_log("[%s:%u] Too many sample rate entries (> %d)", fn, ln, AUDIO_MAX_SAMPLING_RATES); pa_log("[%s:%u] Too many sample rate entries (> %d)", fn, ln, AUDIO_MAX_SAMPLING_RATES);
@ -389,7 +364,7 @@ static bool check_and_log(const char *fn, const unsigned ln, const char *field,
} }
bool pa_conversion_parse_formats(const char *fn, const unsigned ln, bool pa_conversion_parse_formats(const char *fn, const unsigned ln,
const char *str, bool legacy, const char *str,
audio_format_t *formats) { audio_format_t *formats) {
int count; int count;
char *unknown = NULL; char *unknown = NULL;
@ -398,18 +373,13 @@ bool pa_conversion_parse_formats(const char *fn, const unsigned ln,
pa_assert(str); pa_assert(str);
pa_assert(formats); pa_assert(formats);
#if AUDIO_API_VERSION_MAJ >= 3
/* Needs to be probed later */ /* Needs to be probed later */
if (pa_streq(str, "dynamic")) { if (pa_streq(str, "dynamic")) {
*formats = 0; *formats = 0;
return true; return true;
} }
#endif
count = pa_conversion_parse_list(CONV_STRING_FORMAT, value_separator(legacy), str, formats, &unknown); count = pa_conversion_parse_list(CONV_STRING_FORMAT, VALUE_SEPARATOR, str, formats, &unknown);
if (legacy)
return check_and_log(fn, ln, "formats", count, str, unknown, false);
/* As the new XML configuration lists formats as one per profile, unknown /* As the new XML configuration lists formats as one per profile, unknown
* formats will cause the parser to quit. As a workaround for non-legacy * formats will cause the parser to quit. As a workaround for non-legacy
@ -420,23 +390,46 @@ bool pa_conversion_parse_formats(const char *fn, const unsigned ln,
static int parse_channels(const char *fn, const unsigned ln, static int parse_channels(const char *fn, const unsigned ln,
const char *str, bool in_output, const char *str, bool in_output,
bool legacy, audio_channel_mask_t *channels) { audio_channel_mask_t channel_masks[AUDIO_MAX_CHANNEL_MASKS]) {
int count;
bool success; bool success;
int count = 0;
char *unknown = NULL; char *unknown = NULL;
char *entry;
const char *state = NULL;
pa_assert(fn); pa_assert(fn);
pa_assert(str); pa_assert(str);
pa_assert(channels);
/* Needs to be probed later */ /* Needs to be probed later */
if (pa_streq(str, "dynamic")) { if (pa_streq(str, "dynamic")) {
*channels = 0; channel_masks[0] = 0;
return 1; return 1;
} }
count = pa_conversion_parse_list(in_output ? CONV_STRING_OUTPUT_CHANNELS : CONV_STRING_INPUT_CHANNELS, while ((entry = pa_split(str, VALUE_SEPARATOR, &state))) {
value_separator(legacy), str, channels, &unknown); uint32_t val;
if (count == AUDIO_MAX_CHANNEL_MASKS) {
pa_log("[%s:%u] Too many channel mask entries (> %d)", fn, ln, AUDIO_MAX_CHANNEL_MASKS);
pa_xfree(entry);
return false;
}
if (!string_convert_str_to_num(in_output ? string_conversion_table_output_channels
: string_conversion_table_input_channels,
entry,
&val)) {
pa_log_debug("[%s:%u] Ignore unknown channel mask value %s", fn, ln, entry);
pa_xfree(entry);
continue;
}
channel_masks[count++] = val;
pa_xfree(entry);
}
channel_masks[count] = 0;
/* Avoid aborting parsing when no supported channel is found */ /* Avoid aborting parsing when no supported channel is found */
success = check_and_log(fn, ln, in_output ? "output channel_masks" : "input channel_masks", success = check_and_log(fn, ln, in_output ? "output channel_masks" : "input channel_masks",
@ -445,20 +438,20 @@ static int parse_channels(const char *fn, const unsigned ln,
} }
int pa_conversion_parse_output_channels(const char *fn, const unsigned ln, int pa_conversion_parse_output_channels(const char *fn, const unsigned ln,
const char *str, bool legacy, const char *str,
audio_channel_mask_t *channels) { audio_channel_mask_t channel_masks[AUDIO_MAX_CHANNEL_MASKS]) {
return parse_channels(fn, ln, str, true, legacy, channels); return parse_channels(fn, ln, str, true, channel_masks);
} }
int pa_conversion_parse_input_channels(const char *fn, const unsigned ln, int pa_conversion_parse_input_channels(const char *fn, const unsigned ln,
const char *str, bool legacy, const char *str,
audio_channel_mask_t *channels) { audio_channel_mask_t channel_masks[AUDIO_MAX_CHANNEL_MASKS]) {
return parse_channels(fn, ln, str, false, legacy, channels); return parse_channels(fn, ln, str, false, channel_masks);
} }
static bool parse_devices(const char *fn, const unsigned ln, static bool parse_devices(const char *fn, const unsigned ln,
const char *str, bool in_output, const char *str, bool in_output,
bool legacy, bool must_recognize_all, bool must_recognize_all,
audio_devices_t *devices) { audio_devices_t *devices) {
int count; int count;
char *unknown = NULL; char *unknown = NULL;
@ -468,11 +461,7 @@ static bool parse_devices(const char *fn, const unsigned ln,
pa_assert(devices); pa_assert(devices);
count = pa_conversion_parse_list(in_output ? CONV_STRING_OUTPUT_DEVICE : CONV_STRING_INPUT_DEVICE, count = pa_conversion_parse_list(in_output ? CONV_STRING_OUTPUT_DEVICE : CONV_STRING_INPUT_DEVICE,
value_separator(legacy), str, devices, &unknown); VALUE_SEPARATOR, str, devices, &unknown);
if (legacy)
return check_and_log(fn, ln, in_output ? "output devices" : "input devices",
count, str, unknown, must_recognize_all);
/* As the new XML configuration lists devices as one per devicePort, unknown /* As the new XML configuration lists devices as one per devicePort, unknown
* devices will cause the parser to quit. As a workaround for non-legacy * devices will cause the parser to quit. As a workaround for non-legacy
@ -483,15 +472,15 @@ static bool parse_devices(const char *fn, const unsigned ln,
} }
bool pa_conversion_parse_output_devices(const char *fn, const unsigned ln, bool pa_conversion_parse_output_devices(const char *fn, const unsigned ln,
char *str, bool legacy, bool must_recognize_all, char *str, bool must_recognize_all,
audio_devices_t *devices) { audio_devices_t *devices) {
return parse_devices(fn, ln, str, true, legacy, must_recognize_all, devices); return parse_devices(fn, ln, str, true, must_recognize_all, devices);
} }
bool pa_conversion_parse_input_devices(const char *fn, const unsigned ln, bool pa_conversion_parse_input_devices(const char *fn, const unsigned ln,
char *str, bool legacy, bool must_recognize_all, char *str, bool must_recognize_all,
audio_devices_t *devices) { audio_devices_t *devices) {
return parse_devices(fn, ln, str, false, legacy, must_recognize_all, devices); return parse_devices(fn, ln, str, false, must_recognize_all, devices);
} }
bool pa_conversion_parse_output_flags(const char *fn, const unsigned ln, bool pa_conversion_parse_output_flags(const char *fn, const unsigned ln,

View file

@ -2,7 +2,7 @@
#define foodroidconversionfoo #define foodroidconversionfoo
/* /*
* Copyright (C) 2018 Jolla Ltd. * Copyright (C) 2018-2022 Jolla Ltd.
* *
* Contact: Juho Hämäläinen <juho.hamalainen@jolla.com> * Contact: Juho Hämäläinen <juho.hamalainen@jolla.com>
* *
@ -71,8 +71,6 @@ bool pa_string_convert_input_device_str_to_num(const char *str, audio_devices_t
bool pa_string_convert_flag_num_to_str(audio_output_flags_t value, const char **to_str); bool pa_string_convert_flag_num_to_str(audio_output_flags_t value, const char **to_str);
bool pa_string_convert_flag_str_to_num(const char *str, audio_output_flags_t *to_value); bool pa_string_convert_flag_str_to_num(const char *str, audio_output_flags_t *to_value);
char *pa_list_string_output_device(audio_devices_t devices);
char *pa_list_string_input_device(audio_devices_t devices);
char *pa_list_string_flags(audio_output_flags_t flags); char *pa_list_string_flags(audio_output_flags_t flags);
/* Get default audio source associated with input device. /* Get default audio source associated with input device.
@ -87,22 +85,22 @@ int pa_conversion_parse_list(pa_conversion_string_t type, const char *separator,
const char *str, uint32_t *dst, char **unknown_entries); const char *str, uint32_t *dst, char **unknown_entries);
bool pa_conversion_parse_sampling_rates(const char *fn, const unsigned ln, bool pa_conversion_parse_sampling_rates(const char *fn, const unsigned ln,
const char *str, bool legacy, const char *str,
uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]); uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]);
bool pa_conversion_parse_formats(const char *fn, const unsigned ln, bool pa_conversion_parse_formats(const char *fn, const unsigned ln,
const char *str, bool legacy, const char *str,
audio_format_t *formats); audio_format_t *formats);
int pa_conversion_parse_output_channels(const char *fn, const unsigned ln, int pa_conversion_parse_output_channels(const char *fn, const unsigned ln,
const char *str, bool legacy, const char *str,
audio_channel_mask_t *channels); audio_channel_mask_t channel_masks[AUDIO_MAX_CHANNEL_MASKS]);
int pa_conversion_parse_input_channels(const char *fn, const unsigned ln, int pa_conversion_parse_input_channels(const char *fn, const unsigned ln,
const char *str, bool legacy, const char *str,
audio_channel_mask_t *channels); audio_channel_mask_t channel_masks[AUDIO_MAX_CHANNEL_MASKS]);
bool pa_conversion_parse_output_devices(const char *fn, const unsigned ln, bool pa_conversion_parse_output_devices(const char *fn, const unsigned ln,
char *str, bool legacy, bool must_recognize_all, char *str, bool must_recognize_all,
audio_devices_t *devices); audio_devices_t *devices);
bool pa_conversion_parse_input_devices(const char *fn, const unsigned ln, bool pa_conversion_parse_input_devices(const char *fn, const unsigned ln,
char *str, bool legacy, bool must_recognize_all, char *str, bool must_recognize_all,
audio_devices_t *devices); audio_devices_t *devices);
bool pa_conversion_parse_output_flags(const char *fn, const unsigned ln, bool pa_conversion_parse_output_flags(const char *fn, const unsigned ln,
const char *str, audio_output_flags_t *flags); const char *str, audio_output_flags_t *flags);