1
From: Ricardo Salveti de Araujo <rsalveti@rsalveti.net>
2
Subject: [PATCH] Adding Pulseaudio Droid module
4
Module that uses the Android Audio HAL for sink/source and mixing.
6
Work done mostly by Juho Hämäläinen <juho.hamalainen@tieto.com>
8
Signed-off-by: Ricardo Salveti de Araujo <rsalveti@rsalveti.net>
10
diff --git a/configure.ac b/configure.ac
11
index 388fae2..34311cf 100644
14
@@ -783,6 +783,21 @@ AC_SUBST(HAVE_ALSA)
15
AM_CONDITIONAL([HAVE_ALSA], [test "x$HAVE_ALSA" = x1])
1
Index: pulseaudio-5.0/configure.ac
2
===================================================================
3
--- pulseaudio-5.0.orig/configure.ac
4
+++ pulseaudio-5.0/configure.ac
5
@@ -794,6 +794,21 @@ AM_CONDITIONAL([HAVE_ALSA], [test "x$HAV
16
6
AS_IF([test "x$HAVE_ALSA" = "x1"], AC_DEFINE([HAVE_ALSA], 1, [Have ALSA?]))
7
AS_IF([test "x$HAVE_ALSA_UCM" = "x1"], AC_DEFINE([HAVE_ALSA_UCM], 1, [Have ALSA UCM?]))
18
9
+#### Android Audio HAL support (optional) ####
33
24
#### EsounD support (optional) ####
35
26
AC_ARG_ENABLE([esound],
36
@@ -1402,6 +1417,7 @@ AS_IF([test "x$HAVE_X11" = "x1"], ENABLE_X11=yes, ENABLE_X11=no)
27
@@ -1415,6 +1430,7 @@ AS_IF([test "x$HAVE_X11" = "x1"], ENABLE
37
28
AS_IF([test "x$HAVE_OSS_OUTPUT" = "x1"], ENABLE_OSS_OUTPUT=yes, ENABLE_OSS_OUTPUT=no)
38
29
AS_IF([test "x$HAVE_OSS_WRAPPER" = "x1"], ENABLE_OSS_WRAPPER=yes, ENABLE_OSS_WRAPPER=no)
39
30
AS_IF([test "x$HAVE_ALSA" = "x1"], ENABLE_ALSA=yes, ENABLE_ALSA=no)
41
32
AS_IF([test "x$HAVE_COREAUDIO" = "x1"], ENABLE_COREAUDIO=yes, ENABLE_COREAUDIO=no)
42
33
AS_IF([test "x$HAVE_SOLARIS" = "x1"], ENABLE_SOLARIS=yes, ENABLE_SOLARIS=no)
43
34
AS_IF([test "x$HAVE_WAVEOUT" = "x1"], ENABLE_WAVEOUT=yes, ENABLE_WAVEOUT=no)
44
@@ -1455,6 +1471,7 @@ echo "
35
@@ -1471,6 +1487,7 @@ echo "
45
36
Enable OSS Wrapper: ${ENABLE_OSS_WRAPPER}
46
37
Enable EsounD: ${ENABLE_ESOUND}
47
38
Enable Alsa: ${ENABLE_ALSA}
49
40
Enable CoreAudio: ${ENABLE_COREAUDIO}
50
41
Enable Solaris: ${ENABLE_SOLARIS}
51
42
Enable WaveOut: ${ENABLE_WAVEOUT}
52
diff --git a/src/Makefile.am b/src/Makefile.am
53
index b8fb4b0..174f811 100644
56
@@ -1175,6 +1175,16 @@ modlibexec_LTLIBRARIES += \
43
Index: pulseaudio-5.0/src/Makefile.am
44
===================================================================
45
--- pulseaudio-5.0.orig/src/Makefile.am
46
+++ pulseaudio-5.0/src/Makefile.am
47
@@ -1196,6 +1196,16 @@ modlibexec_LTLIBRARIES += \
57
48
module-alsa-source.la \
58
49
module-alsa-card.la
70
61
dist_alsaprofilesets_DATA = \
71
62
modules/alsa/mixer/profile-sets/default.conf \
72
63
modules/alsa/mixer/profile-sets/extra-hdmi.conf \
73
@@ -1424,6 +1434,13 @@ SYMDEF_FILES = \
64
@@ -1459,6 +1469,13 @@ SYMDEF_FILES = \
74
65
module-filter-apply-symdef.h \
75
66
module-filter-heuristics-symdef.h
86
77
module-esound-protocol-tcp-symdef.h \
87
@@ -1725,6 +1742,44 @@ libalsa_util_la_LIBADD += $(DBUS_LIBS)
78
@@ -1768,6 +1785,44 @@ libalsa_util_la_LIBADD += $(DBUS_LIBS)
88
79
libalsa_util_la_CFLAGS += $(DBUS_CFLAGS)
129
120
module_alsa_sink_la_SOURCES = modules/alsa/module-alsa-sink.c
130
121
module_alsa_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
131
122
module_alsa_sink_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la
132
diff --git a/src/modules/droid/droid-extcon.c b/src/modules/droid/droid-extcon.c
134
index 0000000..088afb3
123
Index: pulseaudio-5.0/src/modules/droid/droid-extcon.c
124
===================================================================
136
+++ b/src/modules/droid/droid-extcon.c
126
+++ pulseaudio-5.0/src/modules/droid/droid-extcon.c
137
127
@@ -0,0 +1,269 @@
139
129
+ This file is part of PulseAudio.
259
249
+ pa_log_debug("Value of switch %s is now %d.", as->name, as->current_value);
261
251
+ PA_HASHMAP_FOREACH(p, u->card->ports, state) {
262
+ if (p->is_output) {
252
+ if (p->direction == PA_DIRECTION_OUTPUT) {
263
253
+ if (!strcmp(p->name, "output-wired_headset"))
264
254
+ pa_device_port_set_available(p, hsmic_avail(as->current_value));
265
255
+ if (!strcmp(p->name, "output-wired_headphone"))
266
256
+ pa_device_port_set_available(p, hponly_avail(as->current_value));
258
+ if (p->direction == PA_DIRECTION_INPUT) {
269
259
+ if (!strcmp(p->name, "input-wired_headset"))
270
260
+ pa_device_port_set_available(p, hsmic_avail(as->current_value));
407
diff --git a/src/modules/droid/droid-extcon.h b/src/modules/droid/droid-extcon.h
409
index 0000000..7cb7ad2
397
Index: pulseaudio-5.0/src/modules/droid/droid-extcon.h
398
===================================================================
411
+++ b/src/modules/droid/droid-extcon.h
400
+++ pulseaudio-5.0/src/modules/droid/droid-extcon.h
413
402
+#ifndef foodroidextconhfoo
414
403
+#define foodroidextconhfoo
442
431
+void pa_droid_extcon_free(pa_droid_extcon *);
445
diff --git a/src/modules/droid/droid-sink.c b/src/modules/droid/droid-sink.c
447
index 0000000..68e3cef
434
Index: pulseaudio-5.0/src/modules/droid/droid-sink.c
435
===================================================================
449
+++ b/src/modules/droid/droid-sink.c
437
+++ pulseaudio-5.0/src/modules/droid/droid-sink.c
450
438
@@ -0,0 +1,1245 @@
452
440
+ * Copyright (C) 2013 Jolla Ltd.
1396
1392
+ u->deferred_volume = deferred_volume;
1397
1393
+ u->rtpoll = pa_rtpoll_new();
1398
1394
+ pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
1399
+ u->parameters = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
1395
+ u->parameters = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) parameter_free);
1400
1396
+ u->voice_property_key = pa_xstrdup(pa_modargs_get_value(ma, "voice_property_key", DEFAULT_VOICE_CONTROL_PROPERTY_KEY));
1401
1397
+ u->voice_property_value = pa_xstrdup(pa_modargs_get_value(ma, "voice_property_value", DEFAULT_VOICE_CONTROL_PROPERTY_VALUE));
1402
1398
+ u->sco_fake_sink = pa_sco_fake_sink_discover(u->core, pa_modargs_get_value(ma, "sco_fake_sink", DEFAULT_SCO_FAKE_SINK));
1669
1657
+ pa_sink_unref(u->sink);
1671
1659
+ if (u->parameters)
1672
+ pa_hashmap_free(u->parameters, (pa_free_cb_t) parameter_free);
1660
+ pa_hashmap_free(u->parameters);
1674
1662
+ if (u->hw_module && u->stream_out) {
1675
1663
+ pa_droid_hw_module_lock(u->hw_module);
1696
diff --git a/src/modules/droid/droid-sink.h b/src/modules/droid/droid-sink.h
1697
new file mode 100644
1698
index 0000000..a3483a9
1684
Index: pulseaudio-5.0/src/modules/droid/droid-sink.h
1685
===================================================================
1700
+++ b/src/modules/droid/droid-sink.h
1687
+++ pulseaudio-5.0/src/modules/droid/droid-sink.h
1701
1688
@@ -0,0 +1,57 @@
1702
1689
+#ifndef foodroidsinkfoo
1703
1690
+#define foodroidsinkfoo
1756
1743
+void pa_droid_sink_set_voice_control(pa_sink* sink, bool enable);
1759
diff --git a/src/modules/droid/droid-source.c b/src/modules/droid/droid-source.c
1760
new file mode 100644
1761
index 0000000..1fbea89
1746
Index: pulseaudio-5.0/src/modules/droid/droid-source.c
1747
===================================================================
1763
+++ b/src/modules/droid/droid-source.c
1749
+++ pulseaudio-5.0/src/modules/droid/droid-source.c
1764
1750
@@ -0,0 +1,667 @@
1766
1752
+ * Copyright (C) 2013 Jolla Ltd.
2432
diff --git a/src/modules/droid/droid-source.h b/src/modules/droid/droid-source.h
2433
new file mode 100644
2434
index 0000000..342af00
2418
Index: pulseaudio-5.0/src/modules/droid/droid-source.h
2419
===================================================================
2436
+++ b/src/modules/droid/droid-source.h
2421
+++ pulseaudio-5.0/src/modules/droid/droid-source.h
2437
2422
@@ -0,0 +1,56 @@
2438
2423
+#ifndef foodroidsourcefoo
2439
2424
+#define foodroidsourcefoo
2491
2476
+void pa_droid_source_set_routing(pa_source *s, bool enabled);
2494
diff --git a/src/modules/droid/droid-util-41qc.h b/src/modules/droid/droid-util-41qc.h
2495
new file mode 100644
2496
index 0000000..a791565
2479
Index: pulseaudio-5.0/src/modules/droid/droid-util-41qc.h
2480
===================================================================
2498
+++ b/src/modules/droid/droid-util-41qc.h
2482
+++ pulseaudio-5.0/src/modules/droid/droid-util-41qc.h
2499
2483
@@ -0,0 +1,274 @@
2501
2485
+ * Copyright (C) 2013 Jolla Ltd.
2771
2755
+#undef STRING_ENTRY
2774
diff --git a/src/modules/droid/droid-util-42.h b/src/modules/droid/droid-util-42.h
2775
new file mode 100644
2776
index 0000000..3f1759b
2758
Index: pulseaudio-5.0/src/modules/droid/droid-util-42.h
2759
===================================================================
2778
+++ b/src/modules/droid/droid-util-42.h
2761
+++ pulseaudio-5.0/src/modules/droid/droid-util-42.h
2779
2762
@@ -0,0 +1,286 @@
2781
2764
+ * Copyright (C) 2013 Jolla Ltd.
3066
diff --git a/src/modules/droid/droid-util.c b/src/modules/droid/droid-util.c
3067
new file mode 100644
3068
index 0000000..185bd23
3049
Index: pulseaudio-5.0/src/modules/droid/droid-util.c
3050
===================================================================
3070
+++ b/src/modules/droid/droid-util.c
3052
+++ pulseaudio-5.0/src/modules/droid/droid-util.c
3073
3055
+ * Copyright (C) 2013 Jolla Ltd.
3728
3717
+ ps = pa_xnew0(pa_droid_profile_set, 1);
3729
3718
+ ps->config = module->config;
3730
+ ps->profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
3731
+ ps->output_mappings = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
3732
+ ps->input_mappings = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
3733
+ ps->all_ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
3719
+ ps->profiles = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) pa_droid_profile_free);
3720
+ ps->output_mappings = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) pa_droid_mapping_free);
3721
+ ps->input_mappings = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) pa_droid_mapping_free);
3722
+ ps->all_ports = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) droid_port_free);
3735
3724
+ /* Each distinct hw module output matches one profile. If there are multiple inputs
3736
3725
+ * combinations are made so that all possible outputs and inputs can be selected.
3767
3756
+ pa_xfree(ap);
3770
+static void droid_port_free(pa_droid_port *p) {
3773
+ pa_xfree(p->name);
3774
+ pa_xfree(p->description);
3778
3759
+void pa_droid_profile_set_free(pa_droid_profile_set *ps) {
3779
3760
+ pa_assert(ps);
3781
3762
+ if (ps->output_mappings)
3782
+ pa_hashmap_free(ps->output_mappings, (pa_free_cb_t) pa_droid_mapping_free);
3763
+ pa_hashmap_free(ps->output_mappings);
3784
3765
+ if (ps->input_mappings)
3785
+ pa_hashmap_free(ps->input_mappings, (pa_free_cb_t) pa_droid_mapping_free);
3766
+ pa_hashmap_free(ps->input_mappings);
3787
3768
+ if (ps->all_ports)
3788
+ pa_hashmap_free(ps->all_ports, (pa_free_cb_t) droid_port_free);
3769
+ pa_hashmap_free(ps->all_ports);
3790
3771
+ if (ps->profiles)
3791
+ pa_hashmap_free(ps->profiles, (pa_free_cb_t) pa_droid_profile_free);
3772
+ pa_hashmap_free(ps->profiles);
3793
3774
+ pa_xfree(ps);
4027
4008
+ PA_IDXSET_FOREACH(p, am->ports, idx) {
4028
4009
+ if (!(dp = pa_hashmap_get(ports, p->name))) {
4029
4010
+ pa_log_debug(" New port %s", p->name);
4030
+ dp = pa_device_port_new(core, p->name, p->description, sizeof(pa_droid_port_data));
4012
+ pa_device_port_new_data port_data;
4013
+ pa_device_port_new_data_init(&port_data);
4014
+ pa_device_port_new_data_set_name(&port_data, p->name);
4015
+ pa_device_port_new_data_set_description(&port_data, p->description);
4016
+ pa_device_port_new_data_set_direction(&port_data, p->mapping->direction);
4017
+ dp = pa_device_port_new(core, &port_data, sizeof(pa_droid_port_data));
4018
+ pa_device_port_new_data_done(&port_data);
4031
4019
+ dp->priority = p->priority;
4033
4021
+ pa_hashmap_put(ports, dp->name, dp);
4034
+ dp->profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
4022
+ dp->profiles = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) pa_droid_profile_free);
4036
4024
+ data = PA_DEVICE_PORT_DATA(dp);
4037
4025
+ data->device = p->device;
4039
4027
+ pa_log_debug(" Port %s from cache", p->name);
4041
+ dp->is_output = p->mapping->direction == PA_DIRECTION_OUTPUT;
4042
+ dp->is_input = p->mapping->direction == PA_DIRECTION_INPUT;
4044
4029
+ /* If port/jack detection is available, start as not available by default */
4045
4030
+ dp->available = check_port_availability(p->name) ? PA_AVAILABLE_NO : PA_AVAILABLE_UNKNOWN;
4256
4241
+ pa_mutex_unlock(hw->hw_mutex);
4258
diff --git a/src/modules/droid/droid-util.h b/src/modules/droid/droid-util.h
4259
new file mode 100644
4260
index 0000000..fc0ca70
4243
Index: pulseaudio-5.0/src/modules/droid/droid-util.h
4244
===================================================================
4262
+++ b/src/modules/droid/droid-util.h
4246
+++ pulseaudio-5.0/src/modules/droid/droid-util.h
4263
4247
@@ -0,0 +1,253 @@
4264
4248
+#ifndef foodroidutilfoo
4265
4249
+#define foodroidutilfoo
4514
4498
+bool pa_droid_input_port_name(audio_devices_t value, const char **to_str);
4517
diff --git a/src/modules/droid/module-droid-card.c b/src/modules/droid/module-droid-card.c
4518
new file mode 100644
4519
index 0000000..82a04ce
4501
Index: pulseaudio-5.0/src/modules/droid/module-droid-card.c
4502
===================================================================
4521
+++ b/src/modules/droid/module-droid-card.c
4504
+++ pulseaudio-5.0/src/modules/droid/module-droid-card.c
4522
4505
@@ -0,0 +1,632 @@
4524
4507
+ * Copyright (C) 2013 Jolla Ltd.
5155
diff --git a/src/modules/droid/module-droid-sink.c b/src/modules/droid/module-droid-sink.c
5156
new file mode 100644
5157
index 0000000..720749c
5138
Index: pulseaudio-5.0/src/modules/droid/module-droid-sink.c
5139
===================================================================
5159
+++ b/src/modules/droid/module-droid-sink.c
5141
+++ pulseaudio-5.0/src/modules/droid/module-droid-sink.c
5160
5142
@@ -0,0 +1,101 @@
5162
5144
+ * Copyright (C) 2013 Jolla Ltd.
5262
diff --git a/src/modules/droid/module-droid-source.c b/src/modules/droid/module-droid-source.c
5263
new file mode 100644
5264
index 0000000..161d774
5244
Index: pulseaudio-5.0/src/modules/droid/module-droid-source.c
5245
===================================================================
5266
+++ b/src/modules/droid/module-droid-source.c
5247
+++ pulseaudio-5.0/src/modules/droid/module-droid-source.c
5267
5248
@@ -0,0 +1,95 @@
5269
5250
+ * Copyright (C) 2013 Jolla Ltd.