[pulseaudio/f21] Revert "20141103 snapshot"
Rex Dieter
rdieter at fedoraproject.org
Fri Nov 14 15:37:49 UTC 2014
commit d916474fd97f2f47f1b222d966b2c9b84e33803d
Author: Rex Dieter <rdieter at math.unl.edu>
Date: Fri Nov 14 08:41:36 2014 -0600
Revert "20141103 snapshot"
This reverts commit 195da1d2e45ea28f90ea0e33d4ad5b6561219b43.
0001-bluez5-device-use-get_profile_direction.patch | 74 +++
0002-bluez5-util-add-dispose-function.patch | 48 ++
...d-native-add-a-new-native-headset-backend.patch | 490 ++++++++++++++++++++
pulseaudio.spec | 20 +-
sources | 2 +-
5 files changed, 624 insertions(+), 10 deletions(-)
---
diff --git a/0001-bluez5-device-use-get_profile_direction.patch b/0001-bluez5-device-use-get_profile_direction.patch
new file mode 100644
index 0000000..d447c31
--- /dev/null
+++ b/0001-bluez5-device-use-get_profile_direction.patch
@@ -0,0 +1,74 @@
+From def5cd8f4a7e29dd52c93308bfcaf9d0a33b5232 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans at redhat.com>
+Date: Mon, 1 Sep 2014 10:43:46 +0200
+Subject: [PATCH 1/3] bluez5-device: use get_profile_direction
+
+Use the get_profile_direction() helper function to decide when to add a
+source and a sink instead of enumerating profiles.
+---
+ src/modules/bluetooth/module-bluez5-device.c | 32 +++++++++++++---------------
+ 1 file changed, 15 insertions(+), 17 deletions(-)
+
+diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c
+index 48e498b..15731d1 100644
+--- a/src/modules/bluetooth/module-bluez5-device.c
++++ b/src/modules/bluetooth/module-bluez5-device.c
+@@ -1210,6 +1210,19 @@ static int setup_transport(struct userdata *u) {
+ }
+
+ /* Run from main thread */
++static pa_direction_t get_profile_direction(pa_bluetooth_profile_t p) {
++ static const pa_direction_t profile_direction[] = {
++ [PA_BLUETOOTH_PROFILE_A2DP_SINK] = PA_DIRECTION_OUTPUT,
++ [PA_BLUETOOTH_PROFILE_A2DP_SOURCE] = PA_DIRECTION_INPUT,
++ [PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
++ [PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
++ [PA_BLUETOOTH_PROFILE_OFF] = 0
++ };
++
++ return profile_direction[p];
++}
++
++/* Run from main thread */
+ static int init_profile(struct userdata *u) {
+ int r = 0;
+ pa_assert(u);
+@@ -1220,13 +1233,11 @@ static int init_profile(struct userdata *u) {
+
+ pa_assert(u->transport);
+
+- if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT ||
+- u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY)
++ if (get_profile_direction (u->profile) & PA_DIRECTION_OUTPUT)
+ if (add_sink(u) < 0)
+ r = -1;
+
+- if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT ||
+- u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY)
++ if (get_profile_direction (u->profile) & PA_DIRECTION_INPUT)
+ if (add_source(u) < 0)
+ r = -1;
+
+@@ -1546,19 +1557,6 @@ static char *cleanup_name(const char *name) {
+ }
+
+ /* Run from main thread */
+-static pa_direction_t get_profile_direction(pa_bluetooth_profile_t p) {
+- static const pa_direction_t profile_direction[] = {
+- [PA_BLUETOOTH_PROFILE_A2DP_SINK] = PA_DIRECTION_OUTPUT,
+- [PA_BLUETOOTH_PROFILE_A2DP_SOURCE] = PA_DIRECTION_INPUT,
+- [PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
+- [PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
+- [PA_BLUETOOTH_PROFILE_OFF] = 0
+- };
+-
+- return profile_direction[p];
+-}
+-
+-/* Run from main thread */
+ static pa_available_t get_port_availability(struct userdata *u, pa_direction_t direction) {
+ pa_available_t result = PA_AVAILABLE_NO;
+ unsigned i;
+--
+2.1.0
+
diff --git a/0002-bluez5-util-add-dispose-function.patch b/0002-bluez5-util-add-dispose-function.patch
new file mode 100644
index 0000000..70b4941
--- /dev/null
+++ b/0002-bluez5-util-add-dispose-function.patch
@@ -0,0 +1,48 @@
+From 91164da48032b078783defaa3cf1f1e173525af0 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans at redhat.com>
+Date: Mon, 1 Sep 2014 13:12:27 +0200
+Subject: [PATCH 2/3] bluez5-util: add dispose function
+
+Add a dispose function to the transport that is called before freeing
+the transport. Useful for cleaning up extra userdata.
+---
+ src/modules/bluetooth/bluez5-util.c | 2 ++
+ src/modules/bluetooth/bluez5-util.h | 2 ++
+ 2 files changed, 4 insertions(+)
+
+diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c
+index 1ee2f33..50f977e 100644
+--- a/src/modules/bluetooth/bluez5-util.c
++++ b/src/modules/bluetooth/bluez5-util.c
+@@ -205,6 +205,8 @@ void pa_bluetooth_transport_unlink(pa_bluetooth_transport *t) {
+ void pa_bluetooth_transport_free(pa_bluetooth_transport *t) {
+ pa_assert(t);
+
++ if (t->dispose)
++ t->dispose (t);
+ pa_bluetooth_transport_unlink(t);
+
+ pa_xfree(t->owner);
+diff --git a/src/modules/bluetooth/bluez5-util.h b/src/modules/bluetooth/bluez5-util.h
+index 8db4a17..fde2e78 100644
+--- a/src/modules/bluetooth/bluez5-util.h
++++ b/src/modules/bluetooth/bluez5-util.h
+@@ -60,6 +60,7 @@ typedef enum pa_bluetooth_transport_state {
+
+ typedef int (*pa_bluetooth_transport_acquire_cb)(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu);
+ typedef void (*pa_bluetooth_transport_release_cb)(pa_bluetooth_transport *t);
++typedef void (*pa_bluetooth_transport_dispose_cb)(pa_bluetooth_transport *t);
+
+ struct pa_bluetooth_transport {
+ pa_bluetooth_device *device;
+@@ -76,6 +77,7 @@ struct pa_bluetooth_transport {
+
+ pa_bluetooth_transport_acquire_cb acquire;
+ pa_bluetooth_transport_release_cb release;
++ pa_bluetooth_transport_dispose_cb dispose;
+ void *userdata;
+ };
+
+--
+2.1.0
+
diff --git a/0003-backend-native-add-a-new-native-headset-backend.patch b/0003-backend-native-add-a-new-native-headset-backend.patch
new file mode 100644
index 0000000..407d1c6
--- /dev/null
+++ b/0003-backend-native-add-a-new-native-headset-backend.patch
@@ -0,0 +1,490 @@
+From 682329bb2fc4dc337bf980aae86aa9fa1b6608ab Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans at redhat.com>
+Date: Mon, 1 Sep 2014 15:18:22 +0200
+Subject: [PATCH 3/3] backend-native: add a new native headset backend
+
+Add a simple native headset backend that implements support for the
+blutooth HSP profile.
+This allows pulseaudio to output audio to a Headset using the HSP profile.
+
+Make the native backend the default.
+---
+ configure.ac | 6 +-
+ src/modules/bluetooth/backend-native.c | 443 +++++++++++++++++++++++++++++++++
+ 2 files changed, 446 insertions(+), 3 deletions(-)
+ create mode 100644 src/modules/bluetooth/backend-native.c
+
+diff --git a/configure.ac b/configure.ac
+index 74bea71..9a595cb 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1032,14 +1032,14 @@ AM_CONDITIONAL([HAVE_BLUEZ], [test "x$HAVE_BLUEZ" = x1])
+ ## Bluetooth Headset profiles backend ##
+
+ AC_ARG_WITH(bluetooth_headset_backend,
+- AS_HELP_STRING([--with-bluetooth-headset-backend=<ofono|null>],[Backend for Bluetooth headset profiles (ofono)]))
++ AS_HELP_STRING([--with-bluetooth-headset-backend=<ofono|native|null>],[Backend for Bluetooth headset profiles (native)]))
+ if test -z "$with_bluetooth_headset_backend" ; then
+- BLUETOOTH_HEADSET_BACKEND=ofono
++ BLUETOOTH_HEADSET_BACKEND=native
+ else
+ BLUETOOTH_HEADSET_BACKEND=$with_bluetooth_headset_backend
+ fi
+
+-AS_IF([test "x$BLUETOOTH_HEADSET_BACKEND" != "xofono" && test "x$BLUETOOTH_HEADSET_BACKEND" != "xnull"],
++AS_IF([test "x$BLUETOOTH_HEADSET_BACKEND" != "xofono" && test "x$BLUETOOTH_HEADSET_BACKEND" != "xnull" && test "x$BLUETOOTH_HEADSET_BACKEND" != "xnative"],
+ [AC_MSG_ERROR([*** Invalid Bluetooth Headset backend])])
+
+ AC_SUBST(BLUETOOTH_HEADSET_BACKEND)
+diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c
+new file mode 100644
+index 0000000..b3c4220
+--- /dev/null
++++ b/src/modules/bluetooth/backend-native.c
+@@ -0,0 +1,443 @@
++/***
++ This file is part of PulseAudio.
++
++ Copyright 2014 Wim Taymans <wim.taymans at gmail.com>
++
++ PulseAudio is 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; either version 2.1 of the
++ License, or (at your option) any later version.
++
++ PulseAudio 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
++ General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with PulseAudio; if not, write to the Free Software
++ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ USA.
++***/
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#include <pulsecore/shared.h>
++#include <pulsecore/core-error.h>
++#include <pulsecore/core-util.h>
++#include <pulsecore/dbus-shared.h>
++#include <pulsecore/log.h>
++
++#include <errno.h>
++#include <sys/types.h>
++#include <sys/socket.h>
++
++#include <bluetooth/bluetooth.h>
++#include <bluetooth/sco.h>
++
++#include "bluez5-util.h"
++
++struct pa_bluetooth_backend {
++ pa_core *core;
++ pa_dbus_connection *connection;
++ pa_bluetooth_discovery *discovery;
++
++ PA_LLIST_HEAD(pa_dbus_pending, pending);
++};
++
++struct transport_rfcomm {
++ int rfcomm_fd;
++ pa_io_event *rfcomm_io;
++ pa_mainloop_api *mainloop;
++};
++
++#define BLUEZ_SERVICE "org.bluez"
++#define BLUEZ_MEDIA_TRANSPORT_INTERFACE BLUEZ_SERVICE ".MediaTransport1"
++
++#define BLUEZ_ERROR_NOT_SUPPORTED "org.bluez.Error.NotSupported"
++
++#define BLUEZ_PROFILE_MANAGER_INTERFACE BLUEZ_SERVICE ".ProfileManager1"
++#define BLUEZ_PROFILE_INTERFACE BLUEZ_SERVICE ".Profile1"
++
++#define HSP_AG_PROFILE "/Profile/HSPAGProfile"
++
++#define PROFILE_INTROSPECT_XML \
++ DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \
++ "<node>" \
++ " <interface name=\"" BLUEZ_PROFILE_INTERFACE "\">" \
++ " <method name=\"Release\">" \
++ " </method>" \
++ " <method name=\"RequestDisconnection\">" \
++ " <arg name=\"device\" direction=\"in\" type=\"o\"/>" \
++ " </method>" \
++ " <method name=\"NewConnection\">" \
++ " <arg name=\"device\" direction=\"in\" type=\"o\"/>" \
++ " <arg name=\"fd\" direction=\"in\" type=\"h\"/>" \
++ " <arg name=\"opts\" direction=\"in\" type=\"a{sv}\"/>" \
++ " </method>" \
++ " </interface>" \
++ " <interface name=\"org.freedesktop.DBus.Introspectable\">" \
++ " <method name=\"Introspect\">" \
++ " <arg name=\"data\" type=\"s\" direction=\"out\"/>" \
++ " </method>" \
++ " </interface>" \
++ "</node>"
++
++static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_backend *backend, DBusMessage *m,
++ DBusPendingCallNotifyFunction func, void *call_data) {
++ pa_dbus_pending *p;
++ DBusPendingCall *call;
++
++ pa_assert(backend);
++ pa_assert(m);
++
++ pa_assert_se(dbus_connection_send_with_reply(pa_dbus_connection_get(backend->connection), m, &call, -1));
++
++ p = pa_dbus_pending_new(pa_dbus_connection_get(backend->connection), m, call, backend, call_data);
++ PA_LLIST_PREPEND(pa_dbus_pending, backend->pending, p);
++ dbus_pending_call_set_notify(call, func, p, NULL);
++
++ return p;
++}
++
++static int bluez5_sco_acquire_cb(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu) {
++ pa_bluetooth_device *d = t->device;
++ struct sockaddr_sco addr;
++ int err, i;
++ int sock;
++ bdaddr_t src;
++ bdaddr_t dst;
++ const char *src_addr, *dst_addr;
++
++ src_addr = d->adapter->address;
++ dst_addr = d->address;
++
++ for (i = 5; i >= 0; i--, src_addr += 3)
++ src.b[i] = strtol(src_addr, NULL, 16);
++ for (i = 5; i >= 0; i--, dst_addr += 3)
++ dst.b[i] = strtol(dst_addr, NULL, 16);
++
++ sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
++ if (sock < 0) {
++ pa_log_error("socket(SEQPACKET, SCO) %s", pa_cstrerror(errno));
++ return -1;
++ }
++
++ memset(&addr, 0, sizeof(addr));
++ addr.sco_family = AF_BLUETOOTH;
++ bacpy(&addr.sco_bdaddr, &src);
++
++ if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
++ pa_log_error("bind(): %s", pa_cstrerror(errno));
++ goto fail_close;
++ }
++
++ memset(&addr, 0, sizeof(addr));
++ addr.sco_family = AF_BLUETOOTH;
++ bacpy(&addr.sco_bdaddr, &dst);
++
++ pa_log_info ("doing connect\n");
++ err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
++ if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS)) {
++ pa_log_error("connect(): %s", pa_cstrerror(errno));
++ goto fail_close;
++ }
++
++ if (imtu)
++ *imtu = 48;
++
++ if (omtu)
++ *omtu = 48;
++
++ return sock;
++
++fail_close:
++ close(sock);
++ return -1;
++}
++
++static void bluez5_sco_release_cb(pa_bluetooth_transport *t) {
++ pa_log_info("Transport %s released", t->path);
++ /* device will close the SCO socket for us */
++}
++
++static void register_profile_reply(DBusPendingCall *pending, void *userdata) {
++ DBusMessage *r;
++ pa_dbus_pending *p;
++ pa_bluetooth_backend *b;
++ char *profile;
++
++ pa_assert(pending);
++ pa_assert_se(p = userdata);
++ pa_assert_se(b = p->context_data);
++ pa_assert_se(profile = p->call_data);
++ pa_assert_se(r = dbus_pending_call_steal_reply(pending));
++
++ if (dbus_message_is_error(r, BLUEZ_ERROR_NOT_SUPPORTED)) {
++ pa_log_info("Couldn't register profile %s because it is disabled in BlueZ", profile);
++ goto finish;
++ }
++
++ if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) {
++ pa_log_error(BLUEZ_PROFILE_MANAGER_INTERFACE ".RegisterProfile() failed: %s: %s", dbus_message_get_error_name(r),
++ pa_dbus_get_error_message(r));
++ goto finish;
++ }
++
++finish:
++ dbus_message_unref(r);
++
++ PA_LLIST_REMOVE(pa_dbus_pending, b->pending, p);
++ pa_dbus_pending_free(p);
++
++ pa_xfree(profile);
++}
++
++static void register_profile(pa_bluetooth_backend *b, const char *profile, const char *uuid) {
++ DBusMessage *m;
++ DBusMessageIter i, d;
++
++ pa_log_debug("Registering Profile %s", profile);
++
++ pa_assert_se(m = dbus_message_new_method_call(BLUEZ_SERVICE, "/org/bluez", BLUEZ_PROFILE_MANAGER_INTERFACE, "RegisterProfile"));
++
++ dbus_message_iter_init_append(m, &i);
++ dbus_message_iter_append_basic(&i, DBUS_TYPE_OBJECT_PATH, &profile);
++ dbus_message_iter_append_basic(&i, DBUS_TYPE_STRING, &uuid);
++ dbus_message_iter_open_container(&i, DBUS_TYPE_ARRAY, DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING
++ DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &d);
++ dbus_message_iter_close_container(&i, &d);
++
++ send_and_add_to_pending(b, m, register_profile_reply, pa_xstrdup(profile));
++}
++
++static void rfcomm_io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void*userdata) {
++ pa_bluetooth_transport *t = userdata;
++
++ pa_assert(io);
++ pa_assert(t);
++
++ if (events & (PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR)) {
++ pa_log("Lost RFCOMM connection.");
++ goto fail;
++ }
++
++ if (events & PA_IO_EVENT_INPUT) {
++ char buf[512];
++ ssize_t len;
++
++ len = read (fd, buf, 511);
++ buf[len] = 0;
++ pa_log("RFCOMM << %s", buf);
++
++ pa_log("RFCOMM >> OK");
++ len = write (fd, "\r\nOK\r\n", 5);
++ /* we ignore any errors, it's not critical and real errors should
++ * be caught with the HANGUP and ERROR events handled above */
++ if (len < 0)
++ pa_log_error("RFCOMM write error: %s", pa_cstrerror(errno));
++ }
++ return;
++
++fail:
++ pa_bluetooth_transport_unlink(t);
++ pa_bluetooth_transport_free(t);
++ return;
++}
++
++static void transport_dispose(pa_bluetooth_transport *t) {
++ struct transport_rfcomm *trfc = t->userdata;
++
++ trfc->mainloop->io_free(trfc->rfcomm_io);
++ shutdown (trfc->rfcomm_fd, SHUT_RDWR);
++ close (trfc->rfcomm_fd);
++
++ pa_xfree(trfc);
++}
++
++
++static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m, void *userdata) {
++ pa_bluetooth_backend *b = userdata;
++ pa_bluetooth_device *d;
++ pa_bluetooth_transport *t;
++ pa_bluetooth_profile_t p;
++ DBusMessage *r;
++ int fd;
++ const char *sender, *path, *handler;
++ DBusMessageIter arg_i;
++ char *pathfd;
++ struct transport_rfcomm *trfc;
++
++ if (!dbus_message_iter_init(m, &arg_i) || !pa_streq(dbus_message_get_signature(m), "oha{sv}")) {
++ pa_log_error("Invalid signature found in NewConnection");
++ goto fail;
++ }
++
++ handler = dbus_message_get_path(m);
++ pa_assert (pa_streq(handler, HSP_AG_PROFILE));
++
++ pa_assert(dbus_message_iter_get_arg_type(&arg_i) == DBUS_TYPE_OBJECT_PATH);
++ dbus_message_iter_get_basic(&arg_i, &path);
++
++ d = pa_bluetooth_discovery_get_device_by_path(b->discovery, path);
++ if (d == NULL) {
++ pa_log_error("Device doesnt exist for %s", path);
++ goto fail;
++ }
++
++ pa_assert_se(dbus_message_iter_next(&arg_i));
++
++ pa_assert(dbus_message_iter_get_arg_type(&arg_i) == DBUS_TYPE_UNIX_FD);
++ dbus_message_iter_get_basic(&arg_i, &fd);
++
++ pa_log_debug("dbus: NewConnection path=%s, fd=%d", path, fd);
++
++ sender = dbus_message_get_sender(m);
++
++ p = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT;
++ pathfd = pa_sprintf_malloc ("%s/fd%d", path, fd);
++ d->transports[p] = t = pa_bluetooth_transport_new(d, sender, pathfd, p, NULL, 0);
++ pa_xfree(pathfd);
++
++ t->acquire = bluez5_sco_acquire_cb;
++ t->release = bluez5_sco_release_cb;
++ t->dispose = transport_dispose;
++
++ trfc = pa_xnew0(struct transport_rfcomm, 1);
++ trfc->rfcomm_fd = fd;
++ trfc->mainloop = b->core->mainloop;
++ trfc->rfcomm_io = trfc->mainloop->io_new(b->core->mainloop, fd, PA_IO_EVENT_INPUT|PA_IO_EVENT_HANGUP,
++ rfcomm_io_callback, t);
++ t->userdata = trfc;
++
++ pa_bluetooth_transport_put(t);
++
++ pa_log_debug("Transport %s available for profile %s", t->path, pa_bluetooth_profile_to_string(t->profile));
++
++ pa_assert_se(r = dbus_message_new_method_return(m));
++
++ return r;
++
++fail:
++ pa_assert_se(r = dbus_message_new_error(m, "org.bluez.Error.InvalidArguments", "Unable to handle new connection"));
++ return r;
++}
++
++static DBusMessage *profile_request_disconnection(DBusConnection *conn, DBusMessage *m, void *userdata) {
++ DBusMessage *r;
++
++ pa_assert_se(r = dbus_message_new_method_return(m));
++
++ return r;
++}
++
++static DBusHandlerResult profile_handler(DBusConnection *c, DBusMessage *m, void *userdata) {
++ pa_bluetooth_backend *b = userdata;
++ DBusMessage *r = NULL;
++ const char *path, *interface, *member;
++
++ pa_assert(b);
++
++ path = dbus_message_get_path(m);
++ interface = dbus_message_get_interface(m);
++ member = dbus_message_get_member(m);
++
++ pa_log_debug("dbus: path=%s, interface=%s, member=%s", path, interface, member);
++
++ if (!pa_streq(path, HSP_AG_PROFILE))
++ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
++
++ if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) {
++ const char *xml = PROFILE_INTROSPECT_XML;
++
++ pa_assert_se(r = dbus_message_new_method_return(m));
++ pa_assert_se(dbus_message_append_args(r, DBUS_TYPE_STRING, &xml, DBUS_TYPE_INVALID));
++
++ } else if (dbus_message_is_method_call(m, BLUEZ_PROFILE_INTERFACE, "Release")) {
++ } else if (dbus_message_is_method_call(m, BLUEZ_PROFILE_INTERFACE, "RequestDisconnection")) {
++ r = profile_request_disconnection(c, m, userdata);
++ } else if (dbus_message_is_method_call(m, BLUEZ_PROFILE_INTERFACE, "NewConnection"))
++ r = profile_new_connection(c, m, userdata);
++ else
++ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
++
++ if (r) {
++ pa_assert_se(dbus_connection_send(pa_dbus_connection_get(b->connection), r, NULL));
++ dbus_message_unref(r);
++ }
++
++ return DBUS_HANDLER_RESULT_HANDLED;
++}
++
++static void profile_init(pa_bluetooth_backend *b, pa_bluetooth_profile_t profile) {
++ static const DBusObjectPathVTable vtable_profile = {
++ .message_function = profile_handler,
++ };
++ const char *object_name;
++ const char *uuid;
++
++ pa_assert(b);
++
++ switch(profile) {
++ case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT:
++ object_name = HSP_AG_PROFILE;
++ uuid = PA_BLUETOOTH_UUID_HSP_AG;
++ break;
++ default:
++ pa_assert_not_reached();
++ break;
++ }
++ pa_assert_se(dbus_connection_register_object_path(pa_dbus_connection_get(b->connection),
++ object_name, &vtable_profile, b));
++ register_profile (b, object_name, uuid);
++}
++
++static void profile_done(pa_bluetooth_backend *b, pa_bluetooth_profile_t profile) {
++ pa_assert(b);
++
++ switch(profile) {
++ case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT:
++ dbus_connection_unregister_object_path(pa_dbus_connection_get(b->connection), HSP_AG_PROFILE);
++ break;
++ default:
++ pa_assert_not_reached();
++ break;
++ }
++}
++
++pa_bluetooth_backend *pa_bluetooth_backend_new(pa_core *c, pa_bluetooth_discovery *y) {
++ pa_bluetooth_backend *backend;
++ DBusError err;
++
++ pa_log_debug("Bluetooth Headset Backend API support using the NULL backend");
++
++ backend = pa_xnew0(pa_bluetooth_backend, 1);
++ backend->core = c;
++
++ dbus_error_init(&err);
++ if (!(backend->connection = pa_dbus_bus_get(c, DBUS_BUS_SYSTEM, &err))) {
++ pa_log("Failed to get D-Bus connection: %s", err.message);
++ dbus_error_free(&err);
++ pa_xfree(backend);
++ return NULL;
++ }
++
++ backend->discovery = y;
++
++ profile_init(backend, PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT);
++
++ return backend;
++}
++
++void pa_bluetooth_backend_free(pa_bluetooth_backend *backend) {
++ pa_assert(backend);
++
++ pa_dbus_free_pending_list(&backend->pending);
++
++ profile_done(backend, PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT);
++
++ pa_dbus_connection_unref(backend->connection);
++
++ pa_xfree(backend);
++}
+--
+2.1.0
+
diff --git a/pulseaudio.spec b/pulseaudio.spec
index 13f0963..4087a68 100644
--- a/pulseaudio.spec
+++ b/pulseaudio.spec
@@ -1,13 +1,11 @@
%global pa_major 5.0
#global pa_minor 0
-%global snap 20141103
-%global gitrel 323
-%global gitcommit 6d1fd4d1aab38a18925972f11face92ea602adf0
+%global snap 20141019
+%global gitrel 287
+%global gitcommit 4971dc9ed695256cfb179c5ef4d7bf43d3826ba2
%global shortcommit %(c=%{gitcommit}; echo ${c:0:5})
-#323-g6d1fd
-
%ifarch %{ix86} x86_64 %{arm}
%global with_webrtc 1
%endif
@@ -21,7 +19,7 @@
Name: pulseaudio
Summary: Improved Linux Sound Server
Version: %{pa_major}%{?pa_minor:.%{pa_minor}}
-Release: 23%{?snap:.%{snap}git%{shortcommit}}%{?dist}
+Release: 22%{?snap:.%{snap}git%{shortcommit}}%{?dist}
License: LGPLv2+
URL: http://www.freedesktop.org/wiki/Software/PulseAudio
%if 0%{?gitrel}
@@ -223,6 +221,13 @@ This package contains GDM integration hooks for the PulseAudio sound server.
%prep
%setup -q -T -b0 -n %{name}-%{version}%{?gitrel:-%{gitrel}-g%{shortcommit}}
+%patch1 -p1 -b .0001
+%patch2 -p1 -b .0002
+%patch3 -p1 -b .0003
+
+# needed by patch3
+./bootstrap.sh
+
sed -i.no_consolekit -e \
's/^load-module module-console-kit/#load-module module-console-kit/' \
src/daemon/default.pa.in
@@ -555,9 +560,6 @@ exit 0
%changelog
-* Wed Nov 05 2014 Rex Dieter <rdieter at fedoraproject.org> 5.0-23.20141103git6d1fd
-- 20141103 snapshot
-
* Wed Nov 05 2014 Orion Poplawski <orion at cora.nwra.com> 5.0-22.20141007git4971d
- Really add pulse-rt group when needed (bug #885020)
diff --git a/sources b/sources
index bda7978..f54d595 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-ac426cc16e66e2e159797d5298196c3e pulseaudio-5.0-323-g6d1fd.tar.xz
+8872ddac114237c314887dafb526a928 pulseaudio-5.0-287-g4971d.tar.xz
More information about the scm-commits
mailing list