[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid.spec
^
|
|
[-]
[+]
|
Deleted |
_service:tar_git:pulseaudio-modules-droid-12.2.78+master.20190515084647.12.g96c4e2e.tar.bz2/src/droid/keepalive.c
^
|
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 2013-2018 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.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <signal.h>
-#include <stdio.h>
-
-#ifdef HAVE_VALGRIND_MEMCHECK_H
-#include <valgrind/memcheck.h>
-#endif
-
-#include <pulse/rtclock.h>
-#include <pulse/timeval.h>
-#include <pulse/xmalloc.h>
-
-#include <pulsecore/core.h>
-#include <pulsecore/core-error.h>
-#include <pulsecore/dbus-shared.h>
-#include <pulsecore/dbus-util.h>
-#include <pulsecore/atomic.h>
-
-#include "keepalive.h"
-
-#define MCE_BUS (DBUS_BUS_SYSTEM)
-#define MCE_DBUS_NAME "com.nokia.mce"
-#define MCE_DBUS_PATH "/com/nokia/mce/request"
-#define MCE_DBUS_IFACE "com.nokia.mce.request"
-#define MCE_DBUS_KEEPALIVE_PERIOD_REQ "req_cpu_keepalive_period"
-#define MCE_DBUS_KEEPALIVE_START_REQ "req_cpu_keepalive_start"
-#define MCE_DBUS_KEEPALIVE_STOP_REQ "req_cpu_keepalive_stop"
-
-struct pa_droid_keepalive {
- pa_core *core;
- pa_dbus_connection *dbus_connection;
- DBusPendingCall *pending;
-
- pa_atomic_t started;
- pa_usec_t timeout;
- pa_time_event *timer_event;
-
-};
-
-pa_droid_keepalive* pa_droid_keepalive_new(pa_core *c) {
- pa_droid_keepalive *k;
- pa_dbus_connection *dbus;
- DBusError error;
-
- pa_assert(c);
-
- dbus_error_init(&error);
-
- dbus = pa_dbus_bus_get(c, MCE_BUS, &error);
- if (dbus_error_is_set(&error)) {
- pa_log("Failed to get %s bus: %s", MCE_BUS == DBUS_BUS_SESSION ? "session" : "system", error.message);
- dbus_error_free(&error);
- return NULL;
- }
-
- k = pa_xnew0(pa_droid_keepalive, 1);
- k->core = c;
- k->dbus_connection = dbus;
- k->timeout = 0;
- pa_atomic_store(&k->started, 0);
-
- return k;
-}
-
-static void send_dbus_signal(pa_dbus_connection *dbus) {
- DBusMessage *msg;
-
- pa_assert(dbus);
-
- /* pa_log_debug("Send keepalive heartbeat."); */
-
- pa_assert_se((msg = dbus_message_new_method_call(MCE_DBUS_NAME,
- MCE_DBUS_PATH,
- MCE_DBUS_IFACE,
- MCE_DBUS_KEEPALIVE_START_REQ)));
-
- dbus_connection_send(pa_dbus_connection_get(dbus), msg, NULL);
- dbus_message_unref(msg);
-}
-
-static void keepalive_cb(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
- pa_droid_keepalive *k = userdata;
-
- pa_assert(k);
- pa_assert(k->timer_event == e);
-
- send_dbus_signal(k->dbus_connection);
- pa_core_rttime_restart(k->core, k->timer_event, pa_rtclock_now() + k->timeout);
-}
-
-static void keepalive_start(pa_droid_keepalive *k) {
- pa_assert(k);
- pa_assert(k->timeout);
- pa_assert(!k->timer_event);
-
- pa_log_info("Start keepalive heartbeat with interval %lu seconds.", (unsigned long) (k->timeout / PA_USEC_PER_SEC));
-
- /* Send first keepalive heartbeat immediately. */
- send_dbus_signal(k->dbus_connection);
-
- k->timer_event = pa_core_rttime_new(k->core, pa_rtclock_now() + k->timeout, keepalive_cb, k);
-}
-
-static void pending_req_reply_cb(DBusPendingCall *pending, void *userdata) {
- pa_droid_keepalive *k = userdata;
- DBusMessage *msg;
- uint32_t period;
-
- pa_assert(pending);
- pa_assert(k);
- pa_assert(pending == k->pending);
-
- k->pending = NULL;
- pa_assert_se(msg = dbus_pending_call_steal_reply(pending));
-
- if (dbus_message_get_type(msg) == DBUS_MESSAGE_TYPE_ERROR) {
- pa_log("Failed to get %s", MCE_DBUS_KEEPALIVE_PERIOD_REQ);
- goto finish;
- }
-
- pa_assert_se(dbus_message_get_args(msg, NULL,
- DBUS_TYPE_INT32, &period,
- DBUS_TYPE_INVALID));
-
- k->timeout = PA_USEC_PER_SEC * period;
-
- keepalive_start(k);
-
-finish:
- dbus_message_unref(msg);
- dbus_pending_call_unref(pending);
-}
-
-void pa_droid_keepalive_start(pa_droid_keepalive *k) {
- DBusMessage *msg = NULL;
-
- pa_assert(k);
-
- /* Only allow first call go through. pa_atomic_inc() returns previous value before incrementing. */
- if (pa_atomic_inc(&k->started) > 0)
- return;
-
- pa_assert(!k->timer_event);
- pa_assert(!k->pending);
-
- /* Period time already requested, just start hearbeat. */
- if (k->timeout > 0) {
- keepalive_start(k);
- return;
- }
-
- pa_log_debug("Starting keepalive - Request keepalive period.");
- /* Send first keepalive heartbeat immediately. */
- send_dbus_signal(k->dbus_connection);
-
- pa_assert_se((msg = dbus_message_new_method_call(MCE_DBUS_NAME,
- MCE_DBUS_PATH,
- MCE_DBUS_IFACE,
- MCE_DBUS_KEEPALIVE_PERIOD_REQ)));
-
- dbus_connection_send_with_reply(pa_dbus_connection_get(k->dbus_connection), msg, &k->pending, -1);
- dbus_message_unref(msg);
-
- if (k->pending)
- dbus_pending_call_set_notify(k->pending, pending_req_reply_cb, k, NULL);
- else
- pa_log("D-Bus method call failed.");
-}
-
-void pa_droid_keepalive_stop(pa_droid_keepalive *k) {
- DBusMessage *msg;
-
- pa_assert(k);
-
- /* Only allow last call go through. pa_atomic_dec() returns previous value before decrementing. */
|
[-]
[+]
|
Deleted |
_service:tar_git:pulseaudio-modules-droid-12.2.78+master.20190515084647.12.g96c4e2e.tar.bz2/src/droid/keepalive.h
^
|
@@ -1,44 +0,0 @@
-#ifndef foodroidkeepalivefoo
-#define foodroidkeepalivefoo
-
-/*
- * Copyright (C) 2013-2018 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.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <pulsecore/core.h>
-#include <pulsecore/core-util.h>
-#include <pulsecore/macro.h>
-#include <pulsecore/dbus-shared.h>
-#include <pulsecore/atomic.h>
-
-typedef struct pa_droid_keepalive pa_droid_keepalive;
-
-pa_droid_keepalive* pa_droid_keepalive_new(pa_core *c);
-void pa_droid_keepalive_free(pa_droid_keepalive *k);
-
-void pa_droid_keepalive_start(pa_droid_keepalive *k);
-void pa_droid_keepalive_stop(pa_droid_keepalive *k);
-
-
-#endif
|
[-]
[+]
|
Deleted |
_service:tar_git:pulseaudio-modules-droid-12.2.78+master.20190515084647.12.g96c4e2e.tar.bz2/src/droid/module-droid-keepalive-symdef.h
^
|
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2013-2018 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 foomoduledroidkeepalivesymdeffoo
-#define foomoduledroidkeepalivesymdeffoo
-
-#include <pulsecore/core.h>
-#include <pulsecore/module.h>
-
-#define pa__init module_droid_keepalive_LTX_pa__init
-#define pa__done module_droid_keepalive_LTX_pa__done
-#define pa__get_author module_droid_keepalive_LTX_pa__get_author
-#define pa__get_description module_droid_keepalive_LTX_pa__get_description
-#define pa__get_usage module_droid_keepalive_LTX_pa__get_usage
-#define pa__get_version module_droid_keepalive_LTX_pa__get_version
-
-int pa__init(struct pa_module*m);
-void pa__done(struct pa_module*m);
-
-const char* pa__get_author(void);
-const char* pa__get_description(void);
-const char* pa__get_usage(void);
-const char* pa__get_version(void);
-
-#endif
|
[-]
[+]
|
Deleted |
_service:tar_git:pulseaudio-modules-droid-12.2.78+master.20190515084647.12.g96c4e2e.tar.bz2/src/droid/module-droid-keepalive.c
^
|
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2013-2018 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.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <signal.h>
-#include <stdio.h>
-
-#ifdef HAVE_VALGRIND_MEMCHECK_H
-#include <valgrind/memcheck.h>
-#endif
-
-#include <pulse/xmalloc.h>
-
-#include <pulsecore/core.h>
-#include <pulsecore/i18n.h>
-#include <pulsecore/module.h>
-#include <pulsecore/sink.h>
-#include <pulsecore/source.h>
-#include <pulsecore/modargs.h>
-#include <pulsecore/core-util.h>
-#include <pulsecore/log.h>
-#include <pulsecore/macro.h>
-#include <pulsecore/idxset.h>
-
-#include "keepalive.h"
-
-#include "module-droid-keepalive-symdef.h"
-
-PA_MODULE_AUTHOR("Juho Hämäläinen");
-PA_MODULE_DESCRIPTION("Droid keepalive. Send cpu wakeup heartbeat while streams are active.");
-PA_MODULE_VERSION(PACKAGE_VERSION);
-PA_MODULE_USAGE(
- "-"
-);
-
-static const char* const valid_modargs[] = {
- NULL,
-};
-
-struct userdata {
- pa_core *core;
- pa_module *module;
-
- pa_droid_keepalive *keepalive;
- bool active;
- pa_hook_slot *sink_state_changed_slot;
- pa_hook_slot *source_state_changed_slot;
-};
-
-static void start(struct userdata *u) {
- if (u->active)
- return;
-
- u->active = true;
-
- pa_droid_keepalive_start(u->keepalive);
-}
-
-static void stop(struct userdata *u) {
- void *state = NULL;
- pa_sink *sink;
- pa_source *source;
-
- if (!u->active)
- return;
-
- while ((sink = pa_idxset_iterate(u->core->sinks, &state, NULL))) {
- if (pa_sink_get_state(sink) != PA_SINK_SUSPENDED)
- return;
- }
-
- state = NULL;
- while ((source = pa_idxset_iterate(u->core->sources, &state, NULL))) {
- if (source->monitor_of)
- continue;
- if (pa_source_get_state(source) != PA_SOURCE_SUSPENDED)
- return;
- }
-
- /* We get here if all sinks and sources are in suspended state. */
- pa_droid_keepalive_stop(u->keepalive);
- u->active = false;
-}
-
-static void update_sink(pa_sink *sink, struct userdata *u) {
- pa_assert(sink);
- pa_assert(u);
-
- if (pa_sink_get_state(sink) != PA_SINK_SUSPENDED)
- start(u);
- else
- stop(u);
-}
-
-static void update_source(pa_source *source, struct userdata *u) {
- pa_assert(source);
- pa_assert(u);
-
- /* Don't react on monitor state changes. */
- if (!source->monitor_of) {
- if (pa_source_get_state(source) != PA_SOURCE_SUSPENDED)
- start(u);
- else
- stop(u);
- }
-}
-
-static pa_hook_result_t device_state_changed_hook_cb(pa_core *c, pa_object *o, struct userdata *u) {
- pa_assert(c);
- pa_object_assert_ref(o);
- pa_assert(u);
-
- if (pa_source_isinstance(o))
- update_source(PA_SOURCE(o), u);
- else if (pa_sink_isinstance(o))
- update_sink(PA_SINK(o), u);
-
- return PA_HOOK_OK;
-}
-
-
-int pa__init(pa_module *m) {
- uint32_t idx = 0;
- pa_sink *sink;
- pa_source *source;
- struct userdata *u;
-
- pa_assert(m);
-
- u = pa_xnew0(struct userdata, 1);
- u->core = m->core;
- u->active = false;
- u->module = m;
- m->userdata = u;
-
- if (!(u->keepalive = pa_droid_keepalive_new(u->core))) {
- pa_log("Failed to create keepalive handler.");
- goto fail;
- }
-
- u->sink_state_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) device_state_changed_hook_cb, u);
- u->source_state_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) device_state_changed_hook_cb, u);
-
- PA_IDXSET_FOREACH(source, u->core->sources, idx)
- update_source(source, u);
-
- PA_IDXSET_FOREACH(sink, u->core->sinks, idx)
- update_sink(sink, u);
-
- return 0;
-
-fail:
- pa__done(m);
-
- return -1;
-}
-
-void pa__done(pa_module *m) {
- struct userdata *u;
-
- pa_assert(m);
-
- if ((u = m->userdata)) {
-
- if (u->sink_state_changed_slot)
- pa_hook_slot_free(u->sink_state_changed_slot);
- if (u->source_state_changed_slot)
- pa_hook_slot_free(u->source_state_changed_slot);
-
- if (u->keepalive) {
- pa_droid_keepalive_stop(u->keepalive);
- pa_droid_keepalive_free(u->keepalive);
- }
-
- pa_xfree(u);
- }
-}
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-12.2.82.tar.bz2/README
^
|
@@ -80,10 +80,12 @@
By default files are tried in following order,
- /vendor/etc/audio_policy_configuration.xml (new xml format)
- /vendor/etc/audio_policy.conf (legacy format)
- /system/etc/audio_policy_configuration.xml (new xml format)
- /system/etc/audio_policy.conf (legacy format)
+ /odm/etc/audio_policy_configuration.xml (new xml format)
+ /vendor/etc/audio/audio_policy_configuration.xml (new xml format)
+ /vendor/etc/audio_policy_configuration.xml (new xml format)
+ /vendor/etc/audio_policy.conf (legacy format)
+ /system/etc/audio_policy_configuration.xml (new xml format)
+ /system/etc/audio_policy.conf (legacy format)
module-droid-card
-----------------
@@ -98,8 +100,7 @@
When module-droid-card is loaded with default arguments, droid-card will try
to create a default profile (called surprisingly "default"). The default
profile will try to merge useful output and input streams to one profile,
-to allow use of possible low latency outputs or multiple inputs if the
-input streams are split to multiple devices.
+to allow use of possible low latency or deep buffer outputs.
For example configuration with
@@ -110,8 +111,8 @@
deep_buffer {}
}
inputs {
- builtin {}
- external {}
+ primary {}
+ voice_rx {}
}
}
other {
@@ -120,39 +121,11 @@
}
The default profile would contain two sinks, sink.primary and sink.deep_buffer
-and one source, source.builtin_external. Then this combined source would use
-either "builtin" or "external" input stream, depending on which one has the
-input route currently in use (for example, input-wired_headset from "external"
-and input-back_mic from "builtin" input stream).
+and one source, source.droid.
Usually this default profile is everything that is needed in normal use, and
additional profiles created should be needed only for testing things out etc.
-additional profiles
--------------------
-
-In addition to the default profile all input and output definitions are
-translated to PulseAudio card profiles. For example configuration with
-
- audio_hw_modules {
- primary {
- outputs {
- primary {}
- lpa {}
- }
- inputs {
- primary {}
- }
- }
- other {
- ...
- }
- }
-
-Would map to card profiles (input-output) primary-primary and lpa-primary.
-When module-droid-card is run without module_id argument, as default "primary"
-is used.
-
virtual profiles
----------------
@@ -202,6 +175,33 @@
related optimizations etc. Voicecall-record profile can be enabled when
voicecall profile is active.
+debugging profiles
+------------------
+
+If needed in favour of default profile one can opt to creating combinations
+of all output and input definitions in a module definition. This can be
+done by passing "default=false" to module-droid-card. Module argument
+module_id will then defines which module to load (by default "primary").
+Without default profile all input and output definitions are translated
+to PulseAudio card profiles. For example configuration with
+
+ audio_hw_modules {
+ primary {
+ outputs {
+ primary {}
+ lpa {}
+ }
+ inputs {
+ primary {}
+ }
+ }
+ other {
+ ...
+ }
+ }
+
+Would map to card profiles (<output>-<input>) primary-primary and lpa-primary.
+
module-droid-sink and module-droid-source
-----------------------------------------
@@ -252,6 +252,41 @@
accessory-plugin and pulseaudio-policy-enforcement module for actually making
the port switching)
+Droid source automatic reconfiguration
+--------------------------------------
+
+As droid HAL makes assumptions on (input) routing based on what the parameters
+for the stream are (device, sample rate, channels, format, etc.) normal
+PulseAudio sources are a bit inflexible as only sample rate can change after
+source creation and even then there are restrictions based on alternative
+sample rate value.
+
+To overcome this and to allow some more variables affecting the stream being
+passed to the input stream droid source is modified to reconfigure itself
+with the source-output that connects to it. This means, that just looking at
+inactive source from "pactl list" listing doesn't tell the whole story.
+
+Droid source is always reconfigured with the *last* source-output that
+connects to it, possibly already connected source-outputs will continue
+to read from the source but through resampler.
+
+For example,
+
+ 1) source-output 44100Hz, stereo connects (so1)
+ a) source is configured with 44100Hz, stereo
+ b) so1 connects to the source without resampler
+ 2) source-output 16000Hz, mono connects (so2)
+ a) so1 is detached from the source
+ b) source is configured with 16000Hz, mono
+ c) so2 connects to the source without resampler
+ d) resampler is created for so1, 16000Hz, mono -> 44100Hz stereo
+ f) so1 is re-attached to the source through resampler
+ 3) source-output 16000Hz, mono connects (so3)
+ a) so1 and so2 are detached from the source
+ b) so3 connects to the source without resampler
+ c) so1 is re-attached to the source through resampler
+ d) so2 is attached to the source
+
Classifying sinks and sources
-----------------------------
@@ -285,9 +320,8 @@
There also may be just one sink, with all the properties defined as "true"
and so on.
-Similarly if there is only one input device the sole source would have both
-input type properties set as "true", but it also might be that the different
-input type properties are split to two different sources.
+Right now there exists only one source (input device) which will always have
+both properties as true.
Quirks
------
@@ -374,6 +408,4 @@
module-droid-keepalive
----------------------
-Keepalive module is MCE (https://github.com/nemomobile/mce) specific module
-tracking sink/source activity and keeping a WAKELOCK when there are active
-streams.
+Module relocated to its own package pulseaudio-module-keepalive.
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-12.2.82.tar.bz2/configure.ac
^
|
@@ -183,10 +183,6 @@
AC_SUBST(HYBRIS_CFLAGS)
AC_SUBST(HYBRIS_LIBS)
-PKG_CHECK_MODULES([DBUS], [dbus-1 >= 1.2])
-AC_SUBST(DBUS_CFLAGS)
-AC_SUBST(DBUS_LIBS)
-
#### expat (for xml config format parsing) (optional) ####
AC_ARG_ENABLE([xml],
@@ -260,9 +256,10 @@
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])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_INPUT_FLAG_MMAP_NOIRQ])
+CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_INPUT_FLAG_VOIP_TX])
# Channels
CC_CHECK_DROID_ENUM([${DROIDHEADERS_CFLAGS}], [AUDIO_CHANNEL_OUT_SURROUND])
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-12.2.82.tar.bz2/src/common/droid-config.c
^
|
@@ -66,6 +66,8 @@
#include <hardware/audio.h>
#include <hardware_legacy/audio_policy_conf.h>
+#define ODM_AUDIO_POLICY_CONFIG_XML_FILE "/odm/etc/audio_policy_configuration.xml"
+#define VENDOR_AUDIO_AUDIO_POLICY_CONFIG_XML_FILE "/vendor/etc/audio/audio_policy_configuration.xml"
#define VENDOR_AUDIO_POLICY_CONFIG_XML_FILE "/vendor/etc/audio_policy_configuration.xml"
#define SYSTEM_AUDIO_POLICY_CONFIG_XML_FILE "/system/etc/audio_policy_configuration.xml"
@@ -74,6 +76,8 @@
pa_droid_config_audio *config = NULL;
const char *manual_config;
const char *config_location[] = {
+ ODM_AUDIO_POLICY_CONFIG_XML_FILE,
+ VENDOR_AUDIO_AUDIO_POLICY_CONFIG_XML_FILE,
VENDOR_AUDIO_POLICY_CONFIG_XML_FILE,
AUDIO_POLICY_VENDOR_CONFIG_FILE,
SYSTEM_AUDIO_POLICY_CONFIG_XML_FILE,
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-12.2.82.tar.bz2/src/common/droid-util-audio.h
^
|
@@ -339,6 +339,8 @@
STRING_ENTRY_IF_AUDIO_INPUT_FLAG_HW_HOTWORD
STRING_ENTRY_IF_AUDIO_INPUT_FLAG_RAW
STRING_ENTRY_IF_AUDIO_INPUT_FLAG_SYNC
+ STRING_ENTRY_IF_AUDIO_INPUT_FLAG_MMAP_NOIRQ
+ STRING_ENTRY_IF_AUDIO_INPUT_FLAG_VOIP_TX
{ 0, NULL }
};
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-12.2.82.tar.bz2/src/common/droid-util.c
^
|
@@ -92,7 +92,7 @@
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 int input_stream_set_route(pa_droid_hw_module *hw_module);
static pa_droid_profile *profile_new(pa_droid_profile_set *ps,
const pa_droid_config_hw_module *module,
@@ -113,7 +113,6 @@
p->priority = DEFAULT_PRIORITY;
p->output_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
- p->input_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
pa_hashmap_put(ps->profiles, p->name, p);
@@ -123,7 +122,7 @@
static pa_droid_profile *droid_profile_new(pa_droid_profile_set *ps,
const pa_droid_config_device *primary_output,
const pa_droid_config_device *output,
- const pa_droid_config_device *input) {
+ const pa_droid_config_device *inputs) {
pa_droid_profile *p;
char *name;
char *description;
@@ -131,13 +130,13 @@
pa_assert(ps);
pa_assert(output);
pa_assert(!primary_output || primary_output->direction == PA_DIRECTION_OUTPUT);
- pa_assert(!input || input->direction == PA_DIRECTION_INPUT);
+ pa_assert(!inputs || inputs->direction == PA_DIRECTION_INPUT);
- name = pa_sprintf_malloc("%s%s%s", output->name, input ? "-" : "", input ? input->name : "");
+ name = pa_sprintf_malloc("%s%s%s", output->name, inputs ? "-" : "", inputs ? inputs->name : "");
description = pa_sprintf_malloc("%s output%s%s%s", output->name,
- input ? " and " : "",
- input ? input->name : "",
- input ? " input." : "");
+ inputs ? " and " : "",
+ inputs ? inputs->name : "",
+ inputs ? " inputs." : "");
p = profile_new(ps, output->module, name, description);
pa_xfree(name);
@@ -146,7 +145,7 @@
if (pa_streq(output->name, "primary")) {
p->priority += DEFAULT_PRIORITY;
- if (input && pa_streq(input->name, "primary"))
+ if (inputs && pa_streq(inputs->name, "primary"))
p->priority += DEFAULT_PRIORITY;
}
@@ -154,8 +153,8 @@
pa_idxset_put(p->output_mappings, pa_droid_mapping_get(ps, primary_output), NULL);
if (output)
pa_idxset_put(p->output_mappings, pa_droid_mapping_get(ps, output), NULL);
- if (input)
- pa_idxset_put(p->input_mappings, pa_droid_mapping_get(ps, input), NULL);
+ if (inputs)
+ p->input_mapping = pa_droid_mapping_get(ps, inputs);
return p;
}
@@ -167,7 +166,7 @@
if (am->direction == PA_DIRECTION_OUTPUT)
pa_idxset_put(p->output_mappings, am, NULL);
else
- pa_idxset_put(p->input_mappings, am, NULL);
+ p->input_mapping = am;
}
static pa_droid_profile *add_profile(pa_droid_profile_set *ps,
@@ -176,7 +175,7 @@
const pa_droid_config_device *input) {
pa_droid_profile *ap;
- pa_assert(primary_output && primary_output->direction == PA_DIRECTION_OUTPUT);
+ pa_assert(!primary_output || primary_output->direction == PA_DIRECTION_OUTPUT);
pa_assert(output && output->direction == PA_DIRECTION_OUTPUT);
pa_assert(!input || input->direction == PA_DIRECTION_INPUT);
@@ -209,14 +208,20 @@
}
static void add_all_profiles(pa_droid_profile_set *ps,
- const pa_droid_config_hw_module *module,
- const pa_droid_config_device *primary_output) {
- pa_droid_config_device *output;
- pa_droid_config_device *input;
+ const pa_droid_config_hw_module *module) {
+ const pa_droid_config_device *primary_output = NULL;
+ const pa_droid_config_device *output;
+ const pa_droid_config_device *input;
pa_assert(ps);
pa_assert(module);
- pa_assert(primary_output && primary_output->direction == PA_DIRECTION_OUTPUT);
+
+ SLLIST_FOREACH(output, module->outputs) {
+ if (output->flags & AUDIO_OUTPUT_FLAG_PRIMARY) {
+ primary_output = output;
+ break;
+ }
+ }
/* Each distinct hw module output matches one profile. If there are multiple inputs
* combinations are made so that all possible outputs and inputs can be selected.
@@ -237,7 +242,7 @@
pa_droid_profile_set *ps;
ps = profile_set_new(module);
- add_all_profiles(ps, module, NULL);
+ add_all_profiles(ps, module);
return ps;
}
@@ -247,9 +252,7 @@
const pa_droid_config_device *primary_output,
const pa_droid_config_device *low_latency_output,
const pa_droid_config_device *media_latency_output,
- const pa_droid_config_device *builtin_input,
- const pa_droid_config_device *external_input,
- bool merge_inputs) {
+ const pa_droid_config_device *inputs) {
pa_droid_profile *p;
@@ -258,8 +261,6 @@
pa_assert(!primary_output || primary_output->direction == PA_DIRECTION_OUTPUT);
pa_assert(!low_latency_output || primary_output->direction == PA_DIRECTION_OUTPUT);
pa_assert(!media_latency_output || primary_output->direction == PA_DIRECTION_OUTPUT);
- pa_assert(!builtin_input || builtin_input->direction == PA_DIRECTION_INPUT);
- pa_assert(!external_input || external_input->direction == PA_DIRECTION_INPUT);
pa_log_debug("New default profile");
@@ -272,35 +273,21 @@
if (media_latency_output && primary_output != media_latency_output && low_latency_output != media_latency_output)
pa_idxset_put(p->output_mappings, pa_droid_mapping_get(ps, media_latency_output), NULL);
- if (builtin_input && external_input && builtin_input != external_input && merge_inputs) {
- pa_idxset_put(p->input_mappings, pa_droid_mapping_merged_get(ps, builtin_input, external_input), NULL);
- } else {
- if (builtin_input)
- pa_idxset_put(p->input_mappings, pa_droid_mapping_get(ps, builtin_input), NULL);
- if (external_input && builtin_input != external_input)
- pa_idxset_put(p->input_mappings, pa_droid_mapping_get(ps, external_input), NULL);
- }
+ if (inputs)
+ p->input_mapping = pa_droid_mapping_get(ps, inputs);
- p->priority += DEFAULT_PRIORITY * (pa_idxset_size(p->output_mappings) + pa_idxset_size(p->input_mappings));
+ p->priority += DEFAULT_PRIORITY * (pa_idxset_size(p->output_mappings) + p->input_mapping ? 1 : 0);
p->priority += primary_output ? DEFAULT_PRIORITY : 0;
pa_hashmap_put(ps->profiles, p->name, p);
}
static void auto_add_profiles(pa_droid_profile_set *ps,
- const pa_droid_config_hw_module *module,
- bool merge_inputs) {
+ const pa_droid_config_hw_module *module) {
const pa_droid_config_device *output;
- const pa_droid_config_device *input;
-
const pa_droid_config_device *primary_output = NULL;
const pa_droid_config_device *low_latency_output = NULL;
const pa_droid_config_device *media_latency_output = NULL;
- const pa_droid_config_device *builtin_input = NULL;
- const pa_droid_config_device *external_input = NULL;
-
- uint32_t input_devices;
-
pa_assert(ps);
pa_assert(module);
@@ -314,6 +301,11 @@
pa_log_debug("Ignore output %s with flag AUDIO_OUTPUT_FLAG_RAW", output->name);
#endif
+#if defined(HAVE_ENUM_AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)
+ else if (output->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)
+ pa_log_debug("Ignore output %s with flag AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD", output->name);
+#endif
+
else if (output->flags & AUDIO_OUTPUT_FLAG_FAST)
low_latency_output = output;
@@ -321,30 +313,16 @@
media_latency_output = output;
}
- SLLIST_FOREACH(input, module->inputs) {
- input_devices = input->devices;
-#if AUDIO_API_VERSION_MAJ >= 2
- input_devices &= ~AUDIO_DEVICE_BIT_IN;
-#endif
- if (input_devices & (AUDIO_DEVICE_IN_BUILTIN_MIC | AUDIO_DEVICE_IN_BACK_MIC))
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-12.2.82.tar.bz2/src/common/include/droid/droid-util.h
^
|
@@ -92,13 +92,18 @@
pa_idxset *inputs;
pa_hook_slot *sink_put_hook_slot;
pa_hook_slot *sink_unlink_hook_slot;
- pa_hook_slot *source_put_hook_slot;
- pa_hook_slot *source_unlink_hook_slot;
pa_atomic_t active_outputs;
pa_droid_quirks *quirks;
- pa_hook hooks[PA_DROID_HOOK_MAX];
+
+ /* Mode and input control */
+ struct _state {
+ audio_mode_t mode;
+ audio_devices_t input_device;
+ audio_source_t audio_source;
+ pa_droid_stream *active_input;
+ } state;
};
struct pa_droid_output_stream {
@@ -113,12 +118,10 @@
struct audio_stream_in *stream;
pa_sample_spec sample_spec;
pa_channel_map channel_map;
- pa_sample_spec input_sample_spec;
- pa_channel_map input_channel_map;
+ pa_sample_spec req_sample_spec;
+ pa_channel_map req_channel_map;
uint32_t flags;
uint32_t device;
- audio_devices_t all_devices;
- bool merged;
};
struct pa_droid_stream {
@@ -162,8 +165,8 @@
pa_droid_profile_set *profile_set;
const pa_droid_config_device *output;
- const pa_droid_config_device *input;
- const pa_droid_config_device *input2;
+ /* Use all devices in one input */
+ const pa_droid_config_device *inputs;
char *name;
char *description;
@@ -189,9 +192,12 @@
unsigned priority;
/* Idxsets contain pa_droid_mapping objects.
- * Profile doesn't own the mappings. */
+ * Profile doesn't own the mappings, these
+ * are references to structs in profile set
+ * hashmaps. */
pa_idxset *output_mappings;
- pa_idxset *input_mappings;
+ /* Only one input */
+ pa_droid_mapping *input_mapping;
} pa_droid_profile;
@@ -240,24 +246,24 @@
return hw->quirks && hw->quirks->enabled[quirk];
}
+bool pa_droid_hw_set_mode(pa_droid_hw_module *hw_module, audio_mode_t mode);
+bool pa_droid_hw_has_mic_control(pa_droid_hw_module *hw);
+int pa_droid_hw_mic_get_mute(pa_droid_hw_module *hw_module, bool *muted);
+void pa_droid_hw_mic_set_mute(pa_droid_hw_module *hw_module, bool muted);
+
/* 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_default_new(const pa_droid_config_hw_module *module,
- bool merge_inputs);
+pa_droid_profile_set *pa_droid_profile_set_default_new(const pa_droid_config_hw_module *module);
void pa_droid_profile_set_free(pa_droid_profile_set *ps);
void pa_droid_profile_add_mapping(pa_droid_profile *p, pa_droid_mapping *am);
void pa_droid_profile_free(pa_droid_profile *p);
pa_droid_mapping *pa_droid_mapping_get(pa_droid_profile_set *ps, const pa_droid_config_device *device);
-pa_droid_mapping *pa_droid_mapping_merged_get(pa_droid_profile_set *ps,
- const pa_droid_config_device *input1,
- const pa_droid_config_device *input2);
bool pa_droid_mapping_is_primary(pa_droid_mapping *am);
/* Go through idxset containing pa_droid_mapping objects and if primary output or input
* mapping is found, return pointer to that mapping. */
pa_droid_mapping *pa_droid_idxset_get_primary(pa_idxset *i);
-pa_droid_mapping *pa_droid_idxset_mapping_with_device(pa_idxset *i, uint32_t flag);
void pa_droid_mapping_free(pa_droid_mapping *am);
/* Add ports from sinks/sources.
@@ -267,8 +273,6 @@
* May be called multiple times for one card profile. */
void pa_droid_add_card_ports(pa_card_profile *cp, pa_hashmap *ports, pa_droid_mapping *am, pa_core *core);
-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);
@@ -296,12 +300,16 @@
*/
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,
- pa_droid_mapping *am);
+/* Open input stream with currently active routing, sample_spec and channel_map
+ * are requests and may change when opening the stream. */
+pa_droid_stream *pa_droid_open_input_stream(pa_droid_hw_module *hw_module,
+ const pa_sample_spec *requested_sample_spec,
+ const pa_channel_map *requested_channel_map);
+bool pa_droid_hw_set_input_device(pa_droid_hw_module *hw_module,
+ audio_devices_t device);
+
+const pa_sample_spec *pa_droid_stream_sample_spec(pa_droid_stream *stream);
+const pa_channel_map *pa_droid_stream_channel_map(pa_droid_stream *stream);
bool pa_droid_stream_is_primary(pa_droid_stream *s);
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-12.2.82.tar.bz2/src/droid/Makefile.am
^
|
@@ -15,17 +15,11 @@
modlibexec_LTLIBRARIES = \
libdroid-sink.la \
libdroid-source.la \
- module-droid-keepalive.la \
module-droid-sink.la \
module-droid-source.la \
module-droid-card.la
-noinst_HEADERS = module-droid-sink-symdef.h module-droid-source-symdef.h module-droid-card-symdef.h module-droid-keepalive-symdef.h
-
-module_droid_keepalive_la_SOURCES = keepalive.c keepalive.h module-droid-keepalive.c
-module_droid_keepalive_la_LDFLAGS = -module -avoid-version -Wl,-z,noexecstack
-module_droid_keepalive_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS)
-module_droid_keepalive_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS)
+noinst_HEADERS = module-droid-sink-symdef.h module-droid-source-symdef.h module-droid-card-symdef.h
libdroid_sink_la_SOURCES = droid-sink.c droid-sink.h
libdroid_sink_la_LDFLAGS = -avoid-version -Wl,-z,noexecstack -lhybris-common
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-12.2.82.tar.bz2/src/droid/droid-sink.c
^
|
@@ -54,6 +54,7 @@
#include <pulsecore/time-smoother.h>
#include <pulsecore/hashmap.h>
#include <pulsecore/core-subscribe.h>
+#include <pulse/version.h>
#include "droid-sink.h"
#include <droid/droid-util.h>
@@ -371,7 +372,11 @@
pa_log_debug("Thread starting up.");
if (u->core->realtime_scheduling)
+#if PA_CHECK_VERSION(13,0,0)
+ pa_thread_make_realtime(u->core->realtime_priority);
+#else
pa_make_realtime(u->core->realtime_priority);
+#endif
pa_thread_mq_install(&u->thread_mq);
@@ -398,11 +403,7 @@
pa_rtpoll_set_timer_disabled(u->rtpoll);
/* Sleep */
-#if (PULSEAUDIO_VERSION == 5)
- if ((ret = pa_rtpoll_run(u->rtpoll, true)) < 0)
-#elif (PULSEAUDIO_VERSION >= 6)
if ((ret = pa_rtpoll_run(u->rtpoll)) < 0)
-#endif
goto fail;
if (ret == 0)
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-12.2.82.tar.bz2/src/droid/droid-source.c
^
|
@@ -51,6 +51,7 @@
#include <pulsecore/rtpoll.h>
#include <pulsecore/time-smoother.h>
#include <pulsecore/resampler.h>
+#include <pulse/version.h>
#include "droid-source.h"
#include <droid/droid-util.h>
@@ -73,8 +74,6 @@
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;
@@ -96,12 +95,17 @@
static int suspend(struct userdata *u);
static void unsuspend(struct userdata *u);
+/* Our droid source may be left in a state of not having an input stream
+ * if reconfiguration fails and fallback to previously active values fails
+ * as well. In this case just avoid using the stream but don't die. */
+#define assert_stream(x, action) if (!x) do { pa_log_warn("Assert " #x " failed."); action; } while(0)
+
static int do_routing(struct userdata *u, audio_devices_t devices) {
int ret;
audio_devices_t old_device;
pa_assert(u);
- pa_assert(u->stream);
+ assert_stream(u->stream, return 0);
if (u->primary_devices == devices)
pa_log_debug("Refresh active device routing.");
@@ -208,7 +212,11 @@
pa_log_debug("Thread starting up.");
if (u->core->realtime_scheduling)
+#if PA_CHECK_VERSION(13,0,0)
+ pa_thread_make_realtime(u->core->realtime_priority);
+#else
pa_make_realtime(u->core->realtime_priority);
+#endif
pa_thread_mq_install(&u->thread_mq);
@@ -225,11 +233,7 @@
pa_rtpoll_set_timer_disabled(u->rtpoll);
/* Sleep */
-#if (PULSEAUDIO_VERSION == 5)
- if ((ret = pa_rtpoll_run(u->rtpoll, true)) < 0)
-#elif (PULSEAUDIO_VERSION >= 6)
if ((ret = pa_rtpoll_run(u->rtpoll)) < 0)
-#endif
goto fail;
if (ret == 0)
@@ -252,7 +256,7 @@
int ret;
pa_assert(u);
- pa_assert(u->stream);
+ assert_stream(u->stream, return 0);
ret = pa_droid_stream_suspend(u->stream, true);
@@ -265,9 +269,10 @@
/* Called from IO context */
static void unsuspend(struct userdata *u) {
pa_assert(u);
- pa_assert(u->stream);
- if (pa_droid_stream_suspend(u->stream, false) >= 0) {
+ if (!u->stream) {
+ assert_stream(u->stream, u->stream_valid = false);
+ } else if (pa_droid_stream_suspend(u->stream, false) >= 0) {
u->stream_valid = true;
pa_log_info("Resuming...");
} else
@@ -364,9 +369,9 @@
return 0;
}
- pa_log_debug("Source set port %u", data->device);
+ pa_log_debug("Source set port %#010x", data->device);
- if (!PA_SOURCE_IS_OPENED(pa_source_get_state(u->source)))
+ if (!PA_SOURCE_IS_OPENED(u->source->state))
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);
@@ -396,60 +401,30 @@
}
}
-#if (PULSEAUDIO_VERSION == 5)
-static void source_get_mute_cb(pa_source *s) {
-#elif (PULSEAUDIO_VERSION >= 6)
static int source_get_mute_cb(pa_source *s, bool *muted) {
-#endif
struct userdata *u = s->userdata;
- int ret = 0;
- bool b;
pa_assert(u);
- pa_assert(u->hw_module && u->hw_module->device);
+ pa_assert(u->hw_module);
- pa_droid_hw_module_lock(u->hw_module);
- if (u->hw_module->device->get_mic_mute(u->hw_module->device, &b) < 0) {
- pa_log("Failed to get mute state.");
- ret = -1;
- }
- pa_droid_hw_module_unlock(u->hw_module);
-
-#if (PULSEAUDIO_VERSION == 5)
- if (ret == 0)
- s->muted = b;
-#elif (PULSEAUDIO_VERSION >= 6)
- if (ret == 0)
- *muted = b;
-
- return ret;
-#endif
+ return pa_droid_hw_mic_get_mute(u->hw_module, muted);
}
static void source_set_mute_cb(pa_source *s) {
struct userdata *u = s->userdata;
pa_assert(u);
- pa_assert(u->hw_module && u->hw_module->device);
- pa_droid_hw_module_lock(u->hw_module);
- if (u->hw_module->device->set_mic_mute(u->hw_module->device, s->muted) < 0)
- pa_log("Failed to set mute state to %smuted.", s->muted ? "" : "un");
- pa_droid_hw_module_unlock(u->hw_module);
+ pa_droid_hw_mic_set_mute(u->hw_module, s->muted);
}
static void source_set_mute_control(struct userdata *u) {
pa_assert(u);
pa_assert(u->hw_module && u->hw_module->device);
- if (u->hw_module->device->set_mic_mute) {
- pa_log_info("Using hardware mute control for %s", u->source->name);
+ if (pa_droid_hw_has_mic_control(u->hw_module)) {
pa_source_set_get_mute_callback(u->source, source_get_mute_cb);
pa_source_set_set_mute_callback(u->source, source_set_mute_cb);
- } else {
- pa_log_info("Using software mute control for %s", u->source->name);
- pa_source_set_get_mute_callback(u->source, NULL);
- pa_source_set_set_mute_callback(u->source, NULL);
}
}
@@ -457,9 +432,13 @@
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->stream)
+ u->buffer_size = pa_droid_stream_buffer_size(u->stream);
+ else
+ u->buffer_size = 1024; /* Random valid value */
+
+ assert_stream(u->stream, return);
if (u->source_buffer_size) {
u->buffer_size = pa_droid_buffer_size_round_up(u->source_buffer_size, u->buffer_size);
@@ -468,53 +447,66 @@
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->input->sample_spec));
+ pa_source_set_fixed_latency_within_thread(u->source, pa_bytes_to_usec(u->buffer_size, pa_droid_stream_sample_spec(u->stream)));
else
- pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(u->buffer_size, &u->stream->input->sample_spec));
+ pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(u->buffer_size, pa_droid_stream_sample_spec(u->stream)));
- pa_log_debug("Set fixed latency %" PRIu64 " usec", pa_bytes_to_usec(u->buffer_size, &u->stream->input->sample_spec));
+ pa_log_debug("Set fixed latency %" PRIu64 " usec", pa_bytes_to_usec(u->buffer_size, pa_droid_stream_sample_spec(u->stream)));
}
-/* 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);
+static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_output_new_data *new_data, struct userdata *u) {
+ pa_channel_map old_channel_map;
+ pa_sample_spec old_sample_spec;
+ pa_channel_map new_channel_map;
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-12.2.82.tar.bz2/src/droid/module-droid-card.c
^
|
@@ -60,6 +60,7 @@
//#include <droid/system/audio_policy.h>
#include <droid/droid-util.h>
+#include <droid/sllist.h>
#include "droid-sink.h"
#include "droid-source.h"
@@ -82,7 +83,7 @@
"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> "
"default_profile=<boolean. create default profile for primary module or not. defaults to true> "
- "merge_inputs=<boolean. merge input streams to single source with default profile. defaults to true> "
+ "merge_inputs=<unused, always true> "
"quirks=<comma separated list of quirks to enable/disable>"
);
@@ -116,6 +117,7 @@
"voice_property_value",
"default_profile",
"combine",
+ "merge_inputs",
"quirks",
NULL,
};
@@ -138,8 +140,8 @@
typedef bool (*virtual_profile_event_cb)(struct userdata *u, pa_droid_profile *p, bool enabling);
struct virtual_profile {
+ bool enabled;
pa_card_profile *parent;
- pa_card_profile *extension;
virtual_profile_event_cb event_cb;
};
@@ -156,14 +158,15 @@
pa_droid_hw_module *hw_module;
pa_droid_card_data card_data;
- pa_droid_profile *old_profile;
+ pa_card_profile *real_profile;
pa_modargs *modargs;
pa_card *card;
};
struct profile_data {
- pa_droid_profile *profile;
+ pa_droid_profile *droid_profile;
+ pa_card_profile *card_profile;
audio_mode_t mode;
bool virtual_profile;
/* Variables for virtual profiles: */
@@ -177,10 +180,12 @@
#define AUDIO_PARAMETER_KEY_CALL_STATE "call_state"
/* From hal/voice_extn/voice_extn.c */
-#define VOICE2_VSID 0x10DC1000
-#define VOLTE_VSID 0x10C02000
-#define QCHAT_VSID 0x10803000
-#define VOWLAN_VSID 0x10002000
+#define VOICE2_VSID (0x10DC1000)
+#define VOLTE_VSID (0x10C02000)
+#define QCHAT_VSID (0x10803000)
+#define VOWLAN_VSID (0x10002000)
+#define VOICEMMODE1_VSID (0x11C05000)
+#define VOICEMMODE2_VSID (0x11DC5000)
/* From hal/voice.h */
#define BASE_CALL_STATE 1
@@ -189,22 +194,28 @@
#define VOICE_VSID 0x10C01000
/* For virtual profiles */
-#define VOICE_SESSION_VOICE1_PROFILE_NAME "voicecall-voice1"
-#define VOICE_SESSION_VOICE1_PROFILE_DESC "Call mode, default to voice 1 vsid"
-#define VOICE_SESSION_VOICE2_PROFILE_NAME "voicecall-voice2"
-#define VOICE_SESSION_VOICE2_PROFILE_DESC "Call mode, default to voice 2 vsid"
-#define VOICE_SESSION_VOLTE_PROFILE_NAME "voicecall-volte"
-#define VOICE_SESSION_VOLTE_PROFILE_DESC "Call mode, default to volte vsid"
-#define VOICE_SESSION_QCHAT_PROFILE_NAME "voicecall-qchat"
-#define VOICE_SESSION_QCHAT_PROFILE_DESC "Call mode, default to qchat vsid"
-#define VOICE_SESSION_VOWLAN_PROFILE_NAME "voicecall-vowlan"
-#define VOICE_SESSION_VOWLAN_PROFILE_DESC "Call mode, default to vowlan vsid"
+#define VOICE_SESSION_VOICE1_PROFILE_NAME "voicecall-voice1"
+#define VOICE_SESSION_VOICE1_PROFILE_DESC "Call mode, default to voice 1 vsid"
+#define VOICE_SESSION_VOICE2_PROFILE_NAME "voicecall-voice2"
+#define VOICE_SESSION_VOICE2_PROFILE_DESC "Call mode, default to voice 2 vsid"
+#define VOICE_SESSION_VOLTE_PROFILE_NAME "voicecall-volte"
+#define VOICE_SESSION_VOLTE_PROFILE_DESC "Call mode, default to volte vsid"
+#define VOICE_SESSION_QCHAT_PROFILE_NAME "voicecall-qchat"
+#define VOICE_SESSION_QCHAT_PROFILE_DESC "Call mode, default to qchat vsid"
+#define VOICE_SESSION_VOWLAN_PROFILE_NAME "voicecall-vowlan"
+#define VOICE_SESSION_VOWLAN_PROFILE_DESC "Call mode, default to vowlan vsid"
+#define VOICE_SESSION_VOICEMMODE1_PROFILE_NAME "voicecall-voicemmode1"
+#define VOICE_SESSION_VOICEMMODE1_PROFILE_DESC "Call mode, default to voicemmode1 vsid"
+#define VOICE_SESSION_VOICEMMODE2_PROFILE_NAME "voicecall-voicemmode2"
+#define VOICE_SESSION_VOICEMMODE2_PROFILE_DESC "Call mode, default to voicemmode2 vsid"
static bool voicecall_voice1_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
static bool voicecall_voice2_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
static bool voicecall_volte_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
static bool voicecall_qchat_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
static bool voicecall_vowlan_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
+static bool voicecall_voicemmode1_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
+static bool voicecall_voicemmode2_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
#endif /* DROID_AUDIO_HAL_USE_VSID */
@@ -216,7 +227,8 @@
cp->available = PA_AVAILABLE_YES;
d = PA_CARD_PROFILE_DATA(cp);
- d->profile = NULL;
+ d->droid_profile = NULL;
+ d->card_profile = cp;
pa_hashmap_put(profiles, cp->name, cp);
}
@@ -228,7 +240,7 @@
pa_hashmap *profiles) {
pa_droid_profile *ap;
pa_card_profile *cp;
- struct profile_data *d, *ext;
+ struct profile_data *d;
pa_assert(u);
pa_assert(u->profile_set);
@@ -246,17 +258,12 @@
cp = pa_card_profile_new(ap->name, ap->description, sizeof(struct profile_data));
cp->available = available;
d = PA_CARD_PROFILE_DATA(cp);
- d->profile = ap;
+ d->droid_profile = ap;
+ d->card_profile = cp;
d->virtual_profile = true;
d->mode = audio_mode;
d->virtual.event_cb = event_cb;
- d->virtual.extension = NULL;
- if (extension_to) {
- ext = PA_CARD_PROFILE_DATA(extension_to);
- ext->virtual.extension = cp;
- d->virtual.parent = extension_to;
- } else
- d->virtual.parent = NULL;
+ d->virtual.parent = extension_to;
pa_hashmap_put(profiles, cp->name, cp);
@@ -321,16 +328,19 @@
cp->max_sink_channels = max_channels;
max_channels = 0;
- PA_IDXSET_FOREACH(am, ap->input_mappings, idx) {
+ if ((am = ap->input_mapping)) {
+ const pa_droid_config_device *input;
cp->n_sources++;
pa_droid_add_card_ports(cp, ports, am, u->core);
- max_channels = popcount(am->input->channel_masks) > max_channels
- ? popcount(am->input->channel_masks) : max_channels;
+ SLLIST_FOREACH(input, am->inputs)
+ max_channels = popcount(input->channel_masks) > max_channels
+ ? popcount(input->channel_masks) : max_channels;
}
cp->max_source_channels = max_channels;
d = PA_CARD_PROFILE_DATA(cp);
- d->profile = ap;
+ d->droid_profile = ap;
+ d->card_profile = cp;
d->virtual_profile = false;
d->mode = AUDIO_MODE_NORMAL;
@@ -361,52 +371,17 @@
d = PA_CARD_PROFILE_DATA(u->card->active_profile);
- if (d->profile && pa_idxset_size(d->profile->output_mappings) > 0) {
- PA_IDXSET_FOREACH(am, d->profile->output_mappings, idx) {
+ if (d->droid_profile && pa_idxset_size(d->droid_profile->output_mappings) > 0) {
+ PA_IDXSET_FOREACH(am, d->droid_profile->output_mappings, idx) {
am->sink = pa_droid_sink_new(u->module, u->modargs, __FILE__, &u->card_data, 0, am, u->card);
}
}
- if (d->profile && pa_idxset_size(d->profile->input_mappings) > 0) {
- PA_IDXSET_FOREACH(am, d->profile->input_mappings, idx) {
- am->source = pa_droid_source_new(u->module, u->modargs, __FILE__, (audio_devices_t) 0, &u->card_data, am, u->card);
- }
+ if (d->droid_profile && (am = d->droid_profile->input_mapping)) {
+ am->source = pa_droid_source_new(u->module, u->modargs, __FILE__, (audio_devices_t) 0, &u->card_data, am, u->card);
}
}
-static int set_mode(struct userdata *u, audio_mode_t mode) {
- int ret;
- const char *mode_str;
-
- pa_assert(u);
- pa_assert(u->hw_module);
|