[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -2,7 +2,7 @@
<service name="tar_git">
<param name="url">https://github.com/mer-hybris/pulseaudio-modules-droid.git</param>
<param name="branch">master</param>
- <param name="revision">81562f0d818f80010e1f62f0463e577a6929445f</param>
+ <param name="revision"/>
<param name="token"/>
<param name="debian"/>
<param name="dumb"/>
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-6.0.45.tar.bz2/src/common/droid-util-44.h
^
|
@@ -90,7 +90,7 @@
};
uint32_t conversion_table_default_audio_source[][2] = {
-#if defined(DROID_DEVICE_HAMMERHEAD) || defined(DROID_DEVICE_ARMANI)
+#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 },
@@ -179,6 +179,35 @@
};
/* Input devices */
+#ifdef DROID_DEVICE_MAKO
+struct string_conversion string_conversion_table_input_device[] = {
+ { 0x10000, "AUDIO_DEVICE_IN_COMMUNICATION" },
+ { 0x20000, "AUDIO_DEVICE_IN_AMBIENT" },
+ { 0x40000, "AUDIO_DEVICE_IN_BUILTIN_MIC" },
+ { 0x80000, "AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET" },
+ { 0x100000, "AUDIO_DEVICE_IN_WIRED_HEADSET" },
+ { 0x200000, "AUDIO_DEVICE_IN_AUX_DIGITAL" },
+ { 0x400000, "AUDIO_DEVICE_IN_VOICE_CALL" },
+ { 0x800000, "AUDIO_DEVICE_IN_BACK_MIC" },
+ { 0x40000000, "AUDIO_DEVICE_IN_DEFAULT" },
+ { 0x80000000, "AUDIO_DEVICE_IN_REMOTE_SUBMIX" }, // What's this really??
+ { 0, NULL }
+};
+
+struct string_conversion string_conversion_table_input_device_fancy[] = {
+ { 0x10000, "input-communication" },
+ { 0x20000, "input-ambient" },
+ { 0x40000, "input-builtin_mic" },
+ { 0x80000, "input-bluetooth_sco_headset" },
+ { 0x100000, "input-wired_headset" },
+ { 0x200000, "input-aux_digital" },
+ { 0x400000, "input-voice_call" },
+ { 0x800000, "input-back_mic" },
+ { 0x40000000, "input-default" },
+ { 0x80000000, "input-remote_submix" },
+ { 0, NULL }
+};
+#else
struct string_conversion string_conversion_table_input_device[] = {
STRING_ENTRY(AUDIO_DEVICE_IN_COMMUNICATION),
STRING_ENTRY(AUDIO_DEVICE_IN_AMBIENT),
@@ -228,6 +257,7 @@
{ AUDIO_DEVICE_IN_DEFAULT, "input-default" },
{ 0, NULL }
};
+#endif
struct string_conversion string_conversion_table_audio_source_fancy[] = {
{ AUDIO_SOURCE_DEFAULT, "default" },
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-6.0.45.tar.bz2/src/common/droid-util.c
^
|
@@ -55,6 +55,7 @@
#include <pulsecore/shared.h>
#include <pulsecore/mutex.h>
#include <pulsecore/strlist.h>
+#include <pulsecore/atomic.h>
#include "droid-util.h"
@@ -1530,7 +1531,7 @@
s = pa_xnew0(pa_droid_stream, 1);
PA_REFCNT_INIT(s);
- s->module = module;
+ s->module = pa_droid_hw_module_ref(module);
return s;
}
@@ -1755,6 +1756,8 @@
pa_mutex_unlock(s->module->input_mutex);
}
+ pa_droid_hw_module_unref(s->module);
+
pa_xfree(s);
}
@@ -1938,3 +1941,34 @@
else
return false;
}
+
+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) {
+ pa_atomic_dec(&s->module->active_outputs);
+ 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;
+ }
+}
+
+bool pa_sink_is_droid_sink(pa_sink *s) {
+ const char *api;
+
+ pa_assert(s);
+
+ if ((api = pa_proplist_gets(s->proplist, PA_PROP_DEVICE_API)))
+ return pa_streq(api, PROP_DROID_API_STRING);
+ else
+ return false;
+}
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-6.0.45.tar.bz2/src/common/droid-util.h
^
|
@@ -29,6 +29,7 @@
#include <pulsecore/macro.h>
#include <pulsecore/mutex.h>
#include <pulsecore/strlist.h>
+#include <pulsecore/atomic.h>
#include <android-config.h>
@@ -51,6 +52,7 @@
#define PROP_DROID_DEVICES "droid.devices"
#define PROP_DROID_FLAGS "droid.flags"
#define PROP_DROID_HW_MODULE "droid.hw_module"
+#define PROP_DROID_API_STRING "droid-hal"
#define PA_DROID_PRIMARY_DEVICE "primary"
@@ -84,6 +86,8 @@
pa_idxset *outputs;
pa_idxset *inputs;
+
+ pa_atomic_t active_outputs;
};
struct pa_droid_stream {
@@ -336,4 +340,12 @@
bool pa_droid_stream_is_primary(pa_droid_stream *s);
+int pa_droid_stream_suspend(pa_droid_stream *s, bool suspend);
+
+static inline int pa_droid_output_stream_any_active(pa_droid_stream *s) {
+ return pa_atomic_load(&s->module->active_outputs);
+}
+
+bool pa_sink_is_droid_sink(pa_sink *s);
+
#endif
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-6.0.45.tar.bz2/src/droid/droid-sink.c
^
|
@@ -79,6 +79,12 @@
pa_usec_t buffer_time;
pa_usec_t write_time;
pa_usec_t write_threshold;
+ audio_devices_t prewrite_devices;
+ uint32_t prewrite_silence;
+ pa_hook_slot *sink_put_hook_slot;
+ pa_hook_slot *sink_unlink_hook_slot;
+ pa_hook_slot *sink_port_changed_hook_slot;
+ pa_sink *primary_stream_sink;
audio_devices_t primary_devices;
audio_devices_t extra_devices;
@@ -418,7 +424,7 @@
pa_assert(u->sink);
pa_assert(u->stream->out);
- ret = u->stream->out->common.standby(&u->stream->out->common);
+ ret = pa_droid_stream_suspend(u->stream, true);
if (ret == 0) {
pa_sink_set_max_request_within_thread(u->sink, 0);
@@ -434,6 +440,8 @@
}
static int unsuspend(struct userdata *u) {
+ uint32_t i;
+
pa_assert(u);
pa_assert(u->sink);
@@ -442,6 +450,15 @@
pa_log_info("Resuming...");
+ if (u->prewrite_silence &&
+ (u->primary_devices | u->extra_devices) & u->prewrite_devices &&
+ pa_droid_output_stream_any_active(u->stream) == 0) {
+ for (i = 0; i < u->prewrite_silence; i++)
+ thread_write_silence(u);
+ }
+
+ pa_droid_stream_suspend(u->stream, false);
+
return 0;
}
@@ -859,6 +876,158 @@
return PA_HOOK_OK;
}
+static pa_hook_result_t sink_port_changed_hook_cb(pa_core *c, pa_sink *sink, struct userdata *u) {
+ pa_device_port *port;
+
+ pa_assert(c);
+ pa_assert(sink);
+ pa_assert(u);
+
+ if (sink != u->primary_stream_sink)
+ return PA_HOOK_OK;
+
+ port = sink->active_port;
+ pa_log_info("Set slave sink port to %s", port->name);
+ pa_sink_set_port(u->sink, port->name, false);
+
+ return PA_HOOK_OK;
+}
+
+static void unset_primary_stream_sink(struct userdata *u) {
+ pa_assert(u);
+ pa_assert(u->primary_stream_sink);
+ pa_assert(u->sink_port_changed_hook_slot);
+
+ pa_hook_slot_free(u->sink_port_changed_hook_slot);
+ u->sink_port_changed_hook_slot = NULL;
+ u->primary_stream_sink = NULL;
+}
+
+static pa_hook_result_t sink_unlink_hook_cb(pa_core *c, pa_sink *sink, struct userdata *u) {
+ pa_assert(c);
+ pa_assert(sink);
+ pa_assert(u);
+
+ if (sink != u->primary_stream_sink)
+ return PA_HOOK_OK;
+
+ pa_log_info("Primary stream sink disappeared.");
+ unset_primary_stream_sink(u);
+
+ return PA_HOOK_OK;
+}
+
+static pa_hook_result_t sink_put_hook_cb(pa_core *c, pa_sink *sink, struct userdata *u) {
+ struct userdata *sink_u;
+
+ pa_assert(c);
+ pa_assert(sink);
+ pa_assert(u);
+
+ if (!pa_sink_is_droid_sink(sink))
+ return PA_HOOK_OK;
+
+ sink_u = sink->userdata;
+
+ if (!pa_droid_stream_is_primary(sink_u->stream))
+ return PA_HOOK_OK;
+
+ u->primary_stream_sink = sink;
+
+ pa_assert(!u->sink_port_changed_hook_slot);
+ u->sink_port_changed_hook_slot = pa_hook_connect(&u->core->hooks[PA_CORE_HOOK_SINK_PORT_CHANGED], PA_HOOK_NORMAL,
+ (pa_hook_cb_t) sink_port_changed_hook_cb, u);
+
+ pa_log_info("Primary stream sink setup for slave.");
+
+ sink_port_changed_hook_cb(c, sink, u);
+
+ return PA_HOOK_OK;
+}
+
+static void setup_track_primary(struct userdata *u) {
+ pa_sink *sink;
+ struct userdata *sink_u;
+ uint32_t idx;
+
+ pa_assert(u);
+
+ u->sink_put_hook_slot = pa_hook_connect(&u->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_NORMAL,
+ (pa_hook_cb_t) sink_put_hook_cb, u);
+ u->sink_unlink_hook_slot = pa_hook_connect(&u->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_NORMAL,
+ (pa_hook_cb_t) sink_unlink_hook_cb, u);
+
+ PA_IDXSET_FOREACH(sink, u->core->sinks, idx) {
+ if (pa_sink_is_droid_sink(sink)) {
+ sink_u = sink->userdata;
+ if (pa_droid_stream_is_primary(sink_u->stream)) {
+ sink_put_hook_cb(u->core, sink, u);
+ break;
+ }
+ }
+ }
+}
+
+static bool parse_prewrite_on_resume(struct userdata *u, const char *prewrite_resume, const char *name) {
+ const char *state = NULL;
+ char *entry = NULL;
+ char *devices, *stream, *value;
+ uint32_t devices_len, devices_index, value_index, entry_len;
+ uint32_t b;
+
+ pa_assert(u);
+ pa_assert(prewrite_resume);
+ pa_assert(name);
+
+ /* Argument is string of for example "deep_buffer=AUDIO_DEVICE_OUT_SPEAKER:1,primary=FOO:5" */
+
+ while ((entry = pa_split(prewrite_resume, ",", &state))) {
+
+ entry_len = strlen(entry);
+ devices_index = strcspn(entry, "=");
+
+ if (devices_index == 0 || devices_index >= entry_len - 1)
+ goto error;
+
+ entry[devices_index] = '\0';
+ devices = entry + devices_index + 1;
+ stream = entry;
+
+ devices_len = strlen(devices);
+ value_index = strcspn(devices, ":");
+
+ if (value_index == 0 || value_index >= devices_len - 1)
+ goto error;
+
+ devices[value_index] = '\0';
+ value = devices + value_index + 1;
+
+ if (!parse_device_list(devices, &u->prewrite_devices)) {
+ u->prewrite_devices = 0;
+ goto error;
+ }
+
+ if (strlen(value) == 0 || pa_atou(value, &b) < 0)
+ goto error;
+
+ if (pa_streq(stream, name)) {
+ pa_log_info("Using requested prewrite size for %s: %u (%u * %u).",
+ name, u->buffer_size * b, b, u->buffer_size);
+ u->prewrite_silence = b;
+ pa_xfree(entry);
+ return true;
+ }
+
+ pa_xfree(entry);
+ }
+
+return true;
+
+error:
+ pa_xfree(entry);
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-6.0.45.tar.bz2/src/droid/droid-source.c
^
|
@@ -236,7 +236,7 @@
pa_assert(u);
pa_assert(u->stream);
- ret = u->stream->in->common.standby(&u->stream->in->common);
+ ret = pa_droid_stream_suspend(u->stream, true);
if (ret == 0)
pa_log_info("Device suspended.");
@@ -245,6 +245,15 @@
}
/* Called from IO context */
+static void unsuspend(struct userdata *u) {
+ pa_assert(u);
+ pa_assert(u->stream);
+
+ pa_droid_stream_suspend(u->stream, false);
+ pa_log_info("Resuming...");
+}
+
+/* Called from IO context */
static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
struct userdata *u = PA_SOURCE(o)->userdata;
@@ -265,7 +274,7 @@
case PA_SOURCE_IDLE:
break;
case PA_SOURCE_RUNNING: {
- pa_log_info("Resuming...");
+ unsuspend(u);
u->timestamp = pa_rtclock_now();
break;
}
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-6.0.45.tar.bz2/src/droid/module-droid-card.c
^
|
@@ -107,6 +107,7 @@
"deferred_volume",
"mute_routing_before",
"mute_routing_after",
+ "prewrite_on_resume",
"config",
"voice_property_key",
"voice_property_value",
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-6.0.45.tar.bz2/src/droid/module-droid-sink.c
^
|
@@ -62,6 +62,7 @@
"module_id",
"mute_routing_before",
"mute_routing_after",
+ "prewrite_on_resume",
"sink_buffer",
"deferred_volume",
"voice_property_key",
|