[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid.spec
^
|
|
[-]
[+]
|
Deleted |
_service:tar_git:pulseaudio-modules-droid-8.0.51.tar.bz2/src/common/droid-util-42.h
^
|
@@ -1,280 +0,0 @@
-/*
- * Copyright (C) 2013 Jolla Ltd.
- *
- * Contact: Juho Hämäläinen <juho.hamalainen@tieto.com>
- *
- * 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 _ANDROID_UTIL_V42_H_
-#define _ANDROID_UTIL_V42_H_
-
-#define DROID_HAL 2
-
-#include <hardware/audio.h>
-#include <hardware_legacy/audio_policy_conf.h>
-
-// 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. */
- { AUDIO_CHANNEL_IN_LEFT_PROCESSED, AUDIO_CHANNEL_IN_LEFT_PROCESSED },
- { AUDIO_CHANNEL_IN_RIGHT_PROCESSED, AUDIO_CHANNEL_IN_RIGHT_PROCESSED },
- { AUDIO_CHANNEL_IN_FRONT_PROCESSED, AUDIO_CHANNEL_IN_FRONT_PROCESSED },
- { AUDIO_CHANNEL_IN_BACK_PROCESSED, AUDIO_CHANNEL_IN_BACK_PROCESSED },
- { AUDIO_CHANNEL_IN_PRESSURE, AUDIO_CHANNEL_IN_PRESSURE },
- { AUDIO_CHANNEL_IN_X_AXIS, AUDIO_CHANNEL_IN_X_AXIS },
- { AUDIO_CHANNEL_IN_Y_AXIS, AUDIO_CHANNEL_IN_Y_AXIS },
- { AUDIO_CHANNEL_IN_Z_AXIS, AUDIO_CHANNEL_IN_Z_AXIS },
- { AUDIO_CHANNEL_IN_VOICE_UPLINK, AUDIO_CHANNEL_IN_VOICE_UPLINK },
- { AUDIO_CHANNEL_IN_VOICE_DNLINK, 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] = {
- { AUDIO_DEVICE_IN_ALL, AUDIO_SOURCE_DEFAULT }
-};
-
-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[] = {
- 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_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_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_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" },
- { 0, NULL }
-};
-
-/* Input devices */
-struct string_conversion string_conversion_table_input_device[] = {
- 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_VOICE_CALL),
- 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_DEFAULT),
- /* 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_ALL),
- STRING_ENTRY(AUDIO_DEVICE_IN_ALL_SCO),
- { 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_VOICE_CALL, "input-voice_call" },
- { 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_DEFAULT, "input-default" },
- { 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" },
-#ifdef QCOM_HARDWARE
- { AUDIO_SOURCE_FM_RX, "fm rx" },
- { AUDIO_SOURCE_FM_RX_A2DP, "fm rx a2dp" },
-#endif
- { (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),
- { 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_SURROUND),
- STRING_ENTRY(AUDIO_CHANNEL_OUT_5POINT1),
- 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),
- { 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
|
[-]
[+]
|
Deleted |
_service:tar_git:pulseaudio-modules-droid-8.0.51.tar.bz2/src/common/droid-util-44.h
^
|
@@ -1,358 +0,0 @@
-/*
- * Copyright (C) 2013 Jolla Ltd.
- *
- * Contact: Juho Hämäläinen <juho.hamalainen@tieto.com>
- *
- * 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 _ANDROID_UTIL_V44_H_
-#define _ANDROID_UTIL_V44_H_
-
-#define DROID_HAL 2
-
-// Android v4.4 has SPEAKER_DRC_ENABLED_TAG, so might the future versions
-#define DROID_HAVE_DRC
-
-// Until we implement MER_HA_CHIPSET in hw-release, every non-Qualcomm ARM
-// device will need to have an exception below (just like i9305).
-// This decision is based on the trend of Q3/Q4 2014 that most devices ported
-// to 4.4 via hybris are Qualcomm ones.
-// TODO: things elegantly
-#if defined(__arm__) && !defined(DROID_DEVICE_I9305)
-#define QCOM_HARDWARE
-#endif
-
-#include <hardware/audio.h>
-#include <hardware_legacy/audio_policy_conf.h>
-
-// 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. */
- { AUDIO_CHANNEL_IN_LEFT_PROCESSED, AUDIO_CHANNEL_IN_LEFT_PROCESSED },
- { AUDIO_CHANNEL_IN_RIGHT_PROCESSED, AUDIO_CHANNEL_IN_RIGHT_PROCESSED },
- { AUDIO_CHANNEL_IN_FRONT_PROCESSED, AUDIO_CHANNEL_IN_FRONT_PROCESSED },
- { AUDIO_CHANNEL_IN_BACK_PROCESSED, AUDIO_CHANNEL_IN_BACK_PROCESSED },
- { AUDIO_CHANNEL_IN_PRESSURE, AUDIO_CHANNEL_IN_PRESSURE },
- { AUDIO_CHANNEL_IN_X_AXIS, AUDIO_CHANNEL_IN_X_AXIS },
- { AUDIO_CHANNEL_IN_Y_AXIS, AUDIO_CHANNEL_IN_Y_AXIS },
- { AUDIO_CHANNEL_IN_Z_AXIS, AUDIO_CHANNEL_IN_Z_AXIS },
- { AUDIO_CHANNEL_IN_VOICE_UPLINK, AUDIO_CHANNEL_IN_VOICE_UPLINK },
- { AUDIO_CHANNEL_IN_VOICE_DNLINK, 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] = {
-#if defined(DROID_DEVICE_HAMMERHEAD) || defined(DROID_DEVICE_ARMANI) || defined(DROID_DEVICE_MAKO)
- { 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 },
- { AUDIO_DEVICE_IN_ANC_HEADSET, AUDIO_SOURCE_MIC },
- { AUDIO_DEVICE_IN_FM_RX, AUDIO_SOURCE_FM_RX },
- { AUDIO_DEVICE_IN_FM_RX_A2DP, AUDIO_SOURCE_FM_RX_A2DP },
-#endif
- { AUDIO_DEVICE_IN_ALL, AUDIO_SOURCE_DEFAULT }
-};
-
-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[] = {
- 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_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_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),
-#ifdef QCOM_HARDWARE
- STRING_ENTRY(AUDIO_DEVICE_OUT_FM),
- STRING_ENTRY(AUDIO_DEVICE_OUT_FM_TX),
- STRING_ENTRY(AUDIO_DEVICE_OUT_ANC_HEADSET),
- STRING_ENTRY(AUDIO_DEVICE_OUT_ANC_HEADPHONE),
- STRING_ENTRY(AUDIO_DEVICE_OUT_PROXY),
-#endif
- { 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_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" },
-#ifdef QCOM_HARDWARE
- { AUDIO_DEVICE_OUT_FM, "output-fm" },
- { AUDIO_DEVICE_OUT_FM_TX, "output-fm_tx" },
- { AUDIO_DEVICE_OUT_ANC_HEADSET, "output-anc_headset" },
- { AUDIO_DEVICE_OUT_ANC_HEADPHONE, "output-anc_headphone" },
- { AUDIO_DEVICE_OUT_PROXY, "output-proxy" },
-#endif
- { 0, NULL }
-};
-
-/* Input devices */
-struct string_conversion string_conversion_table_input_device[] = {
- 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_VOICE_CALL),
- 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),
-#ifdef QCOM_HARDWARE
- STRING_ENTRY(AUDIO_DEVICE_IN_ANC_HEADSET),
- STRING_ENTRY(AUDIO_DEVICE_IN_FM_RX),
- STRING_ENTRY(AUDIO_DEVICE_IN_FM_RX_A2DP),
-#endif
- STRING_ENTRY(AUDIO_DEVICE_IN_DEFAULT),
- /* 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_ALL),
- STRING_ENTRY(AUDIO_DEVICE_IN_ALL_SCO),
- { 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_VOICE_CALL, "input-voice_call" },
- { 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" },
-#ifdef QCOM_HARDWARE
- { AUDIO_DEVICE_IN_ANC_HEADSET, "input-anc_headset" },
- { AUDIO_DEVICE_IN_FM_RX, "input-fm_rx" },
- { AUDIO_DEVICE_IN_FM_RX_A2DP, "input-fm_rx_a2dp" },
-#endif
- { AUDIO_DEVICE_IN_DEFAULT, "input-default" },
- { 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" },
-#ifdef QCOM_HARDWARE
- { AUDIO_SOURCE_FM_RX, "fm rx" },
- { AUDIO_SOURCE_FM_RX_A2DP, "fm rx a2dp" },
-#endif
- { (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),
-#ifdef QCOM_HARDWARE
- STRING_ENTRY(AUDIO_OUTPUT_FLAG_LPA),
- STRING_ENTRY(AUDIO_OUTPUT_FLAG_TUNNEL),
- STRING_ENTRY(AUDIO_OUTPUT_FLAG_VOIP_RX),
-#endif
- { 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_SURROUND),
- STRING_ENTRY(AUDIO_CHANNEL_OUT_5POINT1),
- 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),
-#ifdef QCOM_HARDWARE
- STRING_ENTRY(AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO),
- STRING_ENTRY(AUDIO_CHANNEL_IN_VOICE_DNLINK_MONO),
- STRING_ENTRY(AUDIO_CHANNEL_IN_VOICE_CALL_MONO),
-#endif
- { 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),
-#ifdef QCOM_HARDWARE
- STRING_ENTRY(AUDIO_FORMAT_EVRC),
- STRING_ENTRY(AUDIO_FORMAT_QCELP),
- STRING_ENTRY(AUDIO_FORMAT_AC3),
- STRING_ENTRY(AUDIO_FORMAT_AC3_PLUS),
- STRING_ENTRY(AUDIO_FORMAT_DTS),
- STRING_ENTRY(AUDIO_FORMAT_WMA),
- STRING_ENTRY(AUDIO_FORMAT_WMA_PRO),
- STRING_ENTRY(AUDIO_FORMAT_AAC_ADIF),
- STRING_ENTRY(AUDIO_FORMAT_EVRCB),
- STRING_ENTRY(AUDIO_FORMAT_EVRCWB),
- STRING_ENTRY(AUDIO_FORMAT_EAC3),
- STRING_ENTRY(AUDIO_FORMAT_DTS_LBR),
- STRING_ENTRY(AUDIO_FORMAT_AMR_WB_PLUS),
-#endif
- 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
|
[-]
[+]
|
Deleted |
_service:tar_git:pulseaudio-modules-droid-8.0.51.tar.bz2/src/common/droid-util-51.h
^
|
@@ -1,418 +0,0 @@
-/*
- * Copyright (C) 2015 Jolla Ltd.
- *
- * Contact: Juho Hämäläinen <juho.hamalainen@jolla.com>
- *
- * 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
-
-// Until we implement MER_HA_CHIPSET in hw-release, every non-Qualcomm ARM
-// device will need to have an exception below (just like i9305).
-// TODO: things elegantly
-#if defined(__arm__) && !defined(DROID_DEVICE_I9305)
-#define QCOM_HARDWARE
-#endif
-
-#ifdef QCOM_BSP
-#define DROID_AUDIO_HAL_USE_VSID
-#endif
-
-#include <hardware/audio.h>
-#include <hardware_legacy/audio_policy_conf.h>
-
-// 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] = {
- { 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 },
-#ifdef QCOM_HARDWARE
- { AUDIO_DEVICE_IN_FM_RX, AUDIO_SOURCE_FM_RX },
- { AUDIO_DEVICE_IN_FM_RX_A2DP, AUDIO_SOURCE_FM_RX_A2DP },
-#endif
- { AUDIO_DEVICE_IN_ALL, AUDIO_SOURCE_DEFAULT }
-};
-
-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),
-#ifdef QCOM_HARDWARE
- STRING_ENTRY(AUDIO_DEVICE_OUT_FM_TX),
- STRING_ENTRY(AUDIO_DEVICE_OUT_PROXY),
-#endif
- /* 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" },
-#ifdef QCOM_HARDWARE
- { AUDIO_DEVICE_OUT_FM_TX, "output-fm_tx" },
- { AUDIO_DEVICE_OUT_PROXY, "output-proxy" },
-#endif
- { 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),
-#ifdef QCOM_HARDWARE
-#ifdef DROID_AUDIO_HAL_SECONDARY_MIC
- STRING_ENTRY(AUDIO_DEVICE_IN_SECONDARY_MIC),
-#endif
- STRING_ENTRY(AUDIO_DEVICE_IN_PROXY),
- STRING_ENTRY(AUDIO_DEVICE_IN_FM_RX),
- STRING_ENTRY(AUDIO_DEVICE_IN_FM_RX_A2DP),
-#endif
- STRING_ENTRY(AUDIO_DEVICE_IN_DEFAULT),
- /* 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_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" },
-#ifdef QCOM_HARDWARE
-#ifdef DROID_AUDIO_HAL_SECONDARY_MIC
- { AUDIO_DEVICE_IN_SECONDARY_MIC, "input-secondary_mic" },
-#endif
- { AUDIO_DEVICE_IN_PROXY, "input-proxy" },
- { AUDIO_DEVICE_IN_FM_RX, "input-fm_rx" },
- { AUDIO_DEVICE_IN_FM_RX_A2DP, "input-fm_rx_a2dp" },
-#endif
- { AUDIO_DEVICE_IN_DEFAULT, "input-default" },
- { 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" },
-#ifdef QCOM_HARDWARE
- { AUDIO_SOURCE_FM_RX, "fm rx" },
- { AUDIO_SOURCE_FM_RX_A2DP, "fm rx a2dp" },
-#endif
- { (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),
-#ifdef QCOM_HARDWARE
- STRING_ENTRY(AUDIO_OUTPUT_FLAG_VOIP_RX),
- STRING_ENTRY(AUDIO_OUTPUT_FLAG_INCALL_MUSIC),
- STRING_ENTRY(AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH),
-#endif
- { 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_OPUS),
- STRING_ENTRY(AUDIO_FORMAT_AC3),
- STRING_ENTRY(AUDIO_FORMAT_E_AC3),
- 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),
- STRING_ENTRY(AUDIO_FORMAT_PCM_FLOAT),
- STRING_ENTRY(AUDIO_FORMAT_PCM_24_BIT_PACKED),
- STRING_ENTRY(AUDIO_FORMAT_AAC_MAIN),
- STRING_ENTRY(AUDIO_FORMAT_AAC_LC),
- STRING_ENTRY(AUDIO_FORMAT_AAC_SSR),
- STRING_ENTRY(AUDIO_FORMAT_AAC_LTP),
- STRING_ENTRY(AUDIO_FORMAT_AAC_HE_V1),
- STRING_ENTRY(AUDIO_FORMAT_AAC_SCALABLE),
- STRING_ENTRY(AUDIO_FORMAT_AAC_ERLC),
- STRING_ENTRY(AUDIO_FORMAT_AAC_LD),
- STRING_ENTRY(AUDIO_FORMAT_AAC_HE_V2),
- STRING_ENTRY(AUDIO_FORMAT_AAC_ELD),
-#ifdef QCOM_HARDWARE
- STRING_ENTRY(AUDIO_FORMAT_EVRC),
- STRING_ENTRY(AUDIO_FORMAT_QCELP),
- STRING_ENTRY(AUDIO_FORMAT_DTS),
- STRING_ENTRY(AUDIO_FORMAT_WMA),
- STRING_ENTRY(AUDIO_FORMAT_WMA_PRO),
- STRING_ENTRY(AUDIO_FORMAT_AAC_ADIF),
- STRING_ENTRY(AUDIO_FORMAT_EVRCB),
- STRING_ENTRY(AUDIO_FORMAT_EVRCWB),
- STRING_ENTRY(AUDIO_FORMAT_DTS_LBR),
- STRING_ENTRY(AUDIO_FORMAT_AMR_WB_PLUS),
- STRING_ENTRY(AUDIO_FORMAT_MP2),
- STRING_ENTRY(AUDIO_FORMAT_EVRCNW),
- STRING_ENTRY(AUDIO_FORMAT_PCM_OFFLOAD),
- STRING_ENTRY(AUDIO_FORMAT_FLAC),
- STRING_ENTRY(AUDIO_FORMAT_E_AC3_JOC),
-#endif
- { 0, NULL }
-};
-#undef STRING_ENTRY
-
-#endif
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/README
^
|
@@ -11,14 +11,27 @@
* 4.1.x with Qualcomm extensions (tested with 4.1.2)
* 4.2.x
* 4.4.x
- * 5.1
+ * 5.x
+ * 6.0.x
Headers for defining devices and strings for different droid versions are in
-src/common/droid-util-XXX.h
+src/common/droid-util-audio.h (legacy headers for Jolla 1 in droid-util-41qc.h).
-These headers are then included in src/common/droid-util.h based on detected
-droid version. Version is defined in android-version.h, included from
-android-config.h, which is part of droid hal devel package.
+When new devices with relevant new enums appear, add enum check to configure.ac,
+for example: (the CC_CHECK_DROID_ENUM m4 macro will create define HAVE_ENUM_FOO
+if the enum FOO exists in HAL audio.h)
+ CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_IP])
+
+and then in droid-util-audio.h add the enum to proper tables with ifdefs:
+ /* string_conversion_table_output_device[] */
+ #ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_IP
+ STRING_ENTRY( AUDIO_DEVICE_OUT_IP ),
+ #endif
+
+ /* string_conversion_table_output_device_fancy[] */
+ #ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_IP
+ { AUDIO_DEVICE_OUT_IP, "output-ip" },
+ #endif
The purpose of droid-modules is to "replace AudioFlinger". Many hardware
adaptations use ALSA as the kernel interface, but there is no saying that
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/configure.ac
^
|
@@ -187,6 +187,75 @@
AC_SUBST(DBUS_CFLAGS)
AC_SUBST(DBUS_LIBS)
+# Output devices
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_HDMI])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_HDMI_ARC])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_TELEPHONY_TX])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_LINE])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_SPDIF])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_AUX_LINE])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_SPEAKER_SAFE])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_FM])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_FM_TX])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_ANC_HEADSET])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_ANC_HEADPHONE])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_PROXY])
+# Added in 6.0
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_OUT_IP])
+
+# Input devices
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_HDMI])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_TELEPHONY_RX])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_FM_TUNER])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_TV_TUNER])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_LINE])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_SPDIF])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_BLUETOOTH_A2DP])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_LOOPBACK])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_PROXY])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_FM_RX])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_FM_RX_A2DP])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_ALL_USB])
+# Added in 6.0
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_DEVICE_IN_IP])
+
+# Audio sources
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_SOURCE_FM_TUNER])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_SOURCE_FM_RX])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_SOURCE_FM_RX_A2DP])
+
+# Output flags
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_OUTPUT_FLAG_NON_BLOCKING])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_OUTPUT_FLAG_HW_AV_SYNC])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_OUTPUT_FLAG_VOIP_RX])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_OUTPUT_FLAG_INCALL_MUSIC])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH])
+# Added in 6.0
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_OUTPUT_FLAG_TTS])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_OUTPUT_FLAG_RAW])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_OUTPUT_FLAG_SYNC])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO])
+
+# Input flags
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_INPUT_FLAG_NONE])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_INPUT_FLAG_FAST])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_INPUT_FLAG_HW_HOTWORD])
+# Added in 6.0
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_INPUT_FLAG_RAW])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_INPUT_FLAG_SYNC])
+
+# Channels
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_CHANNEL_OUT_SURROUND])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_CHANNEL_OUT_5POINT1_BACK])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_CHANNEL_OUT_5POINT1_SIDE])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_CHANNEL_IN_VOICE_CALL_MONO])
+
+# Formats
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_FORMAT_PCM_OFFLOAD])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_FORMAT_FLAC])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_FORMAT_OPUS])
+
AC_ARG_WITH([module-dir],
AS_HELP_STRING([--with-module-dir],[Directory where to install the modules to (defaults to ${pulseaudiodir}/lib/pulse-${PA_MAJORMINOR}/modules/]),
[modlibexecdir=$withval], [modlibexecdir="${pulseaudiodir}/lib/pulse-${PA_MAJORMINOR}/modules"])
|
[-]
[+]
|
Added |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/m4/check_droid_enum.m4
^
|
@@ -0,0 +1,21 @@
+AC_DEFUN([CC_CHECK_DROID_ENUM],
+[AC_MSG_CHECKING([if droid headers have enum $2])
+ AC_LANG_SAVE
+ AC_LANG_C
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $1"
+ AC_TRY_COMPILE(
+ [ #include <android-config.h>
+ #ifdef QCOM_BSP
+ #define QCOM_HARDWARE
+ #endif
+ #include <system/audio.h> ],
+ [ unsigned int e = $2; ],
+ cc_check_droid_enum=yes, cc_check_droid_enum=no)
+ CFLAGS="$SAVE_CFLAGS"
+ AC_LANG_RESTORE
+ AC_MSG_RESULT([$cc_check_droid_enum])
+if test x"$cc_check_droid_enum" = x"yes"; then
+ AC_DEFINE(HAVE_ENUM_$2,,[define if enum $2 is found in headers])
+fi
+])
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/src/common/droid-util-41qc.h
^
|
@@ -22,8 +22,6 @@
#ifndef _ANDROID_UTIL_V412_H_
#define _ANDROID_UTIL_V412_H_
-#define DROID_HAL 1
-
#ifdef DROID_DEVICE_SBJ
#define QCOM_HARDWARE
#endif
|
[-]
[+]
|
Added |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/src/common/droid-util-audio.h
^
|
@@ -0,0 +1,591 @@
+/*
+ * Copyright (C) 2017 Jolla Ltd.
+ *
+ * Contact: Juho Hämäläinen <juho.hamalainen@jolla.com>
+ *
+ * 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_AUDIO_H_
+#define _DROID_UTIL_AUDIO_H_
+
+#ifdef QCOM_BSP
+#define QCOM_HARDWARE
+#endif
+
+#include <hardware/audio.h>
+#include <hardware_legacy/audio_policy_conf.h>
+
+#ifdef SPEAKER_DRC_ENABLED_TAG
+#define DROID_HAVE_DRC
+#endif
+
+
+#ifdef STRING_ENTRY
+#error Macro clashing with our helper macro already defined somewhere, fix this droid lib.
+#endif
+
+struct string_conversion {
+ uint32_t value;
+ const char *str;
+};
+
+#define STRING_ENTRY(str) { str, #str }
+
+// 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] = {
+ { 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 },
+#if defined(HAVE_ENUM_AUDIO_DEVICE_IN_FM_RX) && defined(HAVE_ENUM_AUDIO_SOURCE_FM_RX)
+ { AUDIO_DEVICE_IN_FM_RX, AUDIO_SOURCE_FM_RX },
+#endif
+#if defined(HAVE_ENUM_AUDIO_DEVICE_IN_FM_TUNER) && defined(HAVE_ENUM_AUDIO_SOURCE_FM_TUNER)
+ { AUDIO_DEVICE_IN_FM_TUNER, AUDIO_SOURCE_FM_TUNER },
+#endif
+#if defined(HAVE_ENUM_AUDIO_DEVICE_IN_FM_RX_A2DP) && defined(HAVE_ENUM_AUDIO_SOURCE_FM_RX_A2DP)
+ { AUDIO_DEVICE_IN_FM_RX_A2DP, AUDIO_SOURCE_FM_RX_A2DP },
+#endif
+ { AUDIO_DEVICE_IN_ALL, AUDIO_SOURCE_DEFAULT }
+};
+
+/* 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_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_DEFAULT ),
+
+ /* Devices which may or may not be defined for all devices,
+ * update configure.ac CC_CHECK_DROID_ENUM list if you encounter new ones. */
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_HDMI
+ STRING_ENTRY( AUDIO_DEVICE_OUT_HDMI ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_HDMI_ARC
+ STRING_ENTRY( AUDIO_DEVICE_OUT_HDMI_ARC ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_TELEPHONY_TX
+ STRING_ENTRY( AUDIO_DEVICE_OUT_TELEPHONY_TX ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_LINE
+ STRING_ENTRY( AUDIO_DEVICE_OUT_LINE ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_SPDIF
+ STRING_ENTRY( AUDIO_DEVICE_OUT_SPDIF ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_AUX_LINE
+ STRING_ENTRY( AUDIO_DEVICE_OUT_AUX_LINE ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_SPEAKER_SAFE
+ STRING_ENTRY( AUDIO_DEVICE_OUT_SPEAKER_SAFE ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_FM
+ STRING_ENTRY( AUDIO_DEVICE_OUT_FM ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_FM_TX
+ STRING_ENTRY( AUDIO_DEVICE_OUT_FM_TX ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_ANC_HEADSET
+ STRING_ENTRY( AUDIO_DEVICE_OUT_ANC_HEADSET ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_ANC_HEADPHONE
+ STRING_ENTRY( AUDIO_DEVICE_OUT_ANC_HEADPHONE ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_PROXY
+ STRING_ENTRY( AUDIO_DEVICE_OUT_PROXY ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_IP
+ STRING_ENTRY( AUDIO_DEVICE_OUT_IP ),
+#endif
+
+ /* 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_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_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_DEFAULT, "output-default" },
+
+ /* Devices which may or may not be defined for all devices, */
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_HDMI
+ { AUDIO_DEVICE_OUT_HDMI, "output-hdmi" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_HDMI_ARC
+ { AUDIO_DEVICE_OUT_HDMI_ARC, "output-hdmi_arc" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_TELEPHONY_TX
+ { AUDIO_DEVICE_OUT_TELEPHONY_TX, "output-telephony_tx" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_LINE
+ { AUDIO_DEVICE_OUT_LINE, "output-line" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_SPDIF
+ { AUDIO_DEVICE_OUT_SPDIF, "output-spdif" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_AUX_LINE
+ { AUDIO_DEVICE_OUT_AUX_LINE, "output-aux_line" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_SPEAKER_SAFE
+ { AUDIO_DEVICE_OUT_SPEAKER_SAFE, "output-speaker_safe" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_FM
+ { AUDIO_DEVICE_OUT_FM, "output-fm" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_FM_TX
+ { AUDIO_DEVICE_OUT_FM_TX, "output-fm_tx" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_ANC_HEADSET
+ { AUDIO_DEVICE_OUT_ANC_HEADSET, "output-anc_headset" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_ANC_HEADPHONE
+ { AUDIO_DEVICE_OUT_ANC_HEADPHONE, "output-anc_headphone" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_PROXY
+ { AUDIO_DEVICE_OUT_PROXY, "output-proxy" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_OUT_IP
+ { AUDIO_DEVICE_OUT_IP, "output-ip" },
+#endif
+
+ { 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_VOICE_CALL ),
+ 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_DEFAULT ),
+
+ /* Devices which may or may not be defined for all devices,
+ * update configure.ac CC_CHECK_DROID_ENUM list if you encounter new ones. */
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_HDMI
+ STRING_ENTRY( AUDIO_DEVICE_IN_HDMI ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_TELEPHONY_RX
+ STRING_ENTRY( AUDIO_DEVICE_IN_TELEPHONY_RX ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_FM_TUNER
+ STRING_ENTRY( AUDIO_DEVICE_IN_FM_TUNER ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_TV_TUNER
+ STRING_ENTRY( AUDIO_DEVICE_IN_TV_TUNER ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_LINE
+ STRING_ENTRY( AUDIO_DEVICE_IN_LINE ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_SPDIF
+ STRING_ENTRY( AUDIO_DEVICE_IN_SPDIF ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_BLUETOOTH_A2DP
+ STRING_ENTRY( AUDIO_DEVICE_IN_BLUETOOTH_A2DP ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_LOOPBACK
+ STRING_ENTRY( AUDIO_DEVICE_IN_LOOPBACK ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_PROXY
+ STRING_ENTRY( AUDIO_DEVICE_IN_PROXY ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_FM_RX
+ STRING_ENTRY( AUDIO_DEVICE_IN_FM_RX ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_FM_RX_A2DP
+ STRING_ENTRY( AUDIO_DEVICE_IN_FM_RX_A2DP ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_IP
+ STRING_ENTRY( AUDIO_DEVICE_IN_IP ),
+#endif
+
+#ifdef DROID_AUDIO_HAL_SECONDARY_MIC
+ STRING_ENTRY( AUDIO_DEVICE_IN_SECONDARY_MIC ),
+#endif
+
+ /* 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_ALL ),
+ STRING_ENTRY( AUDIO_DEVICE_IN_ALL_SCO ),
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_ALL_USB
+ STRING_ENTRY( AUDIO_DEVICE_IN_ALL_USB ),
+#endif
+
+ { 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_VOICE_CALL, "input-voice_call" },
+ { 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_DEFAULT, "input-default" },
+
+ /* Devices which may or may not be defined for all devices, */
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_HDMI
+ { AUDIO_DEVICE_IN_HDMI, "input-hdmi" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_TELEPHONY_RX
+ { AUDIO_DEVICE_IN_TELEPHONY_RX, "input-telephony_rx" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_FM_TUNER
+ { AUDIO_DEVICE_IN_FM_TUNER, "input-fm_tuner" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_TV_TUNER
+ { AUDIO_DEVICE_IN_TV_TUNER, "input-tv_tuner" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_LINE
+ { AUDIO_DEVICE_IN_LINE, "input-line" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_SPDIF
+ { AUDIO_DEVICE_IN_SPDIF, "input-spdif" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_BLUETOOTH_A2DP
+ { AUDIO_DEVICE_IN_BLUETOOTH_A2DP, "input-bluetooth_a2dp" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_LOOPBACK
+ { AUDIO_DEVICE_IN_LOOPBACK, "input-loopback" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_PROXY
+ { AUDIO_DEVICE_IN_PROXY, "input-proxy" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_FM_RX
+ { AUDIO_DEVICE_IN_FM_RX, "input-fm_rx" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_FM_RX_A2DP
+ { AUDIO_DEVICE_IN_FM_RX_A2DP, "input-fm_rx_a2dp" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_DEVICE_IN_IP
+ { AUDIO_DEVICE_IN_IP, "input-ip" },
+#endif
+
+#ifdef DROID_AUDIO_HAL_SECONDARY_MIC
+ { AUDIO_DEVICE_IN_SECONDARY_MIC, "input-secondary_mic" },
+#endif
+
+ { 0, NULL }
+};
+
+/* Audio source fancy names */
+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 sources which may or may not be defined for all devices, */
+#ifdef HAVE_ENUM_AUDIO_SOURCE_FM_TUNER
+ { AUDIO_SOURCE_FM_TUNER, "fm tuner" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_SOURCE_FM_RX
+ { AUDIO_SOURCE_FM_RX, "fm rx" },
+#endif
+#ifdef HAVE_ENUM_AUDIO_SOURCE_FM_RX_A2DP
+ { AUDIO_SOURCE_FM_RX_A2DP, "fm rx a2dp" },
+#endif
+
+ { (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 ),
+
+ /* Audio output flags which may or may not be defined for all devices,
+ * update configure.ac CC_CHECK_DROID_ENUM list if you encounter new ones. */
+#ifdef HAVE_ENUM_AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD
+ STRING_ENTRY( AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_OUTPUT_FLAG_NON_BLOCKING
+ STRING_ENTRY( AUDIO_OUTPUT_FLAG_NON_BLOCKING ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_OUTPUT_FLAG_HW_AV_SYNC
+ STRING_ENTRY( AUDIO_OUTPUT_FLAG_HW_AV_SYNC ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_OUTPUT_FLAG_VOIP_RX
+ STRING_ENTRY( AUDIO_OUTPUT_FLAG_VOIP_RX ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_OUTPUT_FLAG_INCALL_MUSIC
+ STRING_ENTRY( AUDIO_OUTPUT_FLAG_INCALL_MUSIC ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH
+ STRING_ENTRY( AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_OUTPUT_FLAG_TTS
+ STRING_ENTRY( AUDIO_OUTPUT_FLAG_TTS ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_OUTPUT_FLAG_RAW
+ STRING_ENTRY( AUDIO_OUTPUT_FLAG_RAW ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_OUTPUT_FLAG_SYNC
+ STRING_ENTRY( AUDIO_OUTPUT_FLAG_SYNC ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO
+ STRING_ENTRY( AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO ),
+#endif
+
+ { 0, NULL }
+};
+
+struct string_conversion string_conversion_table_input_flag[] = {
+ /* Audio output flags which may or may not be defined for all devices,
+ * update configure.ac CC_CHECK_DROID_ENUM list if you encounter new ones. */
+#ifdef HAVE_ENUM_AUDIO_INPUT_FLAG_NONE
+ STRING_ENTRY( AUDIO_INPUT_FLAG_NONE ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_INPUT_FLAG_FAST
+ STRING_ENTRY( AUDIO_INPUT_FLAG_FAST ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_INPUT_FLAG_HW_HOTWORD
+ STRING_ENTRY( AUDIO_INPUT_FLAG_HW_HOTWORD ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_INPUT_FLAG_RAW
+ STRING_ENTRY( AUDIO_INPUT_FLAG_RAW ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_INPUT_FLAG_SYNC
+ STRING_ENTRY( AUDIO_INPUT_FLAG_SYNC ),
+#endif
+
+ { 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 ),
+#ifdef HAVE_ENUM_AUDIO_CHANNEL_OUT_SURROUND
+ STRING_ENTRY( AUDIO_CHANNEL_OUT_SURROUND ),
+#endif
+ STRING_ENTRY( AUDIO_CHANNEL_OUT_5POINT1 ),
+#ifdef HAVE_ENUM_AUDIO_CHANNEL_OUT_5POINT1_BACK
+ STRING_ENTRY( AUDIO_CHANNEL_OUT_5POINT1_BACK ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_CHANNEL_OUT_5POINT1_SIDE
+ STRING_ENTRY( AUDIO_CHANNEL_OUT_5POINT1_SIDE ),
+#endif
+ 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_FRONT_BACK ),
+ STRING_ENTRY( AUDIO_CHANNEL_IN_ALL ),
+#ifdef HAVE_ENUM_AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO
+ STRING_ENTRY( AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_CHANNEL_IN_VOICE_DNLINK_MONO
+ STRING_ENTRY( AUDIO_CHANNEL_IN_VOICE_DNLINK_MONO ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_CHANNEL_IN_VOICE_CALL_MONO
+ STRING_ENTRY( AUDIO_CHANNEL_IN_VOICE_CALL_MONO ),
+#endif
+
+ { 0, NULL }
+};
+
+/* Formats */
+struct string_conversion string_conversion_table_format[] = {
+ /* Omit most formats as we aren't usually interested in
+ * other than the pcm formats anyway. */
+ 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_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 ),
+
+ /* Audio formats which may or may not be defined for all devices,
+ * update configure.ac CC_CHECK_DROID_ENUM list if you encounter new ones. */
+#ifdef HAVE_ENUM_AUDIO_FORMAT_PCM_OFFLOAD
+ STRING_ENTRY( AUDIO_FORMAT_PCM_OFFLOAD ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_FORMAT_FLAC
+ STRING_ENTRY( AUDIO_FORMAT_FLAC ),
+#endif
+#ifdef HAVE_ENUM_AUDIO_FORMAT_OPUS
+ STRING_ENTRY( AUDIO_FORMAT_OPUS ),
+#endif
+
+ { 0, NULL }
+};
+
+#undef STRING_ENTRY
+#endif
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/src/common/droid-util.c
^
|
@@ -25,6 +25,7 @@
#include <signal.h>
#include <stdio.h>
+#include <string.h>
#ifdef HAVE_VALGRIND_MEMCHECK_H
#include <valgrind/memcheck.h>
@@ -59,6 +60,46 @@
#include "droid-util.h"
+struct droid_quirk {
+ const char *name;
+ uint32_t value;
+};
+
+struct droid_quirk valid_quirks[] = {
+ { "input_atoi", QUIRK_INPUT_ATOI },
+ { "set_parameters", QUIRK_SET_PARAMETERS },
+ { "close_input", QUIRK_CLOSE_INPUT }
+};
+
+struct pa_droid_quirks {
+ bool enabled[QUIRK_COUNT];
+};
+
+#define SLLIST_APPEND(t, head, item) \
+ do { \
+ item->next = NULL; \
+ if (!head) { \
+ head = item; \
+ } else { \
+ t *_list; \
+ for (_list = head; _list->next; _list = _list->next); \
+ _list->next = item; \
+ } \
+ } while (0)
+
+#define SLLIST_FOREACH(i, head) \
+ for (i = (head); i; i = i->next)
+
+#define SLLIST_STEAL_FIRST(i, head) \
+ do { \
+ if (head) { \
+ i = head; \
+ head = head->next; \
+ } else \
+ i = NULL; \
+ } while (0)
+
+
#define CONVERT_FUNC(TABL) \
bool pa_convert_ ## TABL (uint32_t value, pa_conversion_field_t field, uint32_t *to_value) { \
for (unsigned int i = 0; i < sizeof( conversion_table_ ## TABL )/(sizeof(uint32_t)*2); i++) { \
@@ -82,11 +123,26 @@
/* Section defining custom global configuration variables. */
#define GLOBAL_CONFIG_EXT_TAG "custom_properties"
+/* From recent audio_policy_conf.h */
+#ifndef AUDIO_HAL_VERSION_TAG
+#define AUDIO_HAL_VERSION_TAG "audio_hal_version"
+#endif
+#ifndef GAINS_TAG
+#define GAINS_TAG "gains"
+#endif
+
+#define GAIN_TAG_PREFIX "gain_"
+
+
static const char * const droid_combined_auto_outputs[3] = { "primary", "low_latency", NULL };
static const char * const droid_combined_auto_inputs[2] = { "primary", NULL };
+static void droid_config_free(pa_droid_config_audio *config);
static void droid_port_free(pa_droid_port *p);
+static pa_droid_stream *get_primary_output(pa_droid_hw_module *hw);
+static int input_stream_set_route(pa_droid_stream *s, audio_devices_t device);
+
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(to_str);
@@ -118,13 +174,13 @@
char *str = NULL;
char *tmp;
-#if DROID_HAL >= 2
+#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++) {
-#if DROID_HAL >= 2
+#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;
@@ -189,7 +245,7 @@
bool pa_input_device_default_audio_source(audio_devices_t input_device, audio_source_t *default_source)
{
-#if DROID_HAL >= 2
+#if AUDIO_API_VERSION_MAJ >= 2
input_device &= ~AUDIO_DEVICE_BIT_IN;
#endif
@@ -260,7 +316,7 @@
while ((entry = pa_split(str, "|", &state))) {
int32_t val;
-#if DROID_HAL >= 3
+#if AUDIO_API_VERSION_MAJ >= 3
if (pos == 0 && pa_streq(entry, "dynamic")) {
sampling_rates[pos++] = (uint32_t) -1;
pa_xfree(entry);
@@ -303,7 +359,7 @@
fail = must_have_all && unknown;
if (unknown) {
- pa_log_warn("[%s:%u] Unknown %s entries: %s", fn, ln, field, unknown);
+ pa_log_info("[%s:%u] Unknown %s entries: %s", fn, ln, field, unknown);
pa_xfree(unknown);
}
@@ -324,7 +380,7 @@
pa_assert(str);
pa_assert(formats);
-#if DROID_HAL >= 3
+#if AUDIO_API_VERSION_MAJ >= 3
/* Needs to be probed later */
if (pa_streq(str, "dynamic")) {
*formats = 0;
@@ -337,8 +393,8 @@
return check_and_log(fn, ln, "formats", count, str, unknown, false);
}
-static int parse_channels(const char *fn, const unsigned ln,
- const char *str, bool in_output, audio_channel_mask_t *channels) {
+static bool parse_channels(const char *fn, const unsigned ln,
+ const char *str, bool in_output, audio_channel_mask_t *channels) {
int count;
char *unknown = NULL;
@@ -391,7 +447,7 @@
return check_and_log(fn, ln, "flags", count, str, unknown, false);
}
-#if DROID_HAL >= 3
+#if AUDIO_API_VERSION_MAJ >= 3
static bool parse_input_flags(const char *fn, const unsigned ln,
const char *str, audio_input_flags_t *flags) {
int count;
@@ -407,6 +463,27 @@
}
#endif
+static bool parse_version(const char *fn, const unsigned ln, const char *str, uint32_t *version) {
+ uint32_t version_maj;
+ uint32_t version_min;
+
+ pa_assert(fn);
+ pa_assert(str);
+ pa_assert(version);
+
+ if ((sscanf(str, "%u.%u", &version_maj, &version_min)) != 2) {
+ pa_log("[%s:%u] Failed to parse %s (%s).", fn, ln, AUDIO_HAL_VERSION_TAG, str);
+ return false;
+ } else {
+ *version = HARDWARE_DEVICE_API_VERSION(version_maj, version_min);
+ return true;
+ }
+}
+
+static void log_parse_error(const char *fn, const unsigned ln, const char *section, const char *v) {
+ pa_log("[%s:%u] failed to parse line in section %s: unknown section (%s)", fn, ln, section, v);
+}
+
#define MAX_LINE_LENGTH (1024)
bool pa_parse_droid_audio_config(const char *filename, pa_droid_config_audio *config) {
@@ -414,6 +491,7 @@
unsigned n = 0;
bool ret = true;
char *full_line = NULL;
+ uint32_t hw_module_count = 0;
enum config_loc {
IN_ROOT = 0,
@@ -422,7 +500,12 @@
IN_HW_MODULES = 3,
IN_MODULE = 4,
IN_OUTPUT_INPUT = 5,
- IN_CONFIG = 6
+ IN_CONFIG = 6,
+ IN_MODULE_GLOBAL = 10,
+ IN_DEVICES = 20,
+ IN_DEVICES_DEVICE = 21,
+ IN_GAINS = 22,
+ IN_GAIN_N = 23
} loc = IN_ROOT;
bool in_output = true;
@@ -435,6 +518,7 @@
pa_assert(config);
memset(config, 0, sizeof(pa_droid_config_audio));
+ config->global_config = pa_xnew0(pa_droid_config_global, 1);
f = fopen(filename, "r");
@@ -490,7 +574,7 @@
else if (pa_streq(v, AUDIO_HW_MODULE_TAG))
loc = IN_HW_MODULES;
else {
- pa_log("[%s:%u] failed to parse line - unknown field (%s)", filename, n, v);
+ log_parse_error(filename, n, "<root>", v);
ret = false;
goto finish;
}
@@ -500,30 +584,39 @@
if (pa_streq(v, GLOBAL_CONFIG_EXT_TAG))
loc = IN_GLOBAL_EXT;
else {
- pa_log("[%s:%u] failed to parse line - unknown section (%s)", filename, n, v);
+ log_parse_error(filename, n, GLOBAL_CONFIG_TAG, v);
ret = false;
goto finish;
}
break;
case IN_HW_MODULES:
- module = &config->hw_modules[config->hw_modules_size];
- config->hw_modules_size++;
- strncpy(module->name, v, AUDIO_HARDWARE_MODULE_ID_MAX_LEN);
+ pa_assert(!module);
+
+ module = pa_xnew0(pa_droid_config_hw_module, 1);
+ SLLIST_APPEND(pa_droid_config_hw_module, config->hw_modules, module);
+ hw_module_count++;
+ module->name = pa_xstrndup(v, AUDIO_HARDWARE_MODULE_ID_MAX_LEN);
module->config = config;
loc = IN_MODULE;
pa_log_debug("config: New module: %s", module->name);
break;
case IN_MODULE:
+ pa_assert(module);
+
if (pa_streq(v, OUTPUTS_TAG)) {
loc = IN_OUTPUT_INPUT;
in_output = true;
} else if (pa_streq(v, INPUTS_TAG)) {
loc = IN_OUTPUT_INPUT;
in_output = false;
+ } else if (pa_streq(v, GLOBAL_CONFIG_TAG)) {
+ loc = IN_MODULE_GLOBAL;
+ } else if (pa_streq(v, DEVICES_TAG)) {
+ loc = IN_DEVICES;
} else {
- pa_log("[%s:%u] failed to parse line - unknown field (%s)", filename, n, v);
+ log_parse_error(filename, n, module->name, v);
ret = false;
goto finish;
}
@@ -533,29 +626,64 @@
pa_assert(module);
if (in_output) {
- output = &module->outputs[module->outputs_size];
- module->outputs_size++;
- strncpy(output->name, v, AUDIO_HARDWARE_MODULE_ID_MAX_LEN);
+ output = pa_xnew0(pa_droid_config_output, 1);
+ SLLIST_APPEND(pa_droid_config_output, module->outputs, output);
+ output->name = pa_xstrndup(v, AUDIO_HARDWARE_MODULE_ID_MAX_LEN);
output->module = module;
loc = IN_CONFIG;
pa_log_debug("config: %s: New output: %s", module->name, output->name);
} else {
- input = &module->inputs[module->inputs_size];
- module->inputs_size++;
- strncpy(input->name, v, AUDIO_HARDWARE_MODULE_ID_MAX_LEN);
+ input = pa_xnew0(pa_droid_config_input, 1);
+ SLLIST_APPEND(pa_droid_config_input, module->inputs, input);
+ input->name = pa_xstrndup(v, AUDIO_HARDWARE_MODULE_ID_MAX_LEN);
input->module = module;
loc = IN_CONFIG;
pa_log_debug("config: %s: New input: %s", module->name, input->name);
}
break;
+ case IN_DEVICES:
+ /* TODO Missing implementation of parsing the module/devices section.
+ * As of now there is no need for the information, fix this when that
+ * changes. */
+ loc = IN_DEVICES_DEVICE;
+ break;
+
+ case IN_DEVICES_DEVICE:
+ if (pa_streq(v, GAINS_TAG))
+ loc = IN_GAINS;
+ else {
+ log_parse_error(filename, n, DEVICES_TAG, v);
+ ret = false;
+ goto finish;
+ }
+ break;
+
+ case IN_GAINS:
+ /* TODO Missing implementation of parsing the gain_n section.
+ * As of now there is no need for the information, fix this when that
+ * changes. */
+ if (pa_startswith(v, GAIN_TAG_PREFIX))
+ loc = IN_GAIN_N;
+ else {
+ log_parse_error(filename, n, GAINS_TAG, v);
+ ret = false;
+ goto finish;
+ }
+ break;
+
case IN_CONFIG:
- pa_log("[%s:%u] failed to parse line - unknown field in config (%s)", filename, n, v);
- ret = false;
- goto finish;
+ if (pa_streq(v, GAINS_TAG)) {
+ loc = IN_GAINS;
+ } else {
+ log_parse_error(filename, n, in_output ? output->name : input->name, v);
+ ret = false;
+ goto finish;
+ }
+ break;
default:
- pa_log("[%s:%u] failed to parse line - unknown section (%s)", filename, n, v);
+ pa_log("[%s:%u] failed to parse line: unknown section (%s)", filename, n, v);
ret = false;
goto finish;
}
@@ -572,19 +700,38 @@
goto finish;
case IN_HW_MODULES:
- module = NULL;
/* fall through */
case IN_GLOBAL:
loc = IN_ROOT;
break;
+ case IN_MODULE:
+ module = NULL;
+ loc = IN_HW_MODULES;
+ break;
+
+ case IN_DEVICES:
+ /* fall through */
+ case IN_MODULE_GLOBAL:
+ loc = IN_MODULE;
+ break;
+
+ case IN_GAINS:
+ if (output || input)
+ loc = IN_CONFIG;
+ else
+ loc = IN_DEVICES_DEVICE;
+ break;
+
case IN_OUTPUT_INPUT:
if (in_output)
output = NULL;
else
input = NULL;
/* fall through */
- case IN_MODULE:
+ case IN_GAIN_N:
+ /* fall through */
+ case IN_DEVICES_DEVICE:
/* fall through */
case IN_CONFIG:
/* fall through */
@@ -596,25 +743,43 @@
continue;
}
+ /* Parsing of values */
if (loc == IN_GLOBAL ||
loc == IN_GLOBAL_EXT ||
- loc == IN_CONFIG) {
+ loc == IN_MODULE_GLOBAL ||
+ loc == IN_CONFIG ||
+ loc == IN_DEVICES_DEVICE ||
+ loc == IN_GAIN_N) {
bool success = false;
- if (loc == IN_GLOBAL) {
+ if (loc == IN_GLOBAL || loc == IN_MODULE_GLOBAL) {
+ pa_droid_config_global *global_config = NULL;
+
+ if (loc == IN_MODULE_GLOBAL) {
+ pa_assert(module);
+ if (!module->global_config)
+ module->global_config = pa_xnew0(pa_droid_config_global, 1);
+ global_config = module->global_config;
+ } else
+ global_config = config->global_config;
+
+ pa_assert(global_config);
/* Parse global configuration */
if (pa_streq(v, ATTACHED_OUTPUT_DEVICES_TAG))
success = parse_devices(filename, n, value, true,
- &config->global_config.attached_output_devices, false);
+ &global_config->attached_output_devices, false);
else if (pa_streq(v, DEFAULT_OUTPUT_DEVICE_TAG))
success = parse_devices(filename, n, value, true,
- &config->global_config.default_output_device, true);
+ &global_config->default_output_device, true);
else if (pa_streq(v, ATTACHED_INPUT_DEVICES_TAG))
success = parse_devices(filename, n, value, false,
- &config->global_config.attached_input_devices, false);
+ &global_config->attached_input_devices, false);
+ else if (pa_streq(v, AUDIO_HAL_VERSION_TAG))
+ success = parse_version(filename, n, value,
+ &global_config->audio_hal_version);
#ifdef DROID_HAVE_DRC
// SPEAKER_DRC_ENABLED_TAG is only from Android v4.4
else if (pa_streq(v, SPEAKER_DRC_ENABLED_TAG))
@@ -665,7 +830,7 @@
if (in_output)
success = parse_output_flags(filename, n, value, &output->flags);
else {
-#if DROID_HAL >= 3
+#if AUDIO_API_VERSION_MAJ >= 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);
@@ -677,6 +842,16 @@
success = false;
}
+ } else if (loc == IN_DEVICES_DEVICE) {
+ /* TODO Missing implementation of parsing the module/devices section.
+ * As of now there is no need for the information, fix this when that
+ * changes. */
+ success = true;
+ } else if (loc == IN_GAIN_N) {
+ /* TODO Missing implementation of parsing the gain_n section.
+ * As of now there is no need for the information, fix this when that
+ * changes. */
+ success = true;
} else
pa_assert_not_reached();
@@ -687,7 +862,7 @@
}
}
- pa_log_info("Parsed config file (%s): %u modules.", filename, config->hw_modules_size);
+ pa_log_info("Parsed config file (%s): %u modules.", filename, hw_module_count);
finish:
if (f) {
@@ -702,36 +877,42 @@
const pa_droid_config_output *pa_droid_config_find_output(const pa_droid_config_hw_module *module, const char *name) {
+ pa_droid_config_output *output;
+
pa_assert(module);
pa_assert(name);
- for (unsigned i = 0; i < module->outputs_size; i++) {
- if (pa_streq(name, module->outputs[i].name))
- return &module->outputs[i];
+ SLLIST_FOREACH(output, module->outputs) {
+ if (pa_streq(name, output->name))
+ return output;
}
return NULL;
}
const pa_droid_config_input *pa_droid_config_find_input(const pa_droid_config_hw_module *module, const char *name) {
+ pa_droid_config_input *input;
+
pa_assert(module);
pa_assert(name);
- for (unsigned i = 0; i < module->inputs_size; i++) {
- if (pa_streq(name, module->inputs[i].name))
- return &module->inputs[i];
+ SLLIST_FOREACH(input, module->inputs) {
+ if (pa_streq(name, input->name))
+ return input;
}
return NULL;
}
const pa_droid_config_hw_module *pa_droid_config_find_module(const pa_droid_config_audio *config, const char* module_id) {
+ pa_droid_config_hw_module *module;
+
pa_assert(config);
pa_assert(module_id);
- for (unsigned i = 0; i < config->hw_modules_size; i++) {
- if (pa_streq(module_id, config->hw_modules[i].name))
- return &config->hw_modules[i];
+ SLLIST_FOREACH(module, config->hw_modules) {
+ if (pa_streq(module_id, module->name))
+ return module;
}
return NULL;
@@ -839,8 +1020,8 @@
* are added to the combined profile. */
static pa_droid_profile *add_combined_profile(pa_droid_profile_set *ps,
const pa_droid_config_hw_module *module,
- const pa_strlist *outputs,
- const pa_strlist *inputs) {
+ pa_strlist *outputs,
+ pa_strlist *inputs) {
pa_droid_profile *p;
char *description;
char *o_str;
@@ -848,6 +1029,8 @@
pa_strlist *to_outputs = NULL;
pa_strlist *to_inputs = NULL;
pa_droid_mapping *am;
+ pa_droid_config_output *output;
+ pa_droid_config_input *input;
pa_assert(ps);
pa_assert(module);
@@ -855,20 +1038,20 @@
if (outputs) {
if (str_in_strlist(PA_DROID_COMBINED_AUTO, outputs)) {
for (unsigned i = 0; droid_combined_auto_outputs[i]; i++) {
- for (unsigned j = 0; j < module->outputs_size; j++) {
- if (pa_streq(droid_combined_auto_outputs[i], module->outputs[j].name)) {
- pa_log_debug("Auto add to combined profile output %s", module->outputs[j].name);
- to_outputs = pa_strlist_prepend(to_outputs, module->outputs[j].name);
+ SLLIST_FOREACH(output, module->outputs) {
+ if (pa_streq(droid_combined_auto_outputs[i], output->name)) {
+ pa_log_debug("Auto add to combined profile output %s", output->name);
+ to_outputs = pa_strlist_prepend(to_outputs, output->name);
}
}
}
} else {
- for (unsigned i = 0; i < module->outputs_size; i++) {
+ SLLIST_FOREACH(output, module->outputs) {
if (!str_in_strlist(PA_DROID_COMBINED_ALL, outputs) &&
- !str_in_strlist(module->outputs[i].name, outputs))
+ !str_in_strlist(output->name, outputs))
continue;
- to_outputs = pa_strlist_prepend(to_outputs, module->outputs[i].name);
+ to_outputs = pa_strlist_prepend(to_outputs, output->name);
}
}
@@ -878,20 +1061,20 @@
if (inputs) {
if (str_in_strlist(PA_DROID_COMBINED_AUTO, inputs)) {
for (unsigned i = 0; droid_combined_auto_inputs[i]; i++) {
- for (unsigned j = 0; j < module->inputs_size; j++) {
- if (pa_streq(droid_combined_auto_inputs[i], module->inputs[j].name)) {
- pa_log_debug("Auto add to combined profile input %s", module->inputs[j].name);
- to_inputs = pa_strlist_prepend(to_inputs, module->inputs[j].name);
+ SLLIST_FOREACH(input, module->inputs) {
+ if (pa_streq(droid_combined_auto_inputs[i], input->name)) {
+ pa_log_debug("Auto add to combined profile input %s", input->name);
+ to_inputs = pa_strlist_prepend(to_inputs, input->name);
}
}
}
} else {
- for (unsigned i = 0; i < module->inputs_size; i++) {
+ SLLIST_FOREACH(input, module->inputs) {
if (!str_in_strlist(PA_DROID_COMBINED_ALL, inputs) &&
- !str_in_strlist(module->inputs[i].name, inputs))
+ !str_in_strlist(input->name, inputs))
continue;
- to_inputs = pa_strlist_prepend(to_inputs, module->inputs[i].name);
+ to_inputs = pa_strlist_prepend(to_inputs, input->name);
}
}
@@ -920,27 +1103,27 @@
pa_xfree(i_str);
if (to_outputs) {
- for (unsigned i = 0; i < module->outputs_size; i++) {
- if (!str_in_strlist(module->outputs[i].name, to_outputs))
+ SLLIST_FOREACH(output, module->outputs) {
+ if (!str_in_strlist(output->name, to_outputs))
continue;
- am = pa_droid_mapping_get(ps, PA_DIRECTION_OUTPUT, &module->outputs[i]);
+ am = pa_droid_mapping_get(ps, PA_DIRECTION_OUTPUT, output);
pa_droid_profile_add_mapping(p, am);
- if (pa_streq(module->outputs[i].name, "primary"))
+ if (pa_streq(output->name, "primary"))
p->priority += DEFAULT_PRIORITY;
}
}
if (to_inputs) {
- for (unsigned i = 0; i < module->inputs_size; i++) {
- if (!str_in_strlist(module->inputs[i].name, to_inputs))
+ SLLIST_FOREACH(input, module->inputs) {
+ if (!str_in_strlist(input->name, to_inputs))
continue;
- am = pa_droid_mapping_get(ps, PA_DIRECTION_INPUT, &module->inputs[i]);
+ am = pa_droid_mapping_get(ps, PA_DIRECTION_INPUT, input);
pa_droid_profile_add_mapping(p, am);
- if (pa_streq(module->inputs[i].name, "primary"))
+ if (pa_streq(input->name, "primary"))
p->priority += DEFAULT_PRIORITY;
}
}
@@ -971,6 +1154,9 @@
}
static void add_all_profiles(pa_droid_profile_set *ps, const pa_droid_config_hw_module *module) {
+ pa_droid_config_output *output;
+ pa_droid_config_input *input;
+
pa_assert(ps);
pa_assert(module);
@@ -979,14 +1165,13 @@
* So for outputs "primary" and "hdmi" and input "primary" profiles
* "primary-primary" and "hdmi-primary" are created. */
- for (unsigned o = 0; o < module->outputs_size; o++) {
+ SLLIST_FOREACH(output, module->outputs) {
- if (module->inputs_size > 0) {
- for (unsigned i = 0; i < module->inputs_size; i++) {
- add_profile(ps, &module->outputs[o], &module->inputs[i]);
- }
+ if (module->inputs) {
+ SLLIST_FOREACH(input, module->inputs)
+ add_profile(ps, output, input);
} else
- add_profile(ps, &module->outputs[o], NULL);
+ add_profile(ps, output, NULL);
}
}
@@ -1000,8 +1185,8 @@
}
pa_droid_profile_set *pa_droid_profile_set_combined_new(const pa_droid_config_hw_module *module,
- const pa_strlist *outputs,
- const pa_strlist *inputs) {
+ pa_strlist *outputs,
+ pa_strlist *inputs) {
pa_droid_profile_set *ps;
ps = profile_set_new(module);
@@ -1080,10 +1265,12 @@
p->priority = DEFAULT_PRIORITY;
p->device = device;
- if (am->profile_set->config->global_config.attached_output_devices & device)
+ if (am->output->module->global_config ? am->output->module->global_config->attached_output_devices & device
+ : am->profile_set->config->global_config->attached_output_devices & device)
p->priority += DEFAULT_PRIORITY;
- if (am->profile_set->config->global_config.default_output_device & device)
+ if (am->output->module->global_config ? am->output->module->global_config->default_output_device & device
+ : am->profile_set->config->global_config->default_output_device & device)
p->priority += DEFAULT_PRIORITY;
return p;
@@ -1170,7 +1357,8 @@
p->priority = DEFAULT_PRIORITY;
p->device = device;
- if (am->profile_set->config->global_config.attached_input_devices & device)
+ if (am->input->module->global_config ? am->input->module->global_config->attached_input_devices & device
+ : am->profile_set->config->global_config->attached_input_devices & device)
p->priority += DEFAULT_PRIORITY;
pa_hashmap_put(am->profile_set->all_ports, p->name, p);
@@ -1183,14 +1371,13 @@
static void add_i_ports(pa_droid_mapping *am) {
pa_droid_port *p;
const char *name;
- char *desc;
uint32_t devices;
uint32_t i = 0;
pa_assert(am);
devices = am->input->devices | AUDIO_DEVICE_IN_DEFAULT;
-#if DROID_HAL >= 2
+#if AUDIO_API_VERSION_MAJ >= 2
devices &= ~AUDIO_DEVICE_BIT_IN;
#endif
@@ -1199,7 +1386,7 @@
if (devices & cur_device) {
-#if DROID_HAL >= 2
+#if AUDIO_API_VERSION_MAJ >= 2
cur_device |= AUDIO_DEVICE_BIT_IN;
#endif
@@ -1210,7 +1397,7 @@
}
}
-#if DROID_HAL == 1
+#if AUDIO_API_VERSION_MAJ == 1
/* HAL v1 has default input device defined as another input device,
* so we need to add it by hand here. */
add_i_port(am, AUDIO_DEVICE_IN_DEFAULT, "input-default");
@@ -1378,6 +1565,107 @@
add_ports(core, cp, ports, am, NULL);
}
+void pa_droid_quirk_log(pa_droid_hw_module *hw) {
+ uint32_t i;
+
+ pa_assert(hw);
+
+ if (hw->quirks) {
+ for (i = 0; i < sizeof(valid_quirks) / sizeof(struct droid_quirk); i++) {
+ if (hw->quirks->enabled[i]) {
+ pa_log_debug("Enabled quirks:");
+ for (i = 0; i < sizeof(valid_quirks) / sizeof(struct droid_quirk); i++)
+ if (hw->quirks->enabled[i])
+ pa_log_debug(" %s", valid_quirks[i].name);
+ return;
+ }
+ }
+ }
+}
+
+static pa_droid_quirks *get_quirks(pa_droid_quirks *q) {
+ if (!q)
+ q = pa_xnew0(pa_droid_quirks, 1);
+
+ return q;
+}
+
+static pa_droid_quirks *set_default_quirks(pa_droid_quirks *q) {
+ q = NULL;
+
+#if defined(DROID_AUDIO_HAL_ATOI_FIX)
+ q = get_quirks(q);
+ q->enabled[QUIRK_INPUT_ATOI] = true;
+#endif
+
+#if defined(DROID_DEVICE_ANZU) ||\
+ defined(DROID_DEVICE_COCONUT) || defined(DROID_DEVICE_HAIDA) ||\
+ defined(DROID_DEVICE_HALLON) || defined(DROID_DEVICE_IYOKAN) ||\
+ defined(DROID_DEVICE_MANGO) || defined(DROID_DEVICE_SATSUMA) ||\
+ defined(DROID_DEVICE_SMULTRON) || defined(DROID_DEVICE_URUSHI)
+#warning Using set_parameters hack, originating from previous cm10 mako.
+ q = get_quirks(q);
+ q->enabled[QUIRK_SET_PARAMETERS] = true;
+#endif
+
+ q = get_quirks(q);
+ q->enabled[QUIRK_CLOSE_INPUT] = true;
+
+ return q;
+}
+
+bool pa_droid_quirk_parse(pa_droid_hw_module *hw, const char *quirks) {
+ char *quirk = NULL;
+ char *d;
+ const char *state = NULL;
+
+ pa_assert(hw);
+ pa_assert(quirks);
+
+ hw->quirks = get_quirks(hw->quirks);
+
+ while ((quirk = pa_split(quirks, ",", &state))) {
+ uint32_t i;
+ bool enable = false;
+
+ if (strlen(quirk) < 2)
+ goto error;
+
+ d = quirk + 1;
+
+ if (quirk[0] == '+')
+ enable = true;
+ else if (quirk[0] == '-')
+ enable = false;
+ else
+ goto error;
+
+ for (i = 0; i < sizeof(valid_quirks) / sizeof(struct droid_quirk); i++) {
+ if (pa_streq(valid_quirks[i].name, d))
+ hw->quirks->enabled[valid_quirks[i].value] = enable;
+ }
+
+ pa_xfree(quirk);
+ }
+
+ return true;
+
+error:
+ pa_log("Incorrect quirk definition \"%s\" (\"%s\")", quirk ? quirk : "<null>", quirks);
+ pa_xfree(quirk);
+
+ return false;
+}
+
+bool pa_droid_quirk(pa_droid_hw_module *hw, enum pa_droid_quirk_type quirk) {
+ pa_assert(hw);
+
+ if (hw->quirks && hw->quirks->enabled[quirk])
+ return true;
+ else
+ return false;
+}
+
static char *shared_name_get(const char *module_id) {
pa_assert(module_id);
return pa_sprintf_malloc("droid-hardware-module-%s", module_id);
@@ -1388,11 +1676,14 @@
pa_droid_hw_module *hw = NULL;
struct hw_module_t *hwmod = NULL;
audio_hw_device_t *device = NULL;
+ int h;
int ret;
pa_assert(core);
pa_assert(module_id);
+ pa_log_info("Droid hw module %s", VERSION);
+
if (!config) {
pa_log("No configuration provided for opening module with id %s", module_id);
goto fail;
@@ -1403,25 +1694,28 @@
goto fail;
}
- hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, module->name, (const hw_module_t**) &hwmod);
- if (!hwmod) {
- pa_log("Failed to get hw module %s.", module->name);
+ ret = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, module->name, (const hw_module_t**) &hwmod);
+ if (ret) {
+ pa_log("Failed to load audio hw module %s.%s : %s (%d)", AUDIO_HARDWARE_MODULE_ID, module->name,
+ strerror(-ret), -ret);
goto fail;
}
- pa_log_info("Loaded hw module %s: %s (HAL %d.%d.%d)", DROID_DEVICE_STRING, module->name,
- ANDROID_VERSION_MAJOR,
- ANDROID_VERSION_MINOR,
- ANDROID_VERSION_PATCH);
+ pa_log_info("Loaded hw module %s.%s (%s)", AUDIO_HARDWARE_MODULE_ID, module->name, DROID_DEVICE_STRING);
ret = audio_hw_device_open(hwmod, &device);
- if (!device) {
- pa_log("Failed to open device (errno %d).", ret);
+ if (ret) {
+ pa_log("Failed to open audio hw device : %s (%d).", strerror(-ret), -ret);
goto fail;
}
+ pa_log_info("Opened hw audio device version %d.%d (This module compiled for API %d.%d, Android %d.%d.%d)",
+ AUDIO_API_VERSION_GET_MAJ(device->common.version), AUDIO_API_VERSION_GET_MIN(device->common.version),
+ AUDIO_API_VERSION_MAJ, AUDIO_API_VERSION_MIN,
+ ANDROID_VERSION_MAJOR, ANDROID_VERSION_MINOR, ANDROID_VERSION_PATCH);
+
if ((ret = device->init_check(device)) != 0) {
- pa_log("Failed init_check() (errno %d)", ret);
+ pa_log("Failed init_check() : %s (%d)", strerror(-ret), -ret);
goto fail;
}
@@ -1439,6 +1733,10 @@
hw->shared_name = shared_name_get(hw->module_id);
hw->outputs = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
hw->inputs = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+ hw->quirks = set_default_quirks(hw->quirks);
+
+ for (h = 0; h < PA_DROID_HOOK_MAX; h++)
+ pa_hook_init(&hw->hooks[h], hw);
pa_assert_se(pa_shared_set(core, hw->shared_name, hw) >= 0);
@@ -1480,12 +1778,17 @@
}
static void droid_hw_module_close(pa_droid_hw_module *hw) {
+ int h;
+
pa_assert(hw);
- pa_log_info("Closing hw module %s", hw->enabled_module->name);
+ pa_log_info("Closing hw module %s.%s (%s)", AUDIO_HARDWARE_MODULE_ID, hw->enabled_module->name, DROID_DEVICE_STRING);
+
+ for (h = 0; h < PA_DROID_HOOK_MAX; h++)
+ pa_hook_done(&hw->hooks[h]);
if (hw->config)
- pa_xfree(hw->config);
+ droid_config_free(hw->config);
if (hw->device)
audio_hw_device_close(hw->device);
@@ -1512,6 +1815,8 @@
pa_idxset_free(hw->inputs, NULL);
}
+ pa_xfree(hw->quirks);
+
pa_xfree(hw);
}
@@ -1527,6 +1832,37 @@
droid_hw_module_close(hw);
}
+static void droid_config_free(pa_droid_config_audio *config) {
+ pa_droid_config_hw_module *module;
+ pa_droid_config_output *output;
+ pa_droid_config_input *input;
+
+ pa_assert(config);
+
+ while (config->hw_modules) {
+ SLLIST_STEAL_FIRST(module, config->hw_modules);
+
+ while (module->outputs) {
+ SLLIST_STEAL_FIRST(output, module->outputs);
+ pa_xfree(output->name);
+ pa_xfree(output);
+ }
+
+ while (module->inputs) {
+ SLLIST_STEAL_FIRST(input, module->inputs);
+ pa_xfree(input->name);
+ pa_xfree(input);
+ }
+
+ pa_xfree(module->global_config);
+ pa_xfree(module->name);
+ pa_xfree(module);
+ }
+
+ pa_xfree(config->global_config);
+ pa_xfree(config);
+}
+
pa_droid_config_audio *pa_droid_config_load(pa_modargs *ma) {
pa_droid_config_audio *config;
const char *config_location;
@@ -1558,7 +1894,7 @@
return config;
fail:
- pa_xfree(config);
+ droid_config_free(config);
return NULL;
}
@@ -1591,48 +1927,105 @@
return s;
}
+static bool stream_config_fill(audio_devices_t devices,
+ pa_sample_spec *sample_spec,
+ pa_channel_map *channel_map,
+ struct audio_config *config) {
+ audio_format_t hal_audio_format = 0;
+ audio_channel_mask_t hal_channel_mask = 0;
+ bool voicecall_record = false;
+ bool output = true;
+
+ pa_assert(sample_spec);
+ pa_assert(channel_map);
+ pa_assert(config);
+
+#if AUDIO_API_VERSION_MAJ >= 2
+ if (devices & AUDIO_DEVICE_BIT_IN) {
+ output = false;
+ devices &= ~AUDIO_DEVICE_BIT_IN;
+ }
+#else
+ output = !(devices & AUDIO_DEVICE_IN_ALL);
+#endif
+
+ if (devices & AUDIO_DEVICE_IN_VOICE_CALL)
+ voicecall_record = true;
+
+ if (!pa_convert_format(sample_spec->format, CONV_FROM_PA, &hal_audio_format)) {
+ pa_log("Sample spec format %u not supported.", sample_spec->format);
+ goto fail;
+ }
+
+ for (int i = 0; i < channel_map->channels; i++) {
+ bool found;
+ audio_channel_mask_t c;
+
+ found = output ? pa_convert_output_channel(channel_map->map[i], CONV_FROM_PA, &c)
+ : pa_convert_input_channel(channel_map->map[i], CONV_FROM_PA, &c);
+
+ if (!found) {
+ pa_log("Failed to convert %s channel map.", output ? "output" : "input");
+ goto fail;
+ }
+
+ hal_channel_mask |= c;
+ }
+
+ if (voicecall_record) {
+ pa_channel_map_init_mono(channel_map);
+ sample_spec->channels = 1;
+ /* Only allow recording both downlink and uplink. */
+#if defined(QCOM_HARDWARE)
+ #if (ANDROID_VERSION_MAJOR <= 4) && defined(HAVE_ENUM_AUDIO_CHANNEL_IN_VOICE_CALL_MONO)
+ hal_channel_mask = AUDIO_CHANNEL_IN_VOICE_CALL_MONO;
+ #else
+ hal_channel_mask = AUDIO_CHANNEL_IN_MONO;
+ #endif
+#else
+ hal_channel_mask = AUDIO_CHANNEL_IN_VOICE_UPLINK | AUDIO_CHANNEL_IN_VOICE_DNLINK;
+#endif
+ }
+
+ memset(config, 0, sizeof(*config));
+ config->sample_rate = sample_spec->rate;
+ config->channel_mask = hal_channel_mask;
+ config->format = hal_audio_format;
+
+ return true;
+
+fail:
+ return false;
+}
+
pa_droid_stream *pa_droid_open_output_stream(pa_droid_hw_module *module,
const pa_sample_spec *spec,
const pa_channel_map *map,
audio_output_flags_t flags,
audio_devices_t devices) {
pa_droid_stream *s = NULL;
+ pa_droid_stream *primary_stream = NULL;
int ret;
struct audio_stream_out *stream;
- audio_format_t hal_audio_format = 0;
- audio_channel_mask_t hal_channel_mask = 0;
+ pa_channel_map channel_map;
+ pa_sample_spec sample_spec;
struct audio_config config_out;
- size_t buffer_size;
pa_assert(module);
pa_assert(spec);
pa_assert(map);
- if (!pa_convert_format(spec->format, CONV_FROM_PA, &hal_audio_format)) {
- pa_log("Sample spec format %u not supported.", spec->format);
- goto fail;
- }
-
- for (int i = 0; i < map->channels; i++) {
- audio_channel_mask_t c;
- if (!pa_convert_output_channel(map->map[i], CONV_FROM_PA, &c)) {
- pa_log("Failed to convert channel map.");
- goto fail;
- }
- hal_channel_mask |= c;
- }
+ sample_spec = *spec;
+ channel_map = *map;
- memset(&config_out, 0, sizeof(struct audio_config));
- config_out.sample_rate = spec->rate;
- config_out.channel_mask = hal_channel_mask;
- config_out.format = hal_audio_format;
+ if (!stream_config_fill(devices, &sample_spec, &channel_map, &config_out))
+ goto fail;
- if (pa_idxset_size(module->outputs) == 0) {
+ if (pa_idxset_size(module->outputs) == 0)
pa_log_debug("Set initial output device to %#010x", devices);
- module->output_device = devices;
- } else {
- pa_log_debug("Output with device %#010x already open, using as initial device.", module->output_device);
- devices = module->output_device;
+ else if ((primary_stream = get_primary_output(module))) {
+ pa_log_debug("Primary output with device %#010x already open, using as initial device.", primary_stream->device);
+ devices = primary_stream->device;
}
pa_droid_hw_module_lock(module);
@@ -1642,7 +2035,7 @@
flags,
&config_out,
&stream
-#if DROID_HAL >= 3
+#if AUDIO_API_VERSION_MAJ >= 3
/* Go with empty address, should work
* with most devices for now. */
, NULL
@@ -1659,24 +2052,27 @@
s->out = stream;
s->sample_spec = *spec;
s->channel_map = *map;
+ s->input_sample_spec = sample_spec;
+ s->input_channel_map = channel_map;
s->flags = flags;
+ s->device = devices;
if ((s->sample_spec.rate = s->out->common.get_sample_rate(&s->out->common)) != spec->rate)
pa_log_warn("Requested sample rate %u but got %u instead.", spec->rate, s->sample_spec.rate);
pa_idxset_put(module->outputs, s, NULL);
- buffer_size = s->out->common.get_buffer_size(&s->out->common);
+ s->buffer_size = s->out->common.get_buffer_size(&s->out->common);
pa_log_info("Opened droid output stream %p with device: %u flags: %u sample rate: %u channels: %u (%u) format: %u (%u) buffer size: %u (%llu usec)",
(void *) s,
devices,
s->flags,
s->sample_spec.rate,
- s->sample_spec.channels, hal_channel_mask,
- s->sample_spec.format, hal_audio_format,
- buffer_size,
- pa_bytes_to_usec(buffer_size, &s->sample_spec));
+ s->sample_spec.channels, config_out.channel_mask,
+ s->sample_spec.format, config_out.format,
+ s->buffer_size,
+ pa_bytes_to_usec(s->buffer_size, &s->sample_spec));
return s;
@@ -1686,119 +2082,140 @@
return NULL;
}
-pa_droid_stream *pa_droid_open_input_stream(pa_droid_hw_module *module,
- const pa_sample_spec *spec,
- const pa_channel_map *map,
- audio_devices_t devices) {
-
- pa_droid_stream *s = NULL;
- int ret;
+static int input_stream_open(pa_droid_stream *s) {
audio_stream_in_t *stream;
- audio_format_t hal_audio_format = 0;
- audio_channel_mask_t hal_channel_mask = 0;
+ audio_source_t audio_source = AUDIO_SOURCE_DEFAULT;
pa_channel_map channel_map;
pa_sample_spec sample_spec;
- bool voicecall_record = false;
struct audio_config config_in;
size_t buffer_size;
+ bool buffer_size_changed = false;
+ bool channel_map_changed = false;
+ int ret = -1;
-#if DROID_HAL >= 2
- if ((devices & ~AUDIO_DEVICE_BIT_IN) & AUDIO_DEVICE_IN_VOICE_CALL)
-#else
- if (devices & AUDIO_DEVICE_IN_VOICE_CALL)
-#endif
- voicecall_record = true;
-
- channel_map = *map;
- sample_spec = *spec;
-
- if (!pa_convert_format(spec->format, CONV_FROM_PA, &hal_audio_format)) {
- pa_log("Sample spec format %u not supported.", spec->format);
- goto fail;
- }
-
- for (int i = 0; i < map->channels; i++) {
- audio_channel_mask_t c;
- if (!pa_convert_input_channel(map->map[i], CONV_FROM_PA, &c)) {
- pa_log("Failed to convert channel map.");
- goto fail;
- }
- hal_channel_mask |= c;
- }
+ pa_assert(s);
+ pa_assert(!s->in);
- if (voicecall_record) {
- pa_channel_map_init_mono(&channel_map);
- sample_spec.channels = 1;
- /* Only allow recording both downlink and uplink. */
-#if defined(QCOM_HARDWARE)
- #if ANDROID_VERSION_MAJOR == 5 && ANDROID_VERSION_MINOR == 1
- hal_channel_mask = AUDIO_CHANNEL_IN_MONO;
- #else
- hal_channel_mask = AUDIO_CHANNEL_IN_VOICE_CALL_MONO;
- #endif
-#else
- hal_channel_mask = AUDIO_CHANNEL_IN_VOICE_UPLINK | AUDIO_CHANNEL_IN_VOICE_DNLINK;
-#endif
- }
+ channel_map = s->channel_map;
+ sample_spec = s->sample_spec;
- memset(&config_in, 0, sizeof(struct audio_config));
- config_in.sample_rate = sample_spec.rate;
- config_in.channel_mask = hal_channel_mask;
- config_in.format = hal_audio_format;
+ if (!stream_config_fill(s->device, &sample_spec, &channel_map, &config_in))
+ goto done;
- pa_droid_hw_module_lock(module);
- ret = module->device->open_input_stream(module->device,
- module->stream_in_id++,
- devices,
- &config_in,
- &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 */
+ pa_input_device_default_audio_source(s->device, &audio_source);
+
+ if (channel_map.channels != s->input_channel_map.channels)
+ channel_map_changed = true;
+
+ pa_droid_hw_module_lock(s->module);
+ ret = s->module->device->open_input_stream(s->module->device,
+ s->module->stream_in_id++,
+ s->device,
+ &config_in,
+ &stream
+#if AUDIO_API_VERSION_MAJ >= 3
+ , s->flags
+ , NULL /* Don't define address */
+ , audio_source
#endif
- );
- pa_droid_hw_module_unlock(module);
+ );
+ pa_droid_hw_module_unlock(s->module);
if (ret < 0 || !stream) {
pa_log("Failed to open input stream: %d with device: %u flags: %u sample rate: %u channels: %u (%u) format: %u (%u)",
ret,
- devices,
+ s->device,
0, /* AUDIO_INPUT_FLAG_NONE on v3. v1 and v2 don't have input flags. */
config_in.sample_rate,
sample_spec.channels,
config_in.channel_mask,
sample_spec.format,
config_in.format);
- goto fail;
+ goto done;
}
- s = droid_stream_new(module);
s->in = stream;
- s->sample_spec = sample_spec;
- s->channel_map = channel_map;
- s->flags = 0;
+ s->input_sample_spec = sample_spec;
+ s->input_channel_map = channel_map;
+ buffer_size = s->in->common.get_buffer_size(&s->in->common);
+ if (s->buffer_size != 0 && s->buffer_size != buffer_size)
+ buffer_size_changed = true;
+ s->buffer_size = buffer_size;
+
+ /* we need to call standby before reading with some devices. */
+ s->in->common.standby(&s->in->common);
+
+ pa_log_debug("Opened input stream %p", (void *) s);
+
+ input_stream_set_route(s, s->device);
+
+ if (buffer_size_changed) {
+ pa_log_debug("Input stream %p buffer size changed to %u.", (void *) s, s->buffer_size);
+ pa_hook_fire(&s->module->hooks[PA_DROID_HOOK_INPUT_BUFFER_SIZE_CHANGED], (void *) s);
+ }
+
+ if (channel_map_changed) {
+ pa_log_debug("Input stream %p channel count changed to %d.", (void *) s, s->input_channel_map.channels);
+ pa_hook_fire(&s->module->hooks[PA_DROID_HOOK_INPUT_CHANNEL_MAP_CHANGED], (void *) s);
+ }
+
+done:
+ return ret;
+}
+
+static void input_stream_close(pa_droid_stream *s) {
+ pa_assert(s);
+ pa_assert(s->in);
+
+ pa_mutex_lock(s->module->input_mutex);
+ s->module->device->close_input_stream(s->module->device, s->in);
+ s->in = NULL;
+ pa_log_debug("Closed input stream %p", (void *) s);
+ pa_mutex_unlock(s->module->input_mutex);
+}
+
+pa_droid_stream *pa_droid_open_input_stream(pa_droid_hw_module *module,
+ const pa_sample_spec *spec,
+ const pa_channel_map *map,
+ audio_devices_t devices) {
+
+ pa_droid_stream *s = NULL;
+ int ret = -1;
+
+ s = droid_stream_new(module);
+ s->sample_spec = *spec;
+ s->channel_map = *map;
+ s->flags = 0; /* AUDIO_INPUT_FLAG_NONE */
+ s->device = devices;
+
+ /* We need to open the stream for a while so that we can know
+ * what sample rate we get. We need the rate for droid source. */
+
+ if ((ret = input_stream_open(s)) < 0)
+ goto fail;
if ((s->sample_spec.rate = s->in->common.get_sample_rate(&s->in->common)) != spec->rate)
pa_log_warn("Requested sample rate %u but got %u instead.", spec->rate, s->sample_spec.rate);
pa_idxset_put(module->inputs, s, NULL);
- buffer_size = s->in->common.get_buffer_size(&s->in->common);
-
- /* As audio_source_t may not have any effect when opening the input stream
- * set input parameters immediately after opening the stream. */
- pa_droid_stream_set_input_route(s, devices, NULL);
-
- pa_log_info("Opened droid input stream %p with device: %u flags: %u sample rate: %u channels: %u (%u) format: %u (%u) buffer size: %u (%llu usec)",
+ pa_log_info("Opened droid input stream %p with device: %u flags: %u sample rate: %u channels: %u format: %u buffer size: %u (%llu usec)",
(void *) s,
devices,
s->flags,
s->sample_spec.rate,
- s->sample_spec.channels, hal_channel_mask,
- s->sample_spec.format, hal_audio_format,
- buffer_size,
- pa_bytes_to_usec(buffer_size, &s->sample_spec));
+ s->sample_spec.channels,
+ s->sample_spec.format,
+ s->buffer_size,
+ pa_bytes_to_usec(s->buffer_size, &s->sample_spec));
+
+ /* As audio_source_t may not have any effect when opening the input stream
+ * set input parameters immediately after opening the stream. */
+ if (!pa_droid_quirk(module, QUIRK_CLOSE_INPUT))
+ input_stream_set_route(s, devices);
+
+ /* We start the stream in suspended state. */
+ pa_droid_stream_suspend(s, true);
return s;
@@ -1810,7 +2227,6 @@
pa_droid_stream *pa_droid_stream_ref(pa_droid_stream *s) {
pa_assert(s);
- pa_assert(s->out || s->in);
pa_assert(PA_REFCNT_VALUE(s) >= 1);
PA_REFCNT_INC(s);
@@ -1819,7 +2235,6 @@
void pa_droid_stream_unref(pa_droid_stream *s) {
pa_assert(s);
- pa_assert(s->out || s->in);
pa_assert(PA_REFCNT_VALUE(s) >= 1);
if (PA_REFCNT_DEC(s) > 0)
@@ -1833,7 +2248,8 @@
} else {
pa_mutex_lock(s->module->input_mutex);
pa_idxset_remove_by_data(s->module->inputs, s, NULL);
- s->module->device->close_input_stream(s->module->device, s->in);
+ if (s->in)
+ s->module->device->close_input_stream(s->module->device, s->in);
pa_mutex_unlock(s->module->input_mutex);
}
@@ -1857,11 +2273,11 @@
return NULL;
}
-int pa_droid_stream_set_output_route(pa_droid_stream *s, audio_devices_t device) {
+static int droid_output_stream_set_route(pa_droid_stream *s, audio_devices_t device) {
pa_droid_stream *slave;
uint32_t idx;
- char *parameters;
- int ret;
+ char *parameters = NULL;
+ int ret = 0;
pa_assert(s);
pa_assert(s->out);
@@ -1870,9 +2286,9 @@
pa_mutex_lock(s->module->output_mutex);
- parameters = pa_sprintf_malloc("%s=%u;", AUDIO_PARAMETER_STREAM_ROUTING, device);
-
if (s->flags & AUDIO_OUTPUT_FLAG_PRIMARY || get_primary_output(s->module) == NULL) {
+ parameters = pa_sprintf_malloc("%s=%u;", AUDIO_PARAMETER_STREAM_ROUTING, device);
+
pa_log_debug("output stream %p set_parameters(%s) %#010x", (void *) s, parameters, device);
ret = s->out->common.set_parameters(&s->out->common, parameters);
@@ -1883,11 +2299,12 @@
pa_log_warn("output set_parameters(%s) failed", parameters);
} else {
/* Store last set output device. */
- s->module->output_device = device;
+ s->device = device;
}
}
if (s->flags & AUDIO_OUTPUT_FLAG_PRIMARY && pa_idxset_size(s->module->outputs) > 1) {
+ pa_assert(parameters);
PA_IDXSET_FOREACH(slave, s->module->outputs, idx) {
if (slave == s)
@@ -1901,7 +2318,8 @@
pa_log_warn("output set_parameters(%s) not allowed while stream is active", parameters);
else
pa_log_warn("output set_parameters(%s) failed", parameters);
- }
+ } else
+ slave->device = s->device;
}
}
@@ -1912,10 +2330,10 @@
return ret;
}
-int pa_droid_stream_set_input_route(pa_droid_stream *s, audio_devices_t device, audio_source_t *new_source) {
+static int input_stream_set_route(pa_droid_stream *s, audio_devices_t device) {
audio_source_t source = (uint32_t) -1;
char *parameters;
- int ret;
+ int ret = 0;
pa_assert(s);
pa_assert(s->in);
@@ -1924,51 +2342,67 @@
device &= ~AUDIO_DEVICE_BIT_IN;
#endif
- if (pa_input_device_default_audio_source(device, &source))
-#ifdef DROID_AUDIO_HAL_ATOI_FIX
- parameters = pa_sprintf_malloc("%s=%d;%s=%u", AUDIO_PARAMETER_STREAM_ROUTING, (int32_t) device,
- AUDIO_PARAMETER_STREAM_INPUT_SOURCE, source);
-#else
- parameters = pa_sprintf_malloc("%s=%u;%s=%u", AUDIO_PARAMETER_STREAM_ROUTING, device,
- AUDIO_PARAMETER_STREAM_INPUT_SOURCE, source);
-#endif
- else
- parameters = pa_sprintf_malloc("%s=%u", AUDIO_PARAMETER_STREAM_ROUTING, device);
+ if (pa_input_device_default_audio_source(device, &source)) {
+ if (pa_droid_quirk(s->module, QUIRK_INPUT_ATOI))
+ parameters = pa_sprintf_malloc("%s=%d;%s=%u", AUDIO_PARAMETER_STREAM_ROUTING, (int32_t) device,
+ AUDIO_PARAMETER_STREAM_INPUT_SOURCE, source);
+ else
+ parameters = pa_sprintf_malloc("%s=%u;%s=%u", AUDIO_PARAMETER_STREAM_ROUTING, device,
+ AUDIO_PARAMETER_STREAM_INPUT_SOURCE, source);
+ } else
+ parameters = pa_sprintf_malloc("%s=%u", AUDIO_PARAMETER_STREAM_ROUTING, device);
pa_log_debug("input stream %p set_parameters(%s) %#010x ; %#010x",
(void *) s, parameters, device, source);
-#if defined(DROID_DEVICE_ANZU) ||\
- defined(DROID_DEVICE_COCONUT) || defined(DROID_DEVICE_HAIDA) ||\
- defined(DROID_DEVICE_HALLON) || defined(DROID_DEVICE_IYOKAN) ||\
- defined(DROID_DEVICE_MANGO) || defined(DROID_DEVICE_SATSUMA) ||\
- defined(DROID_DEVICE_SMULTRON) || defined(DROID_DEVICE_URUSHI)
-#warning Using set_parameters hack, originating from previous cm10 mako.
- pa_mutex_lock(s->module->hw_mutex);
- ret = s->module->device->set_parameters(s->module->device, parameters);
- pa_mutex_unlock(s->module->hw_mutex);
-#else
- pa_mutex_lock(s->module->input_mutex);
- ret = s->in->common.set_parameters(&s->in->common, parameters);
- pa_mutex_unlock(s->module->input_mutex);
-#endif
+ if (pa_droid_quirk(s->module, QUIRK_SET_PARAMETERS)) {
+ pa_mutex_lock(s->module->hw_mutex);
+ ret = s->module->device->set_parameters(s->module->device, parameters);
+ pa_mutex_unlock(s->module->hw_mutex);
+ } else {
+ pa_mutex_lock(s->module->input_mutex);
+ ret = s->in->common.set_parameters(&s->in->common, parameters);
+ pa_mutex_unlock(s->module->input_mutex);
+ }
if (ret < 0) {
if (ret == -ENOSYS)
pa_log_warn("input set_parameters(%s) not allowed while stream is active", parameters);
else
pa_log_warn("input set_parameters(%s) failed", parameters);
- }
-
- if (new_source)
- *new_source = source;
+ } else
+ s->device = device;
pa_xfree(parameters);
return ret;
}
+static int droid_input_stream_set_route(pa_droid_stream *s, audio_devices_t device) {
+ int ret = 0;
+
+ pa_assert(s);
+
+ if (s->in) {
+ input_stream_set_route(s, device);
+ } else {
+ s->device = device;
+ pa_log_debug("input stream (inactive) %p store route %#010x", (void *) s, device);
+ }
+
+ return ret;
+}
+
+int pa_droid_stream_set_route(pa_droid_stream *s, audio_devices_t device) {
+ pa_assert(s);
+
+ if (s->out)
+ return droid_output_stream_set_route(s, device);
+ else
+ return droid_input_stream_set_route(s, device);
+}
+
int pa_droid_stream_set_parameters(pa_droid_stream *s, const char *parameters) {
int ret;
@@ -2028,7 +2462,6 @@
int pa_droid_stream_suspend(pa_droid_stream *s, bool suspend) {
pa_assert(s);
- pa_assert(s->out || s->in);
if (s->out) {
if (suspend) {
@@ -2036,14 +2469,26 @@
return s->out->common.standby(&s->out->common);
} else {
pa_atomic_inc(&s->module->active_outputs);
- return 0;
}
} else {
- if (suspend)
- return s->in->common.standby(&s->in->common);
- else
- return 0;
+ if (suspend) {
+ if (s->in) {
+ if (pa_droid_quirk(s->module, QUIRK_CLOSE_INPUT))
+ input_stream_close(s);
+ else
+ return s->in->common.standby(&s->in->common);
+ }
+ } else if (pa_droid_quirk(s->module, QUIRK_CLOSE_INPUT))
+ return input_stream_open(s);
}
+
+ return 0;
+}
+
+size_t pa_droid_stream_buffer_size(pa_droid_stream *s) {
+ pa_assert(s);
+
+ return s->buffer_size;
}
bool pa_sink_is_droid_sink(pa_sink *s) {
@@ -2056,3 +2501,24 @@
else
return false;
}
+
+size_t pa_droid_buffer_size_round_up(size_t buffer_size, size_t block_size) {
+ size_t r;
+
+ pa_assert(buffer_size);
+ pa_assert(block_size);
+
+ r = buffer_size % block_size;
+
+ if (r)
+ return buffer_size + block_size - r;
+
+ return buffer_size;
+}
+
+pa_hook *pa_droid_hooks(pa_droid_hw_module *hw) {
+ pa_assert(hw);
+ pa_assert(PA_REFCNT_VALUE(hw) >= 1);
+
+ return hw->hooks;
+}
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/src/common/droid-util.h
^
|
@@ -39,14 +39,26 @@
#if ANDROID_VERSION_MAJOR == 4 && ANDROID_VERSION_MINOR == 1
#include "droid-util-41qc.h"
-#elif ANDROID_VERSION_MAJOR == 4 && ANDROID_VERSION_MINOR == 2
-#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."
+#include "droid-util-audio.h"
+#endif
+
+/* We currently support API version up-to 3.0 */
+#define DROID_API_VERSION_SUPPORT HARDWARE_DEVICE_API_VERSION(3, 0)
+
+#if AUDIO_DEVICE_API_VERSION_CURRENT > DROID_API_VERSION_SUPPORT
+#warning Compiling against higher audio device API version than currently supported!
+#warning Compile likely fails or module may malfunction.
+#endif
+
+#define AUDIO_API_VERSION_MAJ ((AUDIO_DEVICE_API_VERSION_CURRENT >> 8) & 0xff)
+#define AUDIO_API_VERSION_MIN (AUDIO_DEVICE_API_VERSION_CURRENT & 0xff)
+
+#define AUDIO_API_VERSION_GET_MAJ(x) ((x >> 8) & 0xff)
+#define AUDIO_API_VERSION_GET_MIN(x) (x & 0xff)
+
+#if defined(QCOM_BSP) && (AUDIO_API_VERSION_MAJ >= 3)
+#define DROID_AUDIO_HAL_USE_VSID
#endif
#define PROP_DROID_DEVICES "droid.devices"
@@ -68,6 +80,15 @@
typedef struct pa_droid_config_audio pa_droid_config_audio;
typedef struct pa_droid_config_hw_module pa_droid_config_hw_module;
+typedef struct pa_droid_quirks pa_droid_quirks;
+
+typedef enum pa_droid_hook {
+ PA_DROID_HOOK_INPUT_CHANNEL_MAP_CHANGED, /* Call data: pa_droid_stream */
+ PA_DROID_HOOK_INPUT_BUFFER_SIZE_CHANGED, /* Call data: pa_droid_stream */
+ PA_DROID_HOOK_MAX
+} pa_droid_hook_t;
+
+
struct pa_droid_hw_module {
PA_REFCNT_DECLARE;
@@ -92,7 +113,9 @@
pa_idxset *inputs;
pa_atomic_t active_outputs;
- uint32_t output_device;
+
+ pa_droid_quirks *quirks;
+ pa_hook hooks[PA_DROID_HOOK_MAX];
};
struct pa_droid_stream {
@@ -102,7 +125,11 @@
pa_sample_spec sample_spec;
pa_channel_map channel_map;
+ pa_sample_spec input_sample_spec;
+ pa_channel_map input_channel_map;
uint32_t flags;
+ uint32_t device;
+ size_t buffer_size;
struct audio_stream_out *out;
struct audio_stream_in *in;
@@ -116,11 +143,9 @@
};
#define AUDIO_MAX_SAMPLING_RATES (32)
-#define AUDIO_MAX_HW_MODULES (8)
-#define AUDIO_MAX_INPUTS (8)
-#define AUDIO_MAX_OUTPUTS (8)
typedef struct pa_droid_config_global {
+ uint32_t audio_hal_version;
audio_devices_t attached_output_devices;
audio_devices_t default_output_device;
audio_devices_t attached_input_devices;
@@ -129,41 +154,46 @@
typedef struct pa_droid_config_output {
const pa_droid_config_hw_module *module;
- char name[AUDIO_HARDWARE_MODULE_ID_MAX_LEN];
+ char *name;
uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]; /* (uint32_t) -1 -> dynamic */
audio_channel_mask_t channel_masks; /* 0 -> dynamic */
audio_format_t formats; /* 0 -> dynamic */
audio_devices_t devices;
audio_output_flags_t flags;
+
+ struct pa_droid_config_output *next;
} pa_droid_config_output;
typedef struct pa_droid_config_input {
const pa_droid_config_hw_module *module;
- char name[AUDIO_HARDWARE_MODULE_ID_MAX_LEN];
+ char *name;
uint32_t sampling_rates[AUDIO_MAX_SAMPLING_RATES]; /* (uint32_t) -1 -> dynamic */
audio_channel_mask_t channel_masks; /* 0 -> dynamic */
audio_format_t formats; /* 0 -> dynamic */
audio_devices_t devices;
-#if DROID_HAL >= 3
+#if AUDIO_API_VERSION_MAJ >= 3
audio_input_flags_t flags;
#endif
+
+ struct pa_droid_config_input *next;
} pa_droid_config_input;
struct pa_droid_config_hw_module {
const pa_droid_config_audio *config;
- char name[AUDIO_HARDWARE_MODULE_ID_MAX_LEN];
- pa_droid_config_output outputs[AUDIO_MAX_OUTPUTS];
- uint32_t outputs_size;
- pa_droid_config_input inputs[AUDIO_MAX_INPUTS];
- uint32_t inputs_size;
+ char *name;
+ /* If global config is not defined for module, use root global config. */
+ pa_droid_config_global *global_config;
+ pa_droid_config_output *outputs;
+ pa_droid_config_input *inputs;
+
+ struct pa_droid_config_hw_module *next;
};
struct pa_droid_config_audio {
- pa_droid_config_global global_config;
- pa_droid_config_hw_module hw_modules[AUDIO_MAX_HW_MODULES];
- uint32_t hw_modules_size;
+ pa_droid_config_global *global_config;
+ pa_droid_config_hw_module *hw_modules;
};
@@ -233,6 +263,13 @@
#define PA_DROID_OUTPUT_PARKING "output-parking"
#define PA_DROID_INPUT_PARKING "input-parking"
+enum pa_droid_quirk_type {
+ QUIRK_INPUT_ATOI,
+ QUIRK_SET_PARAMETERS,
+ QUIRK_CLOSE_INPUT,
+ QUIRK_COUNT
+};
+
/* Open hardware module */
/* 'config' can be NULL if it is assumed that hw module with module_id already is open. */
/* if opening of hw_module succeeds, config ownership is transferred to hw_module and config
@@ -245,6 +282,10 @@
bool pa_droid_hw_module_try_lock(pa_droid_hw_module *hw);
void pa_droid_hw_module_unlock(pa_droid_hw_module *hw);
+bool pa_droid_quirk_parse(pa_droid_hw_module *hw, const char *quirks);
+bool pa_droid_quirk(pa_droid_hw_module *hw, enum pa_droid_quirk_type quirk);
+void pa_droid_quirk_log(pa_droid_hw_module *hw);
+
/* Conversion helpers */
typedef enum {
CONV_FROM_PA,
@@ -283,8 +324,8 @@
/* Profiles */
pa_droid_profile_set *pa_droid_profile_set_new(const pa_droid_config_hw_module *module);
pa_droid_profile_set *pa_droid_profile_set_combined_new(const pa_droid_config_hw_module *module,
- const pa_strlist *outputs,
- const pa_strlist *inputs);
+ pa_strlist *outputs,
+ pa_strlist *inputs);
void pa_droid_profile_set_free(pa_droid_profile_set *ps);
pa_droid_profile *pa_droid_profile_new(pa_droid_profile_set *ps, const pa_droid_config_output *output, const pa_droid_config_input *input);
@@ -312,6 +353,8 @@
/* Pretty audio source names */
bool pa_droid_audio_source_name(audio_source_t value, const char **to_str);
+pa_hook *pa_droid_hooks(pa_droid_hw_module *hw);
+
/* Module operations */
int pa_droid_set_parameters(pa_droid_hw_module *hw, const char *parameters);
@@ -328,29 +371,44 @@
audio_output_flags_t flags,
audio_devices_t devices);
-/* Set routing to the output stream, with following side-effects:
+/* Set routing to the input or output stream, with following side-effects:
+ * Output:
* - if routing is set to primary output stream, set routing to all other
* open streams as well
* - if routing is set to non-primary stream and primary stream exists, do nothing
* - if routing is set to non-primary stream and primary stream doesn't exist, set routing
+ * Input:
+ * - buffer size or channel count may change
*/
-int pa_droid_stream_set_output_route(pa_droid_stream *s, audio_devices_t device);
+int pa_droid_stream_set_route(pa_droid_stream *s, audio_devices_t device);
/* Input stream operations */
pa_droid_stream *pa_droid_open_input_stream(pa_droid_hw_module *module,
const pa_sample_spec *spec,
const pa_channel_map *map,
audio_devices_t devices);
-int pa_droid_stream_set_input_route(pa_droid_stream *s, audio_devices_t device, audio_source_t *new_source);
bool pa_droid_stream_is_primary(pa_droid_stream *s);
int pa_droid_stream_suspend(pa_droid_stream *s, bool suspend);
+size_t pa_droid_stream_buffer_size(pa_droid_stream *s);
+
static inline int pa_droid_output_stream_any_active(pa_droid_stream *s) {
return pa_atomic_load(&s->module->active_outputs);
}
+static inline ssize_t pa_droid_stream_write(pa_droid_stream *stream, const void *buffer, size_t bytes) {
+ return stream->out->write(stream->out, buffer, bytes);
+}
+
+static inline ssize_t pa_droid_stream_read(pa_droid_stream *stream, void *buffer, size_t bytes) {
+ return stream->in->read(stream->in, buffer, bytes);
+}
+
bool pa_sink_is_droid_sink(pa_sink *s);
+/* Misc */
+size_t pa_droid_buffer_size_round_up(size_t buffer_size, size_t block_size);
+
#endif
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/src/droid/droid-sink.c
^
|
@@ -95,7 +95,7 @@
char *voice_property_key;
char *voice_property_value;
pa_sink_input *voice_control_sink_input;
- pa_subscription *sink_input_subscription;
+ pa_hook_slot *sink_input_volume_changed_hook_slot;
pa_hook_slot *sink_input_put_hook_slot;
pa_hook_slot *sink_input_unlink_hook_slot;
@@ -213,7 +213,7 @@
routing = u->primary_devices | u->extra_devices;
- pa_droid_stream_set_output_route(u->stream, routing);
+ pa_droid_stream_set_route(u->stream, routing);
}
static bool parse_device_list(const char *str, audio_devices_t *dst) {
@@ -255,7 +255,7 @@
* here it's okay, as long as mute time isn't configured too strictly. */
p = pa_memblock_acquire(u->silence.memblock);
- wrote = u->stream->out->write(u->stream->out, (const uint8_t*) p + u->silence.index, u->silence.length);
+ wrote = pa_droid_stream_write(u->stream, (const uint8_t *) p + u->silence.index, u->silence.length);
pa_memblock_release(u->silence.memblock);
u->write_time = pa_rtclock_now() - u->write_time;
@@ -280,7 +280,7 @@
for (;;) {
p = pa_memblock_acquire(c.memblock);
- wrote = u->stream->out->write(u->stream->out, (const uint8_t*) p + c.index, c.length);
+ wrote = pa_droid_stream_write(u->stream, (const uint8_t *) p + c.index, c.length);
pa_memblock_release(c.memblock);
if (wrote < 0) {
@@ -633,11 +633,11 @@
pa_droid_hw_module_unlock(u->hw_module);
u->use_hw_volume = (ret == 0);
+ pa_log_debug("Using %s volume control with %s",
+ u->use_hw_volume ? "hardware" : "software", u->sink->name);
- if (pa_droid_stream_is_primary(u->stream)) {
- /* Apply callbacks */
- pa_droid_sink_set_voice_control(u->sink, false);
- }
+ if (u->use_hw_volume && pa_droid_stream_is_primary(u->stream))
+ pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb);
}
static void set_sink_name(pa_modargs *ma, pa_sink_new_data *data, const char *module_id) {
@@ -661,9 +661,22 @@
}
}
+static bool sink_input_is_voice_control(struct userdata *u, pa_sink_input *si) {
+ const char *val;
+
+ pa_assert(u);
+ pa_assert(si);
+
+ if ((val = pa_proplist_gets(si->proplist, u->voice_property_key))) {
+ if (pa_streq(val, u->voice_property_value))
+ return true;
+ }
+
+ return false;
+}
+
/* Called from main thread */
static pa_sink_input *find_volume_control_sink_input(struct userdata *u) {
- const char *val;
uint32_t idx;
pa_sink_input *i;
@@ -672,44 +685,31 @@
pa_assert(u->sink);
PA_IDXSET_FOREACH(i, u->sink->inputs, idx) {
- if ((val = pa_proplist_gets(i->proplist, u->voice_property_key))) {
- if (pa_streq(val, u->voice_property_value)) {
- return i;
- }
- }
+ if (sink_input_is_voice_control(u, i))
+ return i;
}
return NULL;
}
/* Called from main thread */
-static void sink_input_subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, struct userdata *u) {
- pa_sink_input *i;
+static pa_hook_result_t sink_input_volume_changed_hook_cb(pa_core *c, pa_sink_input *sink_input, struct userdata *u) {
+ pa_assert(c);
+ pa_assert(sink_input);
+ pa_assert(u);
- pa_assert_ctl_context();
+ if (!u->use_voice_volume)
+ return PA_HOOK_OK;
- if (t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_NEW) &&
- t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_CHANGE) &&
- t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_REMOVE))
- return;
+ if (!u->voice_control_sink_input && sink_input_is_voice_control(u, sink_input))
+ u->voice_control_sink_input = sink_input;
- if (!(i = pa_idxset_get_by_index(c->sink_inputs, idx)))
- return;
+ if (u->voice_control_sink_input != sink_input)
+ return PA_HOOK_OK;
- if (t == (PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_NEW)) {
- if (!u->voice_control_sink_input && (i = find_volume_control_sink_input(u))) {
- u->voice_control_sink_input = i;
- set_voice_volume(u, i);
- }
- }
- else if (t == (PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_CHANGE)) {
- if (u->voice_control_sink_input == i)
- set_voice_volume(u, i);
- }
- else if (t == (PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_REMOVE)) {
- if (u->voice_control_sink_input == i)
- u->voice_control_sink_input = NULL;
- }
+ set_voice_volume(u, sink_input);
+
+ return PA_HOOK_OK;
}
/* Called from main thread */
@@ -725,7 +725,7 @@
pa_assert(u->sink == sink);
if (!pa_droid_stream_is_primary(u->stream)) {
- pa_log_debug("skipping voice volume control with non-primary stream");
+ pa_log_debug("Skipping voice volume control with non-primary sink %s", u->sink->name);
return;
}
@@ -735,18 +735,15 @@
u->use_voice_volume = enable;
if (u->use_voice_volume) {
- pa_log_debug("Using voice volume control for %s", u->sink->name);
- pa_sink_set_set_volume_callback(u->sink, NULL);
+ pa_log_debug("Using voice volume control with %s", u->sink->name);
- /* Susbcription tracking voice call volume control sink-input is set up when
- * voice volume control is enabled. In case volume control sink-input has already
- * connected to the sink, check for the sink-input here as well. */
-
- if (!u->sink_input_subscription)
- u->sink_input_subscription = pa_subscription_new(u->core,
- PA_SUBSCRIPTION_MASK_SINK_INPUT,
- (pa_subscription_cb_t) sink_input_subscription_cb,
- u);
+ pa_assert(!u->sink_input_volume_changed_hook_slot);
+
+ if (u->use_hw_volume)
+ pa_sink_set_set_volume_callback(u->sink, NULL);
+
+ u->sink_input_volume_changed_hook_slot = pa_hook_connect(&u->core->hooks[PA_CORE_HOOK_SINK_INPUT_VOLUME_CHANGED],
+ PA_HOOK_LATE+10, (pa_hook_cb_t) sink_input_volume_changed_hook_cb, u);
if ((i = find_volume_control_sink_input(u))) {
u->voice_control_sink_input = i;
@@ -754,19 +751,17 @@
}
} else {
- if (u->sink_input_subscription) {
- pa_subscription_free(u->sink_input_subscription);
- u->sink_input_subscription = NULL;
- u->voice_control_sink_input = NULL;
- }
+ pa_assert(u->sink_input_volume_changed_hook_slot);
- if (u->use_hw_volume) {
- pa_log_debug("Using hardware volume control for %s", u->sink->name);
+ u->voice_control_sink_input = NULL;
+ pa_hook_slot_free(u->sink_input_volume_changed_hook_slot);
+ u->sink_input_volume_changed_hook_slot = NULL;
+
+ pa_log_debug("Using %s volume control with %s",
+ u->use_hw_volume ? "hardware" : "software", u->sink->name);
+
+ if (u->use_hw_volume)
pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb);
- } else {
- pa_log_debug("Using software volume control for %s", u->sink->name);
- pa_sink_set_set_volume_callback(u->sink, NULL);
- }
}
}
@@ -777,6 +772,11 @@
const char *media_str;
audio_devices_t devices;
+ if (u->use_voice_volume && !u->voice_control_sink_input && sink_input_is_voice_control(u, sink_input)) {
+ u->voice_control_sink_input = sink_input;
+ set_voice_volume(u, sink_input);
+ }
+
/* Dynamic routing changes do not apply during active voice call. */
if (u->use_voice_volume)
return PA_HOOK_OK;
@@ -808,6 +808,9 @@
const char *media_str;
audio_devices_t devices;
+ if (u->voice_control_sink_input == sink_input)
+ u->voice_control_sink_input = NULL;
+
/* Dynamic routing changes do not apply during active voice call. */
if (u->use_voice_volume)
return PA_HOOK_OK;
@@ -1066,7 +1069,6 @@
int32_t mute_routing_after = 0;
uint32_t sink_buffer = 0;
const char *prewrite_resume = NULL;
- int ret;
pa_assert(m);
pa_assert(ma);
@@ -1178,7 +1180,8 @@
}
/* Default routing */
- dev_out = u->hw_module->config->global_config.default_output_device;
+ dev_out = (am && am->output->module->global_config) ? am->output->module->global_config->default_output_device
+ : u->hw_module->config->global_config->default_output_device;
if ((tmp = pa_modargs_get_value(ma, "output_devices", NULL))) {
audio_devices_t tmp_dev;
@@ -1199,19 +1202,12 @@
goto fail;
}
- u->buffer_size = u->stream->out->common.get_buffer_size(&u->stream->out->common);
+ u->buffer_size = pa_droid_stream_buffer_size(u->stream);
if (sink_buffer) {
- if (sink_buffer < u->buffer_size)
- pa_log_warn("Requested buffer size %u less than HAL reported buffer size (%u).", sink_buffer, u->buffer_size);
- else if (sink_buffer % u->buffer_size) {
- uint32_t trunc = (sink_buffer / u->buffer_size) * u->buffer_size;
- pa_log_warn("Requested buffer size %u not multiple of HAL buffer size (%u). Using buffer size %u", sink_buffer, u->buffer_size, trunc);
- u->buffer_size = trunc;
- } else {
- pa_log_info("Using requested buffer size %u.", sink_buffer);
- u->buffer_size = sink_buffer;
- }
- }
+ u->buffer_size = pa_droid_buffer_size_round_up(sink_buffer, u->buffer_size);
+ pa_log_info("Using buffer size %u (requested %u).", u->buffer_size, sink_buffer);
+ } else
+ pa_log_info("Using buffer size %u.", u->buffer_size);
if ((prewrite_resume = pa_modargs_get_value(ma, "prewrite_on_resume", NULL))) {
if (!parse_prewrite_on_resume(u, prewrite_resume, am ? am->output->name : module_id)) {
@@ -1399,15 +1395,15 @@
pa_thread_mq_done(&u->thread_mq);
- if (u->sink_input_subscription)
- pa_subscription_free(u->sink_input_subscription);
-
if (u->sink_input_put_hook_slot)
pa_hook_slot_free(u->sink_input_put_hook_slot);
if (u->sink_input_unlink_hook_slot)
pa_hook_slot_free(u->sink_input_unlink_hook_slot);
+ if (u->sink_input_volume_changed_hook_slot)
+ pa_hook_slot_free(u->sink_input_volume_changed_hook_slot);
+
if (u->sink_proplist_changed_hook_slot)
pa_hook_slot_free(u->sink_proplist_changed_hook_slot);
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/src/droid/droid-source.c
^
|
@@ -50,6 +50,7 @@
#include <pulsecore/thread-mq.h>
#include <pulsecore/rtpoll.h>
#include <pulsecore/time-smoother.h>
+#include <pulsecore/resampler.h>
#include "droid-source.h"
#include "droid-util.h"
@@ -66,16 +67,24 @@
pa_memchunk memchunk;
audio_devices_t primary_devices;
- bool routing_changes_enabled;
+ size_t source_buffer_size;
size_t buffer_size;
pa_usec_t timestamp;
+ pa_hook_slot *input_buffer_size_changed_slot;
+ pa_hook_slot *input_channel_map_changed_slot;
+ pa_resampler *resampler;
+
pa_droid_card_data *card_data;
pa_droid_hw_module *hw_module;
pa_droid_stream *stream;
};
+enum {
+ SOURCE_MESSAGE_DO_ROUTING = PA_SOURCE_MESSAGE_MAX
+};
+
#define DEFAULT_MODULE_ID "primary"
#define DROID_AUDIO_SOURCE "droid.audio_source"
@@ -83,46 +92,23 @@
static void userdata_free(struct userdata *u);
-static int do_routing(struct userdata *u, audio_devices_t devices, bool force) {
+static int do_routing(struct userdata *u, audio_devices_t devices) {
int ret;
- pa_proplist *p;
- const char *source_str;
audio_devices_t old_device;
- audio_source_t source;
pa_assert(u);
pa_assert(u->stream);
- if (!force && !u->routing_changes_enabled) {
- pa_log_debug("Skipping routing change.");
- return 0;
- }
-
- if (u->primary_devices == devices) {
- if (force)
- pa_log_debug("Refresh active device routing.");
- else
- return 0;
- }
+ if (u->primary_devices == devices)
+ pa_log_debug("Refresh active device routing.");
old_device = u->primary_devices;
u->primary_devices = devices;
- ret = pa_droid_stream_set_input_route(u->stream, devices, &source);
+ ret = pa_droid_stream_set_route(u->stream, devices);
if (ret < 0)
u->primary_devices = old_device;
- else {
- if (source != (uint32_t) -1)
- pa_assert_se(pa_droid_audio_source_name(source, &source_str));
- else
- source_str = DROID_AUDIO_SOURCE_UNDEFINED;
-
- p = pa_proplist_new();
- pa_proplist_sets(p, DROID_AUDIO_SOURCE, source_str);
- pa_source_update_proplist(u->source, PA_UPDATE_REPLACE, p);
- pa_proplist_free(p);
- }
return ret;
}
@@ -161,7 +147,7 @@
chunk.memblock = pa_memblock_new(u->core->mempool, (size_t) u->buffer_size);
p = pa_memblock_acquire(chunk.memblock);
- readd = u->stream->in->read(u->stream->in, (uint8_t*) p, pa_memblock_get_length(chunk.memblock));
+ readd = pa_droid_stream_read(u->stream, p, pa_memblock_get_length(chunk.memblock));
pa_memblock_release(chunk.memblock);
if (readd < 0) {
@@ -174,6 +160,19 @@
chunk.index = 0;
chunk.length = readd;
+ if (u->resampler) {
+ pa_memchunk rchunk;
+
+ pa_resampler_run(u->resampler, &chunk, &rchunk);
+
+ if (rchunk.length > 0)
+ pa_source_post(u->source, &rchunk);
+ if (rchunk.memblock)
+ pa_memblock_unref(rchunk.memblock);
+
+ goto end;
+ }
+
if (chunk.length > 0)
pa_source_post(u->source, &chunk);
@@ -198,8 +197,6 @@
u->timestamp = pa_rtclock_now();
- u->stream->in->common.standby(&u->stream->in->common);
-
for (;;) {
int ret;
@@ -262,24 +259,37 @@
struct userdata *u = PA_SOURCE(o)->userdata;
switch (code) {
+ case SOURCE_MESSAGE_DO_ROUTING: {
+ audio_devices_t device = PA_PTR_TO_UINT(data);
+
+ pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
+
+ pa_droid_stream_suspend(u->stream, true);
+ do_routing(u, device);
+ pa_droid_stream_suspend(u->stream, false);
+ break;
+ }
+
case PA_SOURCE_MESSAGE_SET_STATE: {
switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
case PA_SOURCE_SUSPENDED: {
int r;
- pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
-
- if ((r = suspend(u)) < 0)
- return r;
+ if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) {
+ if ((r = suspend(u)) < 0)
+ return r;
+ }
break;
}
case PA_SOURCE_IDLE:
- break;
+ /* Fall through */
case PA_SOURCE_RUNNING: {
- unsuspend(u);
- u->timestamp = pa_rtclock_now();
+ if (u->source->thread_info.state == PA_SOURCE_SUSPENDED) {
+ unsuspend(u);
+ u->timestamp = pa_rtclock_now();
+ }
break;
}
@@ -301,7 +311,7 @@
return pa_source_process_msg(o, code, data, offset, chunk);
}
-static int droid_source_set_port(pa_source *s, pa_device_port *p, bool force) {
+static int source_set_port_cb(pa_source *s, pa_device_port *p) {
struct userdata *u = s->userdata;
pa_droid_port_data *data;
@@ -320,33 +330,13 @@
pa_log_debug("Source set port %u", data->device);
- return do_routing(u, data->device, force);
-}
-
-int pa_droid_source_set_port(pa_source *s, pa_device_port *p) {
- return droid_source_set_port(s, p, true);
-}
-
-static int source_set_port_cb(pa_source *s, pa_device_port *p) {
- return droid_source_set_port(s, p, false);
-}
-
-static void source_set_voicecall_source_port(struct userdata *u) {
- pa_device_port *port;
- pa_droid_port_data *data;
- void *state;
-
- pa_assert(u);
- pa_assert(u->source);
-
- PA_HASHMAP_FOREACH(port, u->source->ports, state) {
- data = PA_DEVICE_PORT_DATA(port);
-
- if (data->device & AUDIO_DEVICE_IN_VOICE_CALL) {
- pa_source_set_port(u->source, port->name, false);
- break;
- }
+ if (!PA_SOURCE_IS_OPENED(pa_source_get_state(u->source)))
+ do_routing(u, data->device);
+ else {
+ pa_asyncmsgq_post(u->source->asyncmsgq, PA_MSGOBJECT(u->source), SOURCE_MESSAGE_DO_ROUTING, PA_UINT_TO_PTR(data->device), 0, NULL, NULL);
}
+
+ return 0;
}
static void source_set_name(pa_modargs *ma, pa_source_new_data *data, const char *module_id) {
@@ -427,15 +417,71 @@
}
}
-void pa_droid_source_set_routing(pa_source *s, bool enabled) {
- struct userdata *u = s->userdata;
+/* Called from main and IO context */
+static void update_latency(struct userdata *u) {
+ pa_assert(u);
+ pa_assert(u->source);
+ pa_assert(u->stream);
+
+ u->buffer_size = pa_droid_stream_buffer_size(u->stream);
+
+ if (u->source_buffer_size) {
+ u->buffer_size = pa_droid_buffer_size_round_up(u->source_buffer_size, u->buffer_size);
+ pa_log_info("Using buffer size %u (requested %u).", u->buffer_size, u->source_buffer_size);
+ } else
+ pa_log_info("Using buffer size %u.", u->buffer_size);
+
+ if (pa_thread_mq_get())
+ pa_source_set_fixed_latency_within_thread(u->source, pa_bytes_to_usec(u->buffer_size, &u->stream->sample_spec));
+ else
+ pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(u->buffer_size, &u->stream->sample_spec));
+
+ pa_log_debug("Set fixed latency %" PRIu64 " usec", pa_bytes_to_usec(u->buffer_size, &u->stream->sample_spec));
+}
+
+/* Called from IO context. */
+static pa_hook_result_t input_buffer_size_changed_cb(pa_droid_hw_module *module,
+ pa_droid_stream *stream,
+ struct userdata *u) {
+ pa_assert(module);
+ pa_assert(stream);
+ pa_assert(u);
- pa_assert(s);
- pa_assert(s->userdata);
+ if (stream != u->stream)
+ return PA_HOOK_OK;
- if (u->routing_changes_enabled != enabled)
- pa_log_debug("%s source routing changes.", enabled ? "Enabling" : "Disabling");
- u->routing_changes_enabled = enabled;
+ update_latency(u);
+
+ return PA_HOOK_OK;
+}
+
+/* Called from IO context. */
+static pa_hook_result_t input_channel_map_changed_cb(pa_droid_hw_module *module,
+ pa_droid_stream *stream,
+ struct userdata *u) {
+ pa_assert(module);
+ pa_assert(stream);
+ pa_assert(u);
+
+ if (stream != u->stream)
+ return PA_HOOK_OK;
+
+ if (u->stream->input_channel_map.channels != u->source->channel_map.channels) {
+ if (u->resampler)
+ pa_resampler_free(u->resampler);
+
+ u->resampler = pa_resampler_new(u->core->mempool,
+ &u->stream->input_sample_spec, &u->stream->input_channel_map,
+ &u->source->sample_spec, &u->source->channel_map,
+ u->core->lfe_crossover_freq,
+ PA_RESAMPLER_COPY,
+ 0);
+ } else if (u->resampler) {
+ pa_resampler_free(u->resampler);
+ u->resampler = NULL;
+ }
+
+ return PA_HOOK_OK;
}
pa_source *pa_droid_source_new(pa_module *m,
@@ -451,7 +497,6 @@
pa_source_new_data data;
const char *module_id = NULL;
const char *tmp;
- uint32_t sample_rate;
uint32_t alternate_sample_rate;
audio_devices_t dev_in;
pa_sample_spec sample_spec;
@@ -460,7 +505,6 @@
bool namereg_fail = false;
pa_droid_config_audio *config = NULL; /* Only used when source is created without card */
uint32_t source_buffer = 0;
- bool voicecall_source = false;
pa_assert(m);
pa_assert(ma);
@@ -475,11 +519,6 @@
sample_spec = m->core->default_sample_spec;
channel_map = m->core->default_channel_map;
- if (device & AUDIO_DEVICE_IN_VOICE_CALL) {
- pa_log_info("Enabling voice call record source. Most module arguments are overridden.");
- voicecall_source = true;
- }
-
/* First parse both sample spec and channel map, then see if source_* override some
* of the values. */
if (pa_modargs_get_sample_spec_and_channel_map(ma, &sample_spec, &channel_map, PA_CHANNEL_MAP_AIFF) < 0) {
@@ -531,9 +570,6 @@
u->rtpoll = pa_rtpoll_new();
pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
- /* Enabled routing changes by default, except for voicecall source. */
- u->routing_changes_enabled = voicecall_source ? false : true;
-
if (card_data) {
pa_assert(card);
u->card_data = card_data;
@@ -578,24 +614,11 @@
goto fail;
}
- u->buffer_size = u->stream->in->common.get_buffer_size(&u->stream->in->common);
- if (source_buffer) {
- if (source_buffer < u->buffer_size)
- pa_log_warn("Requested buffer size %u less than HAL reported buffer size (%u).", source_buffer, u->buffer_size);
- else if (source_buffer % u->buffer_size) {
- uint32_t trunc = (source_buffer / u->buffer_size) * u->buffer_size;
- pa_log_warn("Requested buffer size %u not multiple of HAL buffer size (%u). Using buffer size %u", source_buffer, u->buffer_size, trunc);
- u->buffer_size = trunc;
- } else {
- pa_log_info("Using requested buffer size %u.", source_buffer);
- u->buffer_size = source_buffer;
- }
- }
-
pa_source_new_data_init(&data);
data.driver = driver;
data.module = m;
data.card = card;
+ data.suspend_cause = PA_SUSPEND_IDLE;
source_set_name(ma, &data, module_id);
@@ -648,14 +671,18 @@
pa_xfree(thread_name);
thread_name = NULL;
- pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(u->buffer_size, &u->stream->sample_spec));
- pa_log_debug("Set fixed latency %" PRIu64 " usec", pa_bytes_to_usec(u->buffer_size, &u->stream->sample_spec));
+ update_latency(u);
- if (!voicecall_source && u->source->active_port)
+ if (u->source->active_port)
source_set_port_cb(u->source, u->source->active_port);
- if (voicecall_source)
- source_set_voicecall_source_port(u);
+ u->input_buffer_size_changed_slot = pa_hook_connect(&pa_droid_hooks(u->hw_module)[PA_DROID_HOOK_INPUT_BUFFER_SIZE_CHANGED],
+ PA_HOOK_NORMAL,
+ (pa_hook_cb_t) input_buffer_size_changed_cb, u);
+
+ u->input_channel_map_changed_slot = pa_hook_connect(&pa_droid_hooks(u->hw_module)[PA_DROID_HOOK_INPUT_CHANNEL_MAP_CHANGED],
+ PA_HOOK_NORMAL,
+ (pa_hook_cb_t) input_channel_map_changed_cb, u);
pa_source_put(u->source);
@@ -683,6 +710,13 @@
}
static void userdata_free(struct userdata *u) {
+ pa_assert(u);
+
+ if (u->input_channel_map_changed_slot)
+ pa_hook_slot_free(u->input_channel_map_changed_slot);
+
+ if (u->input_buffer_size_changed_slot)
+ pa_hook_slot_free(u->input_buffer_size_changed_slot);
if (u->source)
pa_source_unlink(u->source);
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/src/droid/droid-source.h
^
|
@@ -53,7 +53,4 @@
pa_card *card);
void pa_droid_source_free(pa_source *s);
-void pa_droid_source_set_routing(pa_source *s, bool enabled);
-int pa_droid_source_set_port(pa_source *s, pa_device_port *p);
-
#endif
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-8.0.61.tar.bz2/src/droid/module-droid-card.c
^
|
@@ -76,12 +76,13 @@
"rate=<sample rate> "
"output_flags=<flags for sink> "
"module_id=<which droid hw module to load, default primary> "
- "voice_source_routing=<route source ports during voice call, default false> "
+ "voice_source_routing=<always true, parameter left for compatibility> "
"deferred_volume=<synchronize software and hardware volume changes to avoid momentary jumps?> "
"config=<location for droid audio configuration> "
"voice_property_key=<proplist key searched for sink-input that should control voice call volume> "
"voice_property_value=<proplist value for the key for voice control sink-input> "
- "combine=<comma separated list of outputs that should be merged to one profile. defaults to none>"
+ "combine=<comma separated list of outputs that should be merged to one profile. defaults to none> "
+ "quirks=<comma separated list of quirks to enable/disable>"
);
static const char* const valid_modargs[] = {
@@ -112,6 +113,7 @@
"voice_property_key",
"voice_property_value",
"combine",
+ "quirks",
NULL,
};
@@ -149,9 +151,6 @@
pa_droid_card_data card_data;
pa_droid_profile *old_profile;
- pa_source *voicecall_source;
-
- bool voice_source_routing;
pa_modargs *modargs;
pa_card *card;
@@ -259,7 +258,6 @@
static int set_parameters_cb(pa_droid_card_data *card_data, const char *str) {
struct userdata *u;
- int ret;
pa_assert(card_data);
pa_assert_se((u = card_data->userdata));
@@ -403,7 +401,6 @@
}
static void park_profile(pa_droid_profile *dp) {
- struct profile_data *data;
pa_droid_mapping *am;
uint32_t idx;
@@ -445,8 +442,6 @@
/* call mode specialities */
if (enabling) {
pa_droid_sink_set_voice_control(am_output->sink, true);
- if (am_input && !u->voice_source_routing)
- pa_droid_source_set_routing(am_input->source, false);
if (am_input && am_input->input->devices & AUDIO_DEVICE_IN_VOICE_CALL &&
(cp = pa_hashmap_get(u->card->profiles, VOICE_RECORD_PROFILE_NAME))) {
if (cp->available == PA_AVAILABLE_NO) {
@@ -456,8 +451,6 @@
}
} else {
pa_droid_sink_set_voice_control(am_output->sink, false);
- if (am_input && !u->voice_source_routing)
- pa_droid_source_set_routing(am_input->source, true);
if (am_input && am_input->input->devices & AUDIO_DEVICE_IN_VOICE_CALL &&
(cp = pa_hashmap_get(u->card->profiles, VOICE_RECORD_PROFILE_NAME))) {
if (cp->available == PA_AVAILABLE_YES) {
@@ -470,105 +463,6 @@
return true;
}
-#if (DROID_HAL == 1) || \
- (defined(QCOM_HARDWARE) && ANDROID_VERSION_MAJOR == 5 && ANDROID_VERSION_MINOR == 1)
-static bool voicecall_record_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling) {
- pa_queue *source_outputs = NULL;
- pa_droid_mapping *am;
-
- pa_assert_ctl_context();
- pa_assert(u);
- pa_assert(p);
- pa_assert(u->old_profile);
-
- if (enabling) {
- /* don't do anything if voicecall source has already been created. */
- if (u->voicecall_source)
- return true;
-
- pa_log_info("Enabling voice call record.");
-
- am = pa_droid_idxset_get_primary(u->old_profile->input_mappings);
-
- if (am && am->source) {
- source_outputs = pa_source_move_all_start(am->source, source_outputs);
- pa_droid_source_free(am->source);
- am->source = NULL;
- }
-
- u->voicecall_source = pa_droid_source_new(u->module, u->modargs, __FILE__, AUDIO_DEVICE_IN_VOICE_CALL, &u->card_data, am, u->card);
- if (!u->voicecall_source)
- pa_log("Failed to enable voice call recording.");
-
- if (u->voicecall_source && source_outputs) {
- pa_source_move_all_finish(u->voicecall_source, source_outputs, false);
- source_outputs = NULL;
- }
-
- } else {
- pa_log_info("Disabling voice call record.");
-
- if (u->voicecall_source) {
- source_outputs = pa_source_move_all_start(u->voicecall_source, source_outputs);
- pa_droid_source_free(u->voicecall_source);
- u->voicecall_source = NULL;
- }
-
- am = pa_droid_idxset_get_primary(u->old_profile->input_mappings);
-
- if (am && !am->source) {
- am->source = pa_droid_source_new(u->module, u->modargs, __FILE__, (audio_devices_t) 0, &u->card_data, am, u->card);
-
- if (source_outputs && am->source) {
- pa_source_move_all_finish(am->source, source_outputs, false);
- source_outputs = NULL;
- }
- }
- }
-
- if (source_outputs)
- pa_source_move_all_fail(source_outputs);
-
- return true;
-}
-
-#else
-
-static bool voicecall_record_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling) {
- pa_droid_mapping *am;
- pa_device_port *port;
- const char *port_name;
-
- pa_assert_ctl_context();
- pa_assert(u);
- pa_assert(p);
- pa_assert(u->old_profile);
-
- if (!(am = pa_droid_idxset_get_primary(u->old_profile->input_mappings))) {
- pa_log("Active profile doesn't have primary input device. Cannot enable record profile.");
- return false;
- }
-
- if (!am->source) {
- pa_log("No active source, refusing to switch source port.");
- return false;
- }
-
- pa_source_assert_ref(am->source);
-
- pa_assert_se(pa_droid_input_port_name(enabling ? AUDIO_DEVICE_IN_VOICE_CALL : AUDIO_DEVICE_IN_DEFAULT,
- &port_name));
- pa_assert_se((port = pa_hashmap_get(am->source->ports, port_name)));
-
- if (pa_droid_source_set_port(am->source, port) != 0)
- return false;
-
- pa_hook_fire(&u->core->hooks[PA_CORE_HOOK_SOURCE_PORT_CHANGED], am->source);
-
- return true;
-}
-#endif
-
#ifdef DROID_AUDIO_HAL_USE_VSID
static bool voicecall_vsid(struct userdata *u, pa_droid_profile *p, uint32_t vsid, bool enabling)
{
@@ -781,9 +675,9 @@
pa_droid_config_audio *config = NULL;
const char *module_id;
bool namereg_fail = false;
- bool voice_source_routing = false;
pa_card_profile *virtual;
const char *combine;
+ const char *quirks;
pa_assert(m);
@@ -796,22 +690,26 @@
struct userdata *u = pa_xnew0(struct userdata, 1);
u->core = m->core;
+ m->userdata = u;
if (!(config = pa_droid_config_load(ma)))
goto fail;
- if (pa_modargs_get_value_boolean(ma, "voice_source_routing", &voice_source_routing) < 0) {
- pa_log("Failed to parse voice_source_routing argument.");
- goto fail;
- }
- u->voice_source_routing = voice_source_routing;
-
module_id = pa_modargs_get_value(ma, "module_id", DEFAULT_MODULE_ID);
/* Ownership of config transfers to hw_module if opening of hw module succeeds. */
if (!(u->hw_module = pa_droid_hw_module_get(u->core, config, module_id)))
goto fail;
+ if ((quirks = pa_modargs_get_value(ma, "quirks", NULL))) {
+ if (!pa_droid_quirk_parse(u->hw_module, quirks)) {
+ pa_log("Failed to parse quirks.");
+ goto fail;
+ }
+ }
+
+ pa_droid_quirk_log(u->hw_module);
+
u->card_data.set_parameters = set_parameters_cb;
u->card_data.module_id = pa_xstrdup(module_id);
u->card_data.userdata = u;
@@ -883,7 +781,7 @@
AUDIO_MODE_IN_CALL, voicecall_profile_event_cb,
PA_AVAILABLE_YES, NULL, data.profiles);
add_virtual_profile(u, VOICE_RECORD_PROFILE_NAME, VOICE_RECORD_PROFILE_DESC,
- AUDIO_MODE_IN_CALL, voicecall_record_profile_event_cb,
+ AUDIO_MODE_IN_CALL, NULL,
PA_AVAILABLE_NO, virtual, data.profiles);
add_virtual_profile(u, COMMUNICATION_PROFILE_NAME, COMMUNICATION_PROFILE_DESC,
AUDIO_MODE_IN_COMMUNICATION, NULL,
@@ -928,8 +826,6 @@
u->modargs = ma;
u->module = m;
- m->userdata = u;
-
init_profile(u);
return 0;
@@ -938,8 +834,6 @@
if (ma)
pa_modargs_free(ma);
- pa_xfree(config);
-
pa__done(m);
return -1;
|