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 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) { 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) { diff --git a/src/droid/droid-util-41qc.h b/src/droid/droid-util-41qc.h index 336cbf78..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 @@ -195,7 +197,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..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 @@ -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..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 @@ -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), 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.c b/src/droid/droid-util.c index 20f6ff04..d7bd026d 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; @@ -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) @@ -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); @@ -307,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); @@ -352,7 +368,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,10 +377,26 @@ 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); +} + +#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) @@ -622,10 +654,14 @@ 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 { +#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); @@ -914,7 +950,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 +959,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 diff --git a/src/droid/droid-util.h b/src/droid/droid-util.h index 9d08b77e..7c9d8b54 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 @@ -98,9 +100,9 @@ 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_format_t formats; /* 0 -> dynamic */ audio_devices_t devices; audio_output_flags_t flags; } pa_droid_config_output; @@ -109,10 +111,13 @@ 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_format_t formats; /* 0 -> dynamic */ audio_devices_t devices; +#if DROID_HAL >= 3 + audio_input_flags_t flags; +#endif } pa_droid_config_input; struct pa_droid_config_hw_module {