meta-speech-framework: aac-module-gstreamer: Add PipeWire support patch 96/22496/2
authorScott Murray <scott.murray@konsulko.com>
Sat, 21 Sep 2019 17:33:45 +0000 (13:33 -0400)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Wed, 25 Sep 2019 12:09:01 +0000 (12:09 +0000)
Add a version of George's PipeWire support patch updated for the new
gstreamer module in Alexa Auto SDK 2.0 to the aac-module-gstreamer
bbappend.

Bug-AGL: SPEC-2761

Change-Id: I4787d365664089848a9ffa3be1ee646766f6c931
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
(cherry picked from commit 15196563cf2d6cfc9b095319913d4bf448819559)

meta-speech-framework/meta-aac/recipes-modules/aac-module-gstreamer/aac-module-gstreamer.bbappend
meta-speech-framework/meta-aac/recipes-modules/aac-module-gstreamer/aac-module-gstreamer/0001-gstreamer-implement-pipewire-integration.patch [new file with mode: 0644]

index 78107c8..1b2618e 100644 (file)
@@ -1,5 +1,9 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
+
 # Needed for the required gstreamer-app-1.0 pkgconfig bits
 DEPENDS += "gstreamer1.0-plugins-base"
 
+AAC_PATCHES += "file://0001-gstreamer-implement-pipewire-integration.patch"
+
 # Pull static library into appropriate package to avoid a QA error
 FILES_${PN}-staticdev += "${AAC_PREFIX}/lib/libaal.a"
diff --git a/meta-speech-framework/meta-aac/recipes-modules/aac-module-gstreamer/aac-module-gstreamer/0001-gstreamer-implement-pipewire-integration.patch b/meta-speech-framework/meta-aac/recipes-modules/aac-module-gstreamer/aac-module-gstreamer/0001-gstreamer-implement-pipewire-integration.patch
new file mode 100644 (file)
index 0000000..b0a5c10
--- /dev/null
@@ -0,0 +1,94 @@
+gstreamer: implement pipewire integration using pwaudiosrc/pwaudiosink
+
+The code path is wrapped in #ifdef USE_PIPEWIRE so that it can be toggled
+easily at compile time.
+
+The device string is abused to hold the role name, just like it was
+with 4A. In the future this may need to be reconsidered. In theory,
+we could detect the backend or make it configurable from the upper layer
+if we knew exactly what kind of data is in that device string
+(is it an ALSA device name? a pipewire role? a pipewire node id?
+a pulseaudio device name? ...)
+
+Upstream-Status: Pending
+
+Signed-off-by: George Kiagiadakis <george.kiagiadakis@collabora.com>
+[reworked for SDK 2.0]
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+
+diff --git a/lib/aal/CMakeLists.txt b/lib/aal/CMakeLists.txt
+index a892465..c92b2cf 100644
+--- a/lib/aal/CMakeLists.txt
++++ b/lib/aal/CMakeLists.txt
+@@ -7,6 +7,7 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+ add_definitions(-DUSE_GLOOP)
+ add_definitions(-DUSE_FAKEMUTE)
++add_definitions(-DUSE_PIPEWIRE)
+ # GStreamer
+ find_package(PkgConfig)
+diff --git a/lib/aal/src/player.c b/lib/aal/src/player.c
+index 02a2881..8747854 100644
+--- a/lib/aal/src/player.c
++++ b/lib/aal/src/player.c
+@@ -120,6 +120,19 @@ aal_handle_t aal_player_create(const aal_attributes_t *attr)
+       g_object_get(volume, "volume", &ctx->saved_volume, NULL);
+ #endif
++#ifdef USE_PIPEWIRE
++      sink = create_and_add_element(bin, "pwaudiosink", "sink");
++      if (sink && attr->device && !IS_EMPTY_STRING(attr->device)) {
++              g_info("Using role: %s\n", attr->device);
++              GstStructure *s = gst_structure_new("properties",
++                                                  "media.role",
++                                                  G_TYPE_STRING,
++                                                  attr->device,
++                                                  NULL);
++              g_object_set(G_OBJECT(sink), "stream-properties", s, NULL);
++              gst_structure_free(s);
++      }
++#else
+       if (!attr->device || IS_EMPTY_STRING(attr->device)) {
+               sink = create_and_add_element(bin, "autoaudiosink", "sink");
+       } else {
+@@ -128,6 +141,7 @@ aal_handle_t aal_player_create(const aal_attributes_t *attr)
+               if (sink)
+                       g_object_set(G_OBJECT(sink), "device", attr->device, NULL);
+       }
++#endif
+       if (!sink)
+               goto exit;
+diff --git a/lib/aal/src/recorder.c b/lib/aal/src/recorder.c
+index 96c9b2a..66b36e1 100644
+--- a/lib/aal/src/recorder.c
++++ b/lib/aal/src/recorder.c
+@@ -86,6 +86,19 @@ aal_handle_t aal_recorder_create(const aal_attributes_t *attr)
+       if (!ctx)
+               goto exit;
++#ifdef USE_PIPEWIRE
++      source = create_and_add_element(ctx->pipeline, "pwaudiosrc", "source");
++      if (source && attr->device && !IS_EMPTY_STRING(attr->device)) {
++              g_info("Using role: %s\n", attr->device);
++              GstStructure *s = gst_structure_new("properties",
++                                                  "media.role",
++                                                  G_TYPE_STRING,
++                                                  attr->device,
++                                                  NULL);
++              g_object_set(G_OBJECT(source), "stream-properties", s, NULL);
++              gst_structure_free(s);
++      }
++#else
+       if (!attr->device || IS_EMPTY_STRING(attr->device)) {
+               source = create_and_add_element(ctx->pipeline, "autoaudiosrc", "source");
+       } else {
+@@ -94,6 +107,7 @@ aal_handle_t aal_recorder_create(const aal_attributes_t *attr)
+               if (source)
+                       g_object_set(G_OBJECT(source), "device", attr->device, NULL);
+       }
++#endif
+       if (!source)
+               goto exit;