From c6248e9b72a08ad74e53078348eb39922ff50b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 22 Jul 2015 10:35:50 +0300 Subject: [PATCH 01/11] [util] Update flag parsing to distinguish input and output flags. --- src/droid/droid-util.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/droid/droid-util.c b/src/droid/droid-util.c index 20f6ff04..a513ce72 100644 --- a/src/droid/droid-util.c +++ b/src/droid/droid-util.c @@ -171,15 +171,15 @@ char *pa_list_string_input_device(audio_devices_t devices) { /* Flags */ 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_flag, (uint32_t) value, to_str); + return string_convert_num_to_str(string_conversion_table_output_flag, (uint32_t) value, to_str); } bool pa_string_convert_flag_str_to_num(const char *str, audio_output_flags_t *to_value) { - return string_convert_str_to_num(string_conversion_table_flag, str, (uint32_t*) to_value); + return string_convert_str_to_num(string_conversion_table_output_flag, str, (uint32_t*) to_value); } char *pa_list_string_flags(audio_output_flags_t flags) { - return list_string(string_conversion_table_flag, flags); + return list_string(string_conversion_table_output_flag, flags); } bool pa_input_device_default_audio_source(audio_devices_t input_device, audio_source_t *default_source) @@ -352,7 +352,7 @@ static bool parse_devices(const char *fn, const unsigned ln, count, str, unknown, must_have_all); } -static bool parse_flags(const char *fn, const unsigned ln, +static bool parse_output_flags(const char *fn, const unsigned ln, const char *str, audio_output_flags_t *flags) { int count; char *unknown = NULL; @@ -361,7 +361,7 @@ static bool parse_flags(const char *fn, const unsigned ln, pa_assert(str); pa_assert(flags); - count = parse_list(string_conversion_table_flag, str, flags, &unknown); + count = parse_list(string_conversion_table_output_flag, str, flags, &unknown); return check_and_log(fn, ln, "flags", count, str, unknown, false); } @@ -622,7 +622,7 @@ bool pa_parse_droid_audio_config(const char *filename, pa_droid_config_audio *co success = parse_devices(filename, n, value, false, &input->devices, false); } else if (pa_streq(v, FLAGS_TAG)) { if (in_output) - success = parse_flags(filename, n, value, &output->flags); + success = parse_output_flags(filename, n, value, &output->flags); else { pa_log("[%s:%u] failed to parse line - output flags inside input definition", filename, n); success = false; From 4182ff57edc163231a2b3f9adb3761e2751ee321 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 22 Jul 2015 10:27:30 +0300 Subject: [PATCH 02/11] [util] Audio HAL version 3. --- src/droid/droid-util.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/droid/droid-util.c b/src/droid/droid-util.c index a513ce72..8193f66a 100644 --- a/src/droid/droid-util.c +++ b/src/droid/droid-util.c @@ -113,13 +113,13 @@ static char *list_string(struct string_conversion *list, uint32_t flags) { char *str = NULL; char *tmp; -#ifdef HAL_V2 +#if DROID_HAL >= 2 if (flags & AUDIO_DEVICE_BIT_IN) flags &= ~AUDIO_DEVICE_BIT_IN; #endif for (unsigned int i = 0; list[i].str; i++) { -#ifdef HAL_V2 +#if DROID_HAL >= 2 if (list[i].value & AUDIO_DEVICE_BIT_IN) { if (popcount(list[i].value & ~AUDIO_DEVICE_BIT_IN) != 1) continue; @@ -914,7 +914,7 @@ static void add_i_ports(pa_droid_mapping *am) { pa_assert(am); devices = am->input->devices; -#ifdef HAL_V2 +#if DROID_HAL >= 2 devices &= ~AUDIO_DEVICE_BIT_IN; #endif @@ -923,7 +923,7 @@ static void add_i_ports(pa_droid_mapping *am) { if (devices & cur_device) { -#ifdef HAL_V2 +#if DROID_HAL >= 2 #ifndef DROID_DEVICE_MAKO cur_device |= AUDIO_DEVICE_BIT_IN; #endif From 0f7ef7a60e82514ebcb26c339f86234888d782f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 22 Jul 2015 10:36:24 +0300 Subject: [PATCH 03/11] [util-4x] Rename output flag conversion table. --- src/droid/droid-util-41qc.h | 2 +- src/droid/droid-util-42.h | 2 +- src/droid/droid-util-44.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/droid/droid-util-41qc.h b/src/droid/droid-util-41qc.h index 336cbf78..a467ce99 100644 --- a/src/droid/droid-util-41qc.h +++ b/src/droid/droid-util-41qc.h @@ -195,7 +195,7 @@ struct string_conversion string_conversion_table_audio_source_fancy[] = { }; /* Flags */ -struct string_conversion string_conversion_table_flag[] = { +struct string_conversion string_conversion_table_output_flag[] = { STRING_ENTRY(AUDIO_OUTPUT_FLAG_NONE), STRING_ENTRY(AUDIO_OUTPUT_FLAG_DIRECT), STRING_ENTRY(AUDIO_OUTPUT_FLAG_PRIMARY), diff --git a/src/droid/droid-util-42.h b/src/droid/droid-util-42.h index a58f0a3a..872ea84d 100644 --- a/src/droid/droid-util-42.h +++ b/src/droid/droid-util-42.h @@ -216,7 +216,7 @@ struct string_conversion string_conversion_table_audio_source_fancy[] = { }; /* Flags */ -struct string_conversion string_conversion_table_flag[] = { +struct string_conversion string_conversion_table_output_flag[] = { STRING_ENTRY(AUDIO_OUTPUT_FLAG_NONE), STRING_ENTRY(AUDIO_OUTPUT_FLAG_DIRECT), STRING_ENTRY(AUDIO_OUTPUT_FLAG_PRIMARY), diff --git a/src/droid/droid-util-44.h b/src/droid/droid-util-44.h index d8946025..ce740d3d 100644 --- a/src/droid/droid-util-44.h +++ b/src/droid/droid-util-44.h @@ -242,7 +242,7 @@ struct string_conversion string_conversion_table_audio_source_fancy[] = { }; /* Flags */ -struct string_conversion string_conversion_table_flag[] = { +struct string_conversion string_conversion_table_output_flag[] = { STRING_ENTRY(AUDIO_OUTPUT_FLAG_NONE), STRING_ENTRY(AUDIO_OUTPUT_FLAG_DIRECT), STRING_ENTRY(AUDIO_OUTPUT_FLAG_PRIMARY), From 01d8ea1352ffc993b45c861c5bca41b6831bbf6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 22 Jul 2015 10:52:04 +0300 Subject: [PATCH 04/11] [util-4x] Add or rename HAL version define. --- src/droid/droid-util-41qc.h | 2 ++ src/droid/droid-util-42.h | 2 +- src/droid/droid-util-44.h | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/droid/droid-util-41qc.h b/src/droid/droid-util-41qc.h index a467ce99..6a41382c 100644 --- a/src/droid/droid-util-41qc.h +++ b/src/droid/droid-util-41qc.h @@ -22,6 +22,8 @@ #ifndef _ANDROID_UTIL_V412_H_ #define _ANDROID_UTIL_V412_H_ +#define DROID_HAL 1 + #ifdef DROID_DEVICE_SBJ #define QCOM_HARDWARE #endif diff --git a/src/droid/droid-util-42.h b/src/droid/droid-util-42.h index 872ea84d..4b8f35b5 100644 --- a/src/droid/droid-util-42.h +++ b/src/droid/droid-util-42.h @@ -22,7 +22,7 @@ #ifndef _ANDROID_UTIL_V42_H_ #define _ANDROID_UTIL_V42_H_ -#define HAL_V2 +#define DROID_HAL 2 #include #include diff --git a/src/droid/droid-util-44.h b/src/droid/droid-util-44.h index ce740d3d..e831b3e7 100644 --- a/src/droid/droid-util-44.h +++ b/src/droid/droid-util-44.h @@ -22,7 +22,7 @@ #ifndef _ANDROID_UTIL_V44_H_ #define _ANDROID_UTIL_V44_H_ -#define HAL_V2 +#define DROID_HAL 2 // Android v4.4 has SPEAKER_DRC_ENABLED_TAG, so might the future versions #define DROID_HAVE_DRC From 4542540c8ea373796c7a3ce44bfe6b668e1ee024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 22 Jul 2015 10:42:13 +0300 Subject: [PATCH 05/11] [util] Parse input flags with Audio HAL v3. --- src/droid/droid-util.c | 20 ++++++++++++++++++++ src/droid/droid-util.h | 3 +++ 2 files changed, 23 insertions(+) diff --git a/src/droid/droid-util.c b/src/droid/droid-util.c index 8193f66a..f6c4037e 100644 --- a/src/droid/droid-util.c +++ b/src/droid/droid-util.c @@ -366,6 +366,22 @@ static bool parse_output_flags(const char *fn, const unsigned ln, return check_and_log(fn, ln, "flags", count, str, unknown, false); } +#if DROID_HAL >= 3 +static bool parse_input_flags(const char *fn, const unsigned ln, + const char *str, audio_input_flags_t *flags) { + int count; + char *unknown = NULL; + + pa_assert(fn); + pa_assert(str); + pa_assert(flags); + + count = parse_list(string_conversion_table_input_flag, str, flags, &unknown); + + return check_and_log(fn, ln, "flags", count, str, unknown, false); +} +#endif + #define MAX_LINE_LENGTH (1024) bool pa_parse_droid_audio_config(const char *filename, pa_droid_config_audio *config) { @@ -624,8 +640,12 @@ bool pa_parse_droid_audio_config(const char *filename, pa_droid_config_audio *co if (in_output) success = parse_output_flags(filename, n, value, &output->flags); else { +#if DROID_HAL >= 3 + success = parse_input_flags(filename, n, value, &input->flags); +#else pa_log("[%s:%u] failed to parse line - output flags inside input definition", filename, n); success = false; +#endif } } else { pa_log("[%s:%u] failed to parse line - unknown config entry %s", filename, n, v); diff --git a/src/droid/droid-util.h b/src/droid/droid-util.h index 9d08b77e..93cf14fc 100644 --- a/src/droid/droid-util.h +++ b/src/droid/droid-util.h @@ -113,6 +113,9 @@ typedef struct pa_droid_config_input { audio_channel_mask_t channel_masks; /* 0 -> dynamic */ audio_format_t formats; audio_devices_t devices; +#if DROID_HAL >= 3 + audio_input_flags_t flags; +#endif } pa_droid_config_input; struct pa_droid_config_hw_module { From 30b2042252dc5171118ccfc20093a7db17d35632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Tue, 21 Jul 2015 09:51:51 +0300 Subject: [PATCH 06/11] [util-51] Add headers for 5.1. Contributes to MER#1188 --- src/droid/droid-util-51.h | 342 ++++++++++++++++++++++++++++++++++++++ src/droid/droid-util.h | 2 + 2 files changed, 344 insertions(+) create mode 100644 src/droid/droid-util-51.h diff --git a/src/droid/droid-util-51.h b/src/droid/droid-util-51.h new file mode 100644 index 00000000..c69b7cb9 --- /dev/null +++ b/src/droid/droid-util-51.h @@ -0,0 +1,342 @@ +/* + * Copyright (C) 2015 Jolla Ltd. + * + * Contact: Juho Hämäläinen + * + * These PulseAudio Modules are free software; you can redistribute + * it and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA. + */ + +#ifndef _DROID_UTIL_V51_H_ +#define _DROID_UTIL_V51_H_ + +#define DROID_HAL 3 + +#define DROID_HAVE_DRC + +#include +#include + +// PulseAudio value - Android value + +uint32_t conversion_table_output_channel[][2] = { + { PA_CHANNEL_POSITION_MONO, AUDIO_CHANNEL_OUT_MONO }, + { PA_CHANNEL_POSITION_FRONT_LEFT, AUDIO_CHANNEL_OUT_FRONT_LEFT }, + { PA_CHANNEL_POSITION_FRONT_RIGHT, AUDIO_CHANNEL_OUT_FRONT_RIGHT}, + { PA_CHANNEL_POSITION_FRONT_CENTER, AUDIO_CHANNEL_OUT_FRONT_CENTER }, + { PA_CHANNEL_POSITION_SUBWOOFER, AUDIO_CHANNEL_OUT_LOW_FREQUENCY }, + { PA_CHANNEL_POSITION_REAR_LEFT, AUDIO_CHANNEL_OUT_BACK_LEFT }, + { PA_CHANNEL_POSITION_REAR_RIGHT, AUDIO_CHANNEL_OUT_BACK_RIGHT }, + { PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER }, + { PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER }, + { PA_CHANNEL_POSITION_REAR_CENTER, AUDIO_CHANNEL_OUT_BACK_CENTER }, + { PA_CHANNEL_POSITION_SIDE_LEFT, AUDIO_CHANNEL_OUT_SIDE_LEFT }, + { PA_CHANNEL_POSITION_SIDE_RIGHT, AUDIO_CHANNEL_OUT_SIDE_RIGHT }, + { PA_CHANNEL_POSITION_TOP_CENTER, AUDIO_CHANNEL_OUT_TOP_CENTER }, + { PA_CHANNEL_POSITION_TOP_FRONT_LEFT, AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT }, + { PA_CHANNEL_POSITION_TOP_FRONT_CENTER, AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER }, + { PA_CHANNEL_POSITION_TOP_FRONT_RIGHT, AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT }, + { PA_CHANNEL_POSITION_TOP_REAR_LEFT, AUDIO_CHANNEL_OUT_TOP_BACK_LEFT }, + { PA_CHANNEL_POSITION_TOP_REAR_CENTER, AUDIO_CHANNEL_OUT_TOP_BACK_CENTER }, + { PA_CHANNEL_POSITION_TOP_REAR_RIGHT, AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT } +}; + +uint32_t conversion_table_input_channel[][2] = { + { PA_CHANNEL_POSITION_MONO, AUDIO_CHANNEL_IN_MONO }, + { PA_CHANNEL_POSITION_FRONT_LEFT, AUDIO_CHANNEL_IN_LEFT }, + { PA_CHANNEL_POSITION_FRONT_RIGHT, AUDIO_CHANNEL_IN_RIGHT}, + { PA_CHANNEL_POSITION_FRONT_CENTER, AUDIO_CHANNEL_IN_FRONT }, + { PA_CHANNEL_POSITION_REAR_CENTER, AUDIO_CHANNEL_IN_BACK }, + /* Following are missing suitable counterparts on PulseAudio side. */ + { PA_CHANNEL_POSITION_FRONT_LEFT, AUDIO_CHANNEL_IN_LEFT_PROCESSED }, + { PA_CHANNEL_POSITION_FRONT_RIGHT, AUDIO_CHANNEL_IN_RIGHT_PROCESSED }, + { PA_CHANNEL_POSITION_FRONT_CENTER, AUDIO_CHANNEL_IN_FRONT_PROCESSED }, + { PA_CHANNEL_POSITION_REAR_CENTER, AUDIO_CHANNEL_IN_BACK_PROCESSED }, + { PA_CHANNEL_POSITION_SUBWOOFER, AUDIO_CHANNEL_IN_PRESSURE }, + { PA_CHANNEL_POSITION_AUX0, AUDIO_CHANNEL_IN_X_AXIS }, + { PA_CHANNEL_POSITION_AUX1, AUDIO_CHANNEL_IN_Y_AXIS }, + { PA_CHANNEL_POSITION_AUX2, AUDIO_CHANNEL_IN_Z_AXIS }, + { PA_CHANNEL_POSITION_MONO, AUDIO_CHANNEL_IN_VOICE_UPLINK }, + { PA_CHANNEL_POSITION_MONO, AUDIO_CHANNEL_IN_VOICE_DNLINK } +}; + +uint32_t conversion_table_format[][2] = { + { PA_SAMPLE_U8, AUDIO_FORMAT_PCM_8_BIT }, + { PA_SAMPLE_S16LE, AUDIO_FORMAT_PCM_16_BIT }, + { PA_SAMPLE_S32LE, AUDIO_FORMAT_PCM_32_BIT }, + { PA_SAMPLE_S24LE, AUDIO_FORMAT_PCM_8_24_BIT } +}; + +uint32_t conversion_table_default_audio_source[][2] = { +#ifdef DROID_DEVICE_HAMMERHEAD + { AUDIO_DEVICE_IN_COMMUNICATION, AUDIO_SOURCE_MIC }, + { AUDIO_DEVICE_IN_AMBIENT, AUDIO_SOURCE_MIC }, + { AUDIO_DEVICE_IN_BUILTIN_MIC, AUDIO_SOURCE_MIC }, + { AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, AUDIO_SOURCE_MIC }, + { AUDIO_DEVICE_IN_WIRED_HEADSET, AUDIO_SOURCE_MIC }, + { AUDIO_DEVICE_IN_AUX_DIGITAL, AUDIO_SOURCE_MIC }, + { AUDIO_DEVICE_IN_VOICE_CALL, AUDIO_SOURCE_VOICE_CALL }, + { AUDIO_DEVICE_IN_BACK_MIC, AUDIO_SOURCE_MIC }, + { AUDIO_DEVICE_IN_REMOTE_SUBMIX, AUDIO_SOURCE_REMOTE_SUBMIX }, +#else + { AUDIO_DEVICE_IN_ALL, AUDIO_SOURCE_DEFAULT } +#endif +}; + +struct string_conversion { + uint32_t value; + const char *str; +}; + +#if defined(STRING_ENTRY) +#error STRING_ENTRY already defined somewhere, fix this lib. +#endif +#define STRING_ENTRY(str) { str, #str } +/* Output devices */ +struct string_conversion string_conversion_table_output_device[] = { + /* Each device listed here needs fancy name counterpart + * in string_conversion_table_output_device_fancy. */ + STRING_ENTRY(AUDIO_DEVICE_OUT_EARPIECE), + STRING_ENTRY(AUDIO_DEVICE_OUT_SPEAKER), + STRING_ENTRY(AUDIO_DEVICE_OUT_WIRED_HEADSET), + STRING_ENTRY(AUDIO_DEVICE_OUT_WIRED_HEADPHONE), + STRING_ENTRY(AUDIO_DEVICE_OUT_BLUETOOTH_SCO), + STRING_ENTRY(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET), + STRING_ENTRY(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT), + STRING_ENTRY(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP), + STRING_ENTRY(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES), + STRING_ENTRY(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), + STRING_ENTRY(AUDIO_DEVICE_OUT_AUX_DIGITAL), + STRING_ENTRY(AUDIO_DEVICE_OUT_HDMI), + STRING_ENTRY(AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET), + STRING_ENTRY(AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET), + STRING_ENTRY(AUDIO_DEVICE_OUT_USB_ACCESSORY), + STRING_ENTRY(AUDIO_DEVICE_OUT_USB_DEVICE), + STRING_ENTRY(AUDIO_DEVICE_OUT_REMOTE_SUBMIX), + STRING_ENTRY(AUDIO_DEVICE_OUT_TELEPHONY_TX), + STRING_ENTRY(AUDIO_DEVICE_OUT_LINE), + STRING_ENTRY(AUDIO_DEVICE_OUT_HDMI_ARC), + STRING_ENTRY(AUDIO_DEVICE_OUT_SPDIF), + STRING_ENTRY(AUDIO_DEVICE_OUT_FM), + STRING_ENTRY(AUDIO_DEVICE_OUT_AUX_LINE), + STRING_ENTRY(AUDIO_DEVICE_OUT_SPEAKER_SAFE), + /* Combination entries consisting of multiple devices defined above. + * These don't require counterpart in string_conversion_table_output_device_fancy. */ + STRING_ENTRY(AUDIO_DEVICE_OUT_DEFAULT), + STRING_ENTRY(AUDIO_DEVICE_OUT_ALL), + STRING_ENTRY(AUDIO_DEVICE_OUT_ALL_A2DP), + STRING_ENTRY(AUDIO_DEVICE_OUT_ALL_SCO), + STRING_ENTRY(AUDIO_DEVICE_OUT_ALL_USB), + { 0, NULL } +}; + +struct string_conversion string_conversion_table_output_device_fancy[] = { + { AUDIO_DEVICE_OUT_EARPIECE, "output-earpiece" }, + { AUDIO_DEVICE_OUT_SPEAKER, "output-speaker" }, + { AUDIO_DEVICE_OUT_SPEAKER + | AUDIO_DEVICE_OUT_WIRED_HEADPHONE, "output-speaker+wired_headphone" }, + { AUDIO_DEVICE_OUT_WIRED_HEADSET, "output-wired_headset" }, + { AUDIO_DEVICE_OUT_WIRED_HEADPHONE, "output-wired_headphone" }, + { AUDIO_DEVICE_OUT_BLUETOOTH_SCO, "output-bluetooth_sco" }, + { AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET, "output-sco_headset" }, + { AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, "output-sco_carkit" }, + { AUDIO_DEVICE_OUT_BLUETOOTH_A2DP, "output-a2dp" }, + { AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, "output-a2dp_headphones" }, + { AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, "output-a2dp_speaker" }, + { AUDIO_DEVICE_OUT_AUX_DIGITAL, "output-aux_digital" }, + { AUDIO_DEVICE_OUT_HDMI, "output-hdmi" }, + { AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET, "output-analog_dock_headset" }, + { AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET, "output-digital_dock_headset" }, + { AUDIO_DEVICE_OUT_USB_ACCESSORY, "output-usb_accessory" }, + { AUDIO_DEVICE_OUT_USB_DEVICE, "output-usb_device" }, + { AUDIO_DEVICE_OUT_REMOTE_SUBMIX, "output-remote_submix" }, + { AUDIO_DEVICE_OUT_TELEPHONY_TX, "output-telephony" }, + { AUDIO_DEVICE_OUT_LINE, "output-line" }, + { AUDIO_DEVICE_OUT_HDMI_ARC, "output-hdmi_arc" }, + { AUDIO_DEVICE_OUT_SPDIF, "output-spdif" }, + { AUDIO_DEVICE_OUT_FM, "output-fm" }, + { AUDIO_DEVICE_OUT_AUX_LINE, "output-aux_line" }, + { AUDIO_DEVICE_OUT_SPEAKER_SAFE, "output-speaker_safe" }, + { 0, NULL } +}; + +/* Input devices */ +struct string_conversion string_conversion_table_input_device[] = { + /* Each device listed here needs fancy name counterpart + * in string_conversion_table_input_device_fancy. */ + STRING_ENTRY(AUDIO_DEVICE_IN_COMMUNICATION), + STRING_ENTRY(AUDIO_DEVICE_IN_AMBIENT), + STRING_ENTRY(AUDIO_DEVICE_IN_BUILTIN_MIC), + STRING_ENTRY(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET), + STRING_ENTRY(AUDIO_DEVICE_IN_WIRED_HEADSET), + STRING_ENTRY(AUDIO_DEVICE_IN_AUX_DIGITAL), + STRING_ENTRY(AUDIO_DEVICE_IN_HDMI), + STRING_ENTRY(AUDIO_DEVICE_IN_VOICE_CALL), + STRING_ENTRY(AUDIO_DEVICE_IN_TELEPHONY_RX), + STRING_ENTRY(AUDIO_DEVICE_IN_BACK_MIC), + STRING_ENTRY(AUDIO_DEVICE_IN_REMOTE_SUBMIX), + STRING_ENTRY(AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET), + STRING_ENTRY(AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET), + STRING_ENTRY(AUDIO_DEVICE_IN_USB_ACCESSORY), + STRING_ENTRY(AUDIO_DEVICE_IN_USB_DEVICE), + STRING_ENTRY(AUDIO_DEVICE_IN_FM_TUNER), + STRING_ENTRY(AUDIO_DEVICE_IN_TV_TUNER), + STRING_ENTRY(AUDIO_DEVICE_IN_LINE), + STRING_ENTRY(AUDIO_DEVICE_IN_SPDIF), + STRING_ENTRY(AUDIO_DEVICE_IN_BLUETOOTH_A2DP), + STRING_ENTRY(AUDIO_DEVICE_IN_LOOPBACK), + /* Combination entries consisting of multiple devices defined above. + * These don't require counterpart in string_conversion_table_input_device_fancy. */ + STRING_ENTRY(AUDIO_DEVICE_IN_DEFAULT), + STRING_ENTRY(AUDIO_DEVICE_IN_ALL), + STRING_ENTRY(AUDIO_DEVICE_IN_ALL_SCO), + STRING_ENTRY(AUDIO_DEVICE_IN_ALL_USB), + { 0, NULL } +}; + +struct string_conversion string_conversion_table_input_device_fancy[] = { + { AUDIO_DEVICE_IN_COMMUNICATION, "input-communication" }, + { AUDIO_DEVICE_IN_AMBIENT, "input-ambient" }, + { AUDIO_DEVICE_IN_BUILTIN_MIC, "input-builtin_mic" }, + { AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, "input-bluetooth_sco_headset" }, + { AUDIO_DEVICE_IN_WIRED_HEADSET, "input-wired_headset" }, + { AUDIO_DEVICE_IN_AUX_DIGITAL, "input-aux_digital" }, + { AUDIO_DEVICE_IN_HDMI, "input-hdmi" }, + { AUDIO_DEVICE_IN_VOICE_CALL, "input-voice_call" }, + { AUDIO_DEVICE_IN_TELEPHONY_RX, "input-telephony" }, + { AUDIO_DEVICE_IN_BACK_MIC, "input-back_mic" }, + { AUDIO_DEVICE_IN_REMOTE_SUBMIX, "input-remote_submix" }, + { AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET, "input-analog_dock_headset" }, + { AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET, "input-digital_dock_headset" }, + { AUDIO_DEVICE_IN_USB_ACCESSORY, "input-usb_accessory" }, + { AUDIO_DEVICE_IN_USB_DEVICE, "input-usb_device" }, + { AUDIO_DEVICE_IN_FM_TUNER, "input-fm_tuner" }, + { AUDIO_DEVICE_IN_TV_TUNER, "input-tv_tuner" }, + { AUDIO_DEVICE_IN_LINE, "input-line" }, + { AUDIO_DEVICE_IN_SPDIF, "input-spdif" }, + { AUDIO_DEVICE_IN_BLUETOOTH_A2DP, "input-bluetooth_a2dp" }, + { AUDIO_DEVICE_IN_LOOPBACK, "input-loopback" }, + { 0, NULL } +}; + +struct string_conversion string_conversion_table_audio_source_fancy[] = { + { AUDIO_SOURCE_DEFAULT, "default" }, + { AUDIO_SOURCE_MIC, "mic" }, + { AUDIO_SOURCE_VOICE_UPLINK, "voice uplink" }, + { AUDIO_SOURCE_VOICE_DOWNLINK, "voice downlink" }, + { AUDIO_SOURCE_VOICE_CALL, "voice call" }, + { AUDIO_SOURCE_CAMCORDER, "camcorder" }, + { AUDIO_SOURCE_VOICE_RECOGNITION, "voice recognition" }, + { AUDIO_SOURCE_VOICE_COMMUNICATION, "voice communication" }, + { AUDIO_SOURCE_REMOTE_SUBMIX, "remote submix" }, + { AUDIO_SOURCE_FM_TUNER, "fm tuner" }, + { (uint32_t)-1, NULL } +}; + +/* Flags */ +struct string_conversion string_conversion_table_output_flag[] = { + STRING_ENTRY(AUDIO_OUTPUT_FLAG_NONE), + STRING_ENTRY(AUDIO_OUTPUT_FLAG_DIRECT), + STRING_ENTRY(AUDIO_OUTPUT_FLAG_PRIMARY), + STRING_ENTRY(AUDIO_OUTPUT_FLAG_FAST), + STRING_ENTRY(AUDIO_OUTPUT_FLAG_DEEP_BUFFER), + STRING_ENTRY(AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD), + STRING_ENTRY(AUDIO_OUTPUT_FLAG_NON_BLOCKING), + STRING_ENTRY(AUDIO_OUTPUT_FLAG_HW_AV_SYNC), + { 0, NULL } +}; + +struct string_conversion string_conversion_table_input_flag[] = { + STRING_ENTRY(AUDIO_INPUT_FLAG_NONE), + STRING_ENTRY(AUDIO_INPUT_FLAG_FAST), + STRING_ENTRY(AUDIO_INPUT_FLAG_HW_HOTWORD), + { 0, NULL } +}; + +/* Channels */ +struct string_conversion string_conversion_table_output_channels[] = { + STRING_ENTRY(AUDIO_CHANNEL_OUT_FRONT_LEFT), + STRING_ENTRY(AUDIO_CHANNEL_OUT_FRONT_RIGHT), + STRING_ENTRY(AUDIO_CHANNEL_OUT_FRONT_CENTER), + STRING_ENTRY(AUDIO_CHANNEL_OUT_LOW_FREQUENCY), + STRING_ENTRY(AUDIO_CHANNEL_OUT_BACK_LEFT), + STRING_ENTRY(AUDIO_CHANNEL_OUT_BACK_RIGHT), + STRING_ENTRY(AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER), + STRING_ENTRY(AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER), + STRING_ENTRY(AUDIO_CHANNEL_OUT_BACK_CENTER), + STRING_ENTRY(AUDIO_CHANNEL_OUT_SIDE_LEFT), + STRING_ENTRY(AUDIO_CHANNEL_OUT_SIDE_RIGHT), + STRING_ENTRY(AUDIO_CHANNEL_OUT_TOP_CENTER), + STRING_ENTRY(AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT), + STRING_ENTRY(AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER), + STRING_ENTRY(AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT), + STRING_ENTRY(AUDIO_CHANNEL_OUT_TOP_BACK_LEFT), + STRING_ENTRY(AUDIO_CHANNEL_OUT_TOP_BACK_CENTER), + STRING_ENTRY(AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT), + STRING_ENTRY(AUDIO_CHANNEL_OUT_MONO), + STRING_ENTRY(AUDIO_CHANNEL_OUT_STEREO), + STRING_ENTRY(AUDIO_CHANNEL_OUT_QUAD), + STRING_ENTRY(AUDIO_CHANNEL_OUT_5POINT1), + STRING_ENTRY(AUDIO_CHANNEL_OUT_5POINT1_BACK), + STRING_ENTRY(AUDIO_CHANNEL_OUT_5POINT1_SIDE), + STRING_ENTRY(AUDIO_CHANNEL_OUT_7POINT1), + STRING_ENTRY(AUDIO_CHANNEL_OUT_ALL), + { 0, NULL } +}; +struct string_conversion string_conversion_table_input_channels[] = { + STRING_ENTRY(AUDIO_CHANNEL_IN_LEFT), + STRING_ENTRY(AUDIO_CHANNEL_IN_RIGHT), + STRING_ENTRY(AUDIO_CHANNEL_IN_FRONT), + STRING_ENTRY(AUDIO_CHANNEL_IN_BACK), + STRING_ENTRY(AUDIO_CHANNEL_IN_LEFT_PROCESSED), + STRING_ENTRY(AUDIO_CHANNEL_IN_RIGHT_PROCESSED), + STRING_ENTRY(AUDIO_CHANNEL_IN_FRONT_PROCESSED), + STRING_ENTRY(AUDIO_CHANNEL_IN_BACK_PROCESSED), + STRING_ENTRY(AUDIO_CHANNEL_IN_PRESSURE), + STRING_ENTRY(AUDIO_CHANNEL_IN_X_AXIS), + STRING_ENTRY(AUDIO_CHANNEL_IN_Y_AXIS), + STRING_ENTRY(AUDIO_CHANNEL_IN_Z_AXIS), + STRING_ENTRY(AUDIO_CHANNEL_IN_VOICE_UPLINK), + STRING_ENTRY(AUDIO_CHANNEL_IN_VOICE_DNLINK), + STRING_ENTRY(AUDIO_CHANNEL_IN_MONO), + STRING_ENTRY(AUDIO_CHANNEL_IN_STEREO), + STRING_ENTRY(AUDIO_CHANNEL_IN_ALL), + STRING_ENTRY(AUDIO_CHANNEL_IN_FRONT_BACK), + STRING_ENTRY(AUDIO_CHANNEL_IN_ALL), + { 0, NULL } +}; + +/* Formats */ +struct string_conversion string_conversion_table_format[] = { + STRING_ENTRY(AUDIO_FORMAT_DEFAULT), + STRING_ENTRY(AUDIO_FORMAT_PCM), + STRING_ENTRY(AUDIO_FORMAT_MP3), + STRING_ENTRY(AUDIO_FORMAT_AMR_NB), + STRING_ENTRY(AUDIO_FORMAT_AMR_WB), + STRING_ENTRY(AUDIO_FORMAT_AAC), + STRING_ENTRY(AUDIO_FORMAT_HE_AAC_V1), + STRING_ENTRY(AUDIO_FORMAT_HE_AAC_V2), + STRING_ENTRY(AUDIO_FORMAT_VORBIS), + STRING_ENTRY(AUDIO_FORMAT_MAIN_MASK), + STRING_ENTRY(AUDIO_FORMAT_SUB_MASK), + STRING_ENTRY(AUDIO_FORMAT_PCM_16_BIT), + STRING_ENTRY(AUDIO_FORMAT_PCM_8_BIT), + STRING_ENTRY(AUDIO_FORMAT_PCM_32_BIT), + STRING_ENTRY(AUDIO_FORMAT_PCM_8_24_BIT), + { 0, NULL } +}; +#undef STRING_ENTRY + +#endif diff --git a/src/droid/droid-util.h b/src/droid/droid-util.h index 93cf14fc..2a6555ac 100644 --- a/src/droid/droid-util.h +++ b/src/droid/droid-util.h @@ -41,6 +41,8 @@ #include "droid-util-42.h" #elif ANDROID_VERSION_MAJOR == 4 && ANDROID_VERSION_MINOR == 4 #include "droid-util-44.h" +#elif ANDROID_VERSION_MAJOR == 5 && ANDROID_VERSION_MINOR == 1 +#include "droid-util-51.h" #else #error "No valid ANDROID_VERSION found." #endif From 00593581f040d054dfcd1427a5cfbc165419962d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Tue, 21 Jul 2015 09:56:41 +0300 Subject: [PATCH 07/11] [sink] Preliminary 5.1 support. Contributes to MER#1188 --- src/droid/droid-sink.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/droid/droid-sink.c b/src/droid/droid-sink.c index 23007b4a..42d48600 100644 --- a/src/droid/droid-sink.c +++ b/src/droid/droid-sink.c @@ -1014,7 +1014,13 @@ pa_sink *pa_droid_sink_new(pa_module *m, dev_out, flags, &config_out, - &u->stream_out); + &u->stream_out +#if DROID_HAL >= 3 + /* Go with empty address, should work + * with most devices for now. */ + , NULL +#endif + ); pa_droid_hw_module_unlock(u->hw_module); if (!u->stream_out) { From e487b550b076f61c9f2aaaeed803b75f47ac0554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Tue, 21 Jul 2015 09:56:48 +0300 Subject: [PATCH 08/11] [source] Preliminary 5.1 support. Contributes to MER#1188 --- src/droid/droid-source.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/droid/droid-source.c b/src/droid/droid-source.c index a0f5b241..b780b2b2 100644 --- a/src/droid/droid-source.c +++ b/src/droid/droid-source.c @@ -590,7 +590,13 @@ pa_source *pa_droid_source_new(pa_module *m, u->hw_module->stream_in_id++, dev_in, &config_in, - &u->stream); + &u->stream +#if DROID_HAL >= 3 + , AUDIO_INPUT_FLAG_NONE /* Default to no input flags */ + , NULL /* Don't define address */ + , AUDIO_SOURCE_DEFAULT /* Default audio source */ +#endif + ); pa_droid_hw_module_unlock(u->hw_module); if (ret < 0 || !u->stream) { From 0d3f0286a8e980020bae3a53eb870118366e4025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 22 Jul 2015 11:46:39 +0300 Subject: [PATCH 09/11] [util] Support parsing of dynamic sample rate. Only parse the value, but no actual implementation for the sample rate probing. --- src/droid/droid-util.c | 8 ++++++++ src/droid/droid-util.h | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/droid/droid-util.c b/src/droid/droid-util.c index f6c4037e..547c025c 100644 --- a/src/droid/droid-util.c +++ b/src/droid/droid-util.c @@ -251,6 +251,14 @@ static bool parse_sampling_rates(const char *fn, const unsigned ln, while ((entry = pa_split(str, "|", &state))) { int32_t val; +#if DROID_HAL >= 3 + if (pos == 0 && pa_streq(entry, "dynamic")) { + sampling_rates[pos++] = (uint32_t) -1; + pa_xfree(entry); + break; + } +#endif + if (pos == AUDIO_MAX_SAMPLING_RATES) { pa_log("[%s:%u] Too many sample rate entries (> %d)", fn, ln, AUDIO_MAX_SAMPLING_RATES); pa_xfree(entry); diff --git a/src/droid/droid-util.h b/src/droid/droid-util.h index 2a6555ac..e783aac2 100644 --- a/src/droid/droid-util.h +++ b/src/droid/droid-util.h @@ -100,7 +100,7 @@ typedef struct pa_droid_config_output { const pa_droid_config_hw_module *module; char name[AUDIO_HARDWARE_MODULE_ID_MAX_LEN]; - uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]; + uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]; /* (uint32_t) -1 -> dynamic */ audio_channel_mask_t channel_masks; /* 0 -> dynamic */ audio_format_t formats; audio_devices_t devices; @@ -111,7 +111,7 @@ typedef struct pa_droid_config_input { const pa_droid_config_hw_module *module; char name[AUDIO_HARDWARE_MODULE_ID_MAX_LEN]; - uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]; + uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]; /* (uint32_t) -1 -> dynamic */ audio_channel_mask_t channel_masks; /* 0 -> dynamic */ audio_format_t formats; audio_devices_t devices; From b304f2df1387f6e918fb033ddc0c5b8ccea9ba42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 22 Jul 2015 11:53:29 +0300 Subject: [PATCH 10/11] [util] Support parsing of dynamic formats. Only parse the value, but no actual implementation for the format probing. --- src/droid/droid-util.c | 8 ++++++++ src/droid/droid-util.h | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/droid/droid-util.c b/src/droid/droid-util.c index 547c025c..d7bd026d 100644 --- a/src/droid/droid-util.c +++ b/src/droid/droid-util.c @@ -315,6 +315,14 @@ static bool parse_formats(const char *fn, const unsigned ln, pa_assert(str); pa_assert(formats); +#if DROID_HAL >= 3 + /* Needs to be probed later */ + if (pa_streq(str, "dynamic")) { + *formats = 0; + return true; + } +#endif + count = parse_list(string_conversion_table_format, str, formats, &unknown); return check_and_log(fn, ln, "formats", count, str, unknown, false); diff --git a/src/droid/droid-util.h b/src/droid/droid-util.h index e783aac2..7c9d8b54 100644 --- a/src/droid/droid-util.h +++ b/src/droid/droid-util.h @@ -102,7 +102,7 @@ typedef struct pa_droid_config_output { char name[AUDIO_HARDWARE_MODULE_ID_MAX_LEN]; uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]; /* (uint32_t) -1 -> dynamic */ audio_channel_mask_t channel_masks; /* 0 -> dynamic */ - audio_format_t formats; + audio_format_t formats; /* 0 -> dynamic */ audio_devices_t devices; audio_output_flags_t flags; } pa_droid_config_output; @@ -113,7 +113,7 @@ typedef struct pa_droid_config_input { char name[AUDIO_HARDWARE_MODULE_ID_MAX_LEN]; uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]; /* (uint32_t) -1 -> dynamic */ audio_channel_mask_t channel_masks; /* 0 -> dynamic */ - audio_format_t formats; + audio_format_t formats; /* 0 -> dynamic */ audio_devices_t devices; #if DROID_HAL >= 3 audio_input_flags_t flags; From 50bdc79fdef67b57dc948e4932a19184a783105d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 22 Jul 2015 14:29:42 +0300 Subject: [PATCH 11/11] [README] Update supported versions. --- README | 1 + 1 file changed, 1 insertion(+) diff --git a/README b/README index 4831b1cb..6b204f33 100644 --- a/README +++ b/README @@ -6,6 +6,7 @@ Supported Android versions: * 4.1.x with Qualcomm extensions (tested with 4.1.2) * 4.2.x * 4.4.x + * 5.1 Headers for defining devices and strings for different droid versions are in src/droid/droid-util-XXX.h