* Re: [PATCH BlueZ] gdbus: Fix memory leak on properties_set()
From: Johan Hedberg @ 2013-01-06 13:09 UTC (permalink / raw)
To: Anderson Lizardo; +Cc: linux-bluetooth
In-Reply-To: <1357433266-31642-1-git-send-email-anderson.lizardo@openbossa.org>
Hi Lizardo,
On Sat, Jan 05, 2013, Anderson Lizardo wrote:
> The pointer returned by dbus_message_iter_get_signature() must be freed
> with dbus_free().
>
> Fixes this memory leak:
>
> ==1857== 16 bytes in 1 blocks are definitely lost in loss record 104 of
> 251
> ==1857== at 0x402BF52: realloc (in
> /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
> ==1857== by 0x415E286: dbus_realloc (in
> /lib/i386-linux-gnu/libdbus-1.so.3.5.8)
> ==1857== by 0x415E70B: ??? (in
> /lib/i386-linux-gnu/libdbus-1.so.3.5.8)
> ==1857== by 0x415F17B: ??? (in
> /lib/i386-linux-gnu/libdbus-1.so.3.5.8)
> ==1857== by 0x414CB33: dbus_message_iter_get_signature (in
> /lib/i386-linux-gnu/libdbus-1.so.3.5.8)
> ==1857== by 0x8053239: properties_set (object.c:899)
> ==1857== by 0x5FFFFF: ???
> ==1857==
> ---
> gdbus/object.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
Applied. Thanks.
Johan
^ permalink raw reply
* [PATCH BlueZ] gdbus: Fix memory leak on properties_set()
From: Anderson Lizardo @ 2013-01-06 0:47 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Anderson Lizardo
The pointer returned by dbus_message_iter_get_signature() must be freed
with dbus_free().
Fixes this memory leak:
==1857== 16 bytes in 1 blocks are definitely lost in loss record 104 of
251
==1857== at 0x402BF52: realloc (in
/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==1857== by 0x415E286: dbus_realloc (in
/lib/i386-linux-gnu/libdbus-1.so.3.5.8)
==1857== by 0x415E70B: ??? (in
/lib/i386-linux-gnu/libdbus-1.so.3.5.8)
==1857== by 0x415F17B: ??? (in
/lib/i386-linux-gnu/libdbus-1.so.3.5.8)
==1857== by 0x414CB33: dbus_message_iter_get_signature (in
/lib/i386-linux-gnu/libdbus-1.so.3.5.8)
==1857== by 0x8053239: properties_set (object.c:899)
==1857== by 0x5FFFFF: ???
==1857==
---
gdbus/object.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/gdbus/object.c b/gdbus/object.c
index 688cd05..1a54b3f 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -846,6 +846,8 @@ static DBusMessage *properties_set(DBusConnection *connection,
const GDBusPropertyTable *property;
const char *name, *interface;
struct property_data *propdata;
+ gboolean valid_signature;
+ char *signature;
if (!dbus_message_iter_init(message, &iter))
return g_dbus_create_error(message, DBUS_ERROR_INVALID_ARGS,
@@ -896,7 +898,10 @@ static DBusMessage *properties_set(DBusConnection *connection,
DBUS_ERROR_UNKNOWN_PROPERTY,
"No such property '%s'", name);
- if (strcmp(dbus_message_iter_get_signature(&sub), property->type))
+ signature = dbus_message_iter_get_signature(&sub);
+ valid_signature = strcmp(signature, property->type) ? FALSE : TRUE;
+ dbus_free(signature);
+ if (!valid_signature)
return g_dbus_create_error(message,
DBUS_ERROR_INVALID_SIGNATURE,
"Invalid signature for '%s'", name);
--
1.7.9.5
^ permalink raw reply related
* Re: [PATCH BlueZ] core: Remove leftover from pending_uuids removal
From: Johan Hedberg @ 2013-01-05 8:51 UTC (permalink / raw)
To: Anderson Lizardo; +Cc: linux-bluetooth
In-Reply-To: <1357352134-19573-1-git-send-email-anderson.lizardo@openbossa.org>
Hi Lizardo,
On Fri, Jan 04, 2013, Anderson Lizardo wrote:
> The struct controller_info "pending_uuids" field was removed on commit
> 1dd77eda25aae5ed963683dfc125d3ef01187eba.
> ---
> src/mgmt.c | 9 ---------
> 1 file changed, 9 deletions(-)
Applied. Thanks.
Johan
^ permalink raw reply
* [PATCH BlueZ] core: Remove leftover from pending_uuids removal
From: Anderson Lizardo @ 2013-01-05 2:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Anderson Lizardo
The struct controller_info "pending_uuids" field was removed on commit
1dd77eda25aae5ed963683dfc125d3ef01187eba.
---
src/mgmt.c | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/src/mgmt.c b/src/mgmt.c
index c280fe3..b5ce955 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
@@ -1633,15 +1633,6 @@ fail:
void mgmt_cleanup(void)
{
- int index;
-
- for (index = 0; index <= max_index; index++) {
- struct controller_info *info = &controllers[index];
-
- if (!info->valid)
- continue;
- }
-
g_free(controllers);
controllers = NULL;
max_index = -1;
--
1.7.9.5
^ permalink raw reply related
* Re: [PATCH BlueZ] unit: Fix compilation issue with ignored return value
From: Johan Hedberg @ 2013-01-04 14:18 UTC (permalink / raw)
To: Anderson Lizardo; +Cc: linux-bluetooth
In-Reply-To: <1357307222-4563-1-git-send-email-anderson.lizardo@openbossa.org>
Hi Lizardo,
On Fri, Jan 04, 2013, Anderson Lizardo wrote:
> Fix this compilation warning:
>
> unit/test-sdp.c: In function ‘send_pdu’:
> unit/test-sdp.c:600:7: error: ignoring return value of ‘write’, declared
> with attribute warn_unused_result [-Werror=unused-result]
> ---
> unit/test-sdp.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
Applied. Thanks.
Johan
^ permalink raw reply
* Re: [PATCH 1/2] storage: Fix memory leak
From: Johan Hedberg @ 2013-01-04 14:17 UTC (permalink / raw)
To: Jaganath Kanakkassery; +Cc: linux-bluetooth
In-Reply-To: <1357278148-27872-1-git-send-email-jaganath.k@samsung.com>
Hi Jaganath,
On Fri, Jan 04, 2013, Jaganath Kanakkassery wrote:
> If bt_uuid2string() returns NULL then svcclass has to be freed
> ---
> src/storage.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
Both patches have been applied. Thanks.
Johan
^ permalink raw reply
* [PATCH BlueZ] unit: Fix compilation issue with ignored return value
From: Anderson Lizardo @ 2013-01-04 13:47 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Anderson Lizardo
Fix this compilation warning:
unit/test-sdp.c: In function ‘send_pdu’:
unit/test-sdp.c:600:7: error: ignoring return value of ‘write’, declared
with attribute warn_unused_result [-Werror=unused-result]
---
unit/test-sdp.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/unit/test-sdp.c b/unit/test-sdp.c
index baa93d0..1a852de 100644
--- a/unit/test-sdp.c
+++ b/unit/test-sdp.c
@@ -596,8 +596,10 @@ struct test_data {
static gboolean send_pdu(gpointer user_data)
{
struct context *context = user_data;
+ ssize_t len;
- write(context->fd, context->req_data, context->req_size);
+ len = write(context->fd, context->req_data, context->req_size);
+ g_assert(len > 0 && (size_t) len == context->req_size);
return FALSE;
}
--
1.7.9.5
^ permalink raw reply related
* Re: [REVIEW] adapter: Fix storage to be used by BlueZ 4 or 5
From: Frederic Danis @ 2013-01-04 13:25 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1357305174-13313-1-git-send-email-frederic.danis@linux.intel.com>
On 04/01/2013 14:12, Frédéric Danis wrote:
> Conversion should be performed only one time, but using "converted"
> entry in device related files generates a bogus device object with
> dev_CONVERTED path when starting BlueZ 4.
>
> If "settings" file has been created we've done the conversion and
> we can use it to check if conversion has already been done.
>
> Remove "converted" entries in converted files
Sorry, I made a mistake in mail subject, this patch is for integration.
--
Frederic Danis Open Source Technology Center
frederic.danis@intel.com Intel Corporation
^ permalink raw reply
* [REVIEW] adapter: Fix storage to be used by BlueZ 4 or 5
From: Frédéric Danis @ 2013-01-04 13:12 UTC (permalink / raw)
To: linux-bluetooth
Conversion should be performed only one time, but using "converted"
entry in device related files generates a bogus device object with
dev_CONVERTED path when starting BlueZ 4.
If "settings" file has been created we've done the conversion and
we can use it to check if conversion has already been done.
Remove "converted" entries in converted files
---
src/adapter.c | 179 +++++++++++++++++++++++++++++++--------------------------
1 file changed, 96 insertions(+), 83 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index ec2e8bd..ea7b6cf 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2143,23 +2143,15 @@ static void convert_file(char *file, char *address,
{
char filename[PATH_MAX + 1];
struct device_converter converter;
- char *str;
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", address, file);
filename[PATH_MAX] = '\0';
- str = textfile_get(filename, "converted");
- if (str && strcmp(str, "yes") == 0) {
- DBG("Legacy file %s already converted", filename);
- } else {
- converter.address = address;
- converter.cb = cb;
- converter.force = force;
+ converter.address = address;
+ converter.cb = cb;
+ converter.force = force;
- textfile_foreach(filename, convert_entry, &converter);
- textfile_put(filename, "converted", "yes");
- }
- free(str);
+ textfile_foreach(filename, convert_entry, &converter);
}
static gboolean record_has_uuid(const sdp_record_t *rec,
@@ -2556,22 +2548,13 @@ static void convert_device_storage(struct btd_adapter *adapter)
{
char filename[PATH_MAX + 1];
char address[18];
- char *str;
ba2str(&adapter->bdaddr, address);
/* Convert device's name cache */
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
filename[PATH_MAX] = '\0';
-
- str = textfile_get(filename, "converted");
- if (str && strcmp(str, "yes") == 0) {
- DBG("Legacy names file already converted");
- } else {
- textfile_foreach(filename, convert_names_entry, address);
- textfile_put(filename, "converted", "yes");
- }
- free(str);
+ textfile_foreach(filename, convert_names_entry, address);
/* Convert aliases */
convert_file("aliases", address, convert_aliases_entry, TRUE);
@@ -2588,15 +2571,7 @@ static void convert_device_storage(struct btd_adapter *adapter)
/* Convert primaries */
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
filename[PATH_MAX] = '\0';
-
- str = textfile_get(filename, "converted");
- if (str && strcmp(str, "yes") == 0) {
- DBG("Legacy %s file already converted", filename);
- } else {
- textfile_foreach(filename, convert_primaries_entry, address);
- textfile_put(filename, "converted", "yes");
- }
- free(str);
+ textfile_foreach(filename, convert_primaries_entry, address);
/* Convert linkkeys */
convert_file("linkkeys", address, convert_linkkey_entry, TRUE);
@@ -2613,28 +2588,12 @@ static void convert_device_storage(struct btd_adapter *adapter)
/* Convert sdp */
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
filename[PATH_MAX] = '\0';
-
- str = textfile_get(filename, "converted");
- if (str && strcmp(str, "yes") == 0) {
- DBG("Legacy %s file already converted", filename);
- } else {
- textfile_foreach(filename, convert_sdp_entry, address);
- textfile_put(filename, "converted", "yes");
- }
- free(str);
+ textfile_foreach(filename, convert_sdp_entry, address);
/* Convert ccc */
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
filename[PATH_MAX] = '\0';
-
- str = textfile_get(filename, "converted");
- if (str && strcmp(str, "yes") == 0) {
- DBG("Legacy %s file already converted", filename);
- } else {
- textfile_foreach(filename, convert_ccc_entry, address);
- textfile_put(filename, "converted", "yes");
- }
- free(str);
+ textfile_foreach(filename, convert_ccc_entry, address);
/* Convert appearances */
convert_file("appearances", address, convert_appearances_entry, FALSE);
@@ -2642,28 +2601,12 @@ static void convert_device_storage(struct btd_adapter *adapter)
/* Convert gatt */
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
filename[PATH_MAX] = '\0';
-
- str = textfile_get(filename, "converted");
- if (str && strcmp(str, "yes") == 0) {
- DBG("Legacy %s file already converted", filename);
- } else {
- textfile_foreach(filename, convert_gatt_entry, address);
- textfile_put(filename, "converted", "yes");
- }
- free(str);
+ textfile_foreach(filename, convert_gatt_entry, address);
/* Convert proximity */
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
filename[PATH_MAX] = '\0';
-
- str = textfile_get(filename, "converted");
- if (str && strcmp(str, "yes") == 0) {
- DBG("Legacy %s file already converted", filename);
- } else {
- textfile_foreach(filename, convert_proximity_entry, address);
- textfile_put(filename, "converted", "yes");
- }
- free(str);
+ textfile_foreach(filename, convert_proximity_entry, address);
}
static void convert_config(struct btd_adapter *adapter, const char *filename,
@@ -2672,7 +2615,6 @@ static void convert_config(struct btd_adapter *adapter, const char *filename,
char address[18];
char str[MAX_NAME_LENGTH + 1];
char config_path[PATH_MAX + 1];
- char *converted;
gboolean flag;
int timeout;
uint8_t mode;
@@ -2683,17 +2625,6 @@ static void convert_config(struct btd_adapter *adapter, const char *filename,
snprintf(config_path, PATH_MAX, STORAGEDIR "/%s/config", address);
config_path[PATH_MAX] = '\0';
- converted = textfile_get(config_path, "converted");
- if (converted) {
- if (strcmp(converted, "yes") == 0) {
- DBG("Legacy config file already converted");
- free(converted);
- return;
- }
-
- free(converted);
- }
-
if (read_device_pairable(&adapter->bdaddr, &flag) == 0)
g_key_file_set_boolean(key_file, "General", "Pairable", flag);
@@ -2719,8 +2650,6 @@ static void convert_config(struct btd_adapter *adapter, const char *filename,
data = g_key_file_to_data(key_file, &length, NULL);
g_file_set_contents(filename, data, length, NULL);
g_free(data);
-
- textfile_put(config_path, "converted", "yes");
}
static void load_config(struct btd_adapter *adapter)
@@ -2728,6 +2657,7 @@ static void load_config(struct btd_adapter *adapter)
GKeyFile *key_file;
char filename[PATH_MAX + 1];
char address[18];
+ struct stat st;
GError *gerr = NULL;
gboolean stored_discoverable;
@@ -2738,8 +2668,12 @@ static void load_config(struct btd_adapter *adapter)
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings", address);
filename[PATH_MAX] = '\0';
- if (!g_key_file_load_from_file(key_file, filename, 0, NULL))
+ if (stat(filename, &st) < 0) {
convert_config(adapter, filename, key_file);
+ convert_device_storage(adapter);
+ }
+
+ g_key_file_load_from_file(key_file, filename, 0, NULL);
/* Get alias */
adapter->stored_name = g_key_file_get_string(key_file, "General",
@@ -2813,6 +2747,85 @@ static void load_config(struct btd_adapter *adapter)
g_key_file_free(key_file);
}
+static void fix_storage(struct btd_adapter *adapter)
+{
+ char filename[PATH_MAX + 1];
+ char address[18];
+ char *converted;
+
+ ba2str(&adapter->bdaddr, address);
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/config", address);
+ filename[PATH_MAX] = '\0';
+ converted = textfile_get(filename, "converted");
+ if (!converted)
+ return;
+
+ free(converted);
+
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/aliases", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/trusts", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/blocked", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/profiles", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/linkkeys", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/longtermkeys", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/classes", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/did", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/appearances", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
+ filename[PATH_MAX] = '\0';
+ textfile_del(filename, "converted");
+}
+
static gboolean adapter_setup(struct btd_adapter *adapter, uint32_t settings)
{
struct agent *agent;
@@ -2840,7 +2853,7 @@ static gboolean adapter_setup(struct btd_adapter *adapter, uint32_t settings)
btd_adapter_gatt_server_start(adapter);
load_config(adapter);
- convert_device_storage(adapter);
+ fix_storage(adapter);
load_drivers(adapter);
btd_profile_foreach(probe_profile, adapter);
clear_blocked(adapter);
--
1.7.9.5
^ permalink raw reply related
* [PATCH BlueZ 8/8 v2] player: Add Device property
From: Luiz Augusto von Dentz @ 2013-01-04 12:39 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1357303197-19673-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Device property indicates which device object the player belongs to.
---
doc/media-api.txt | 4 ++++
profiles/audio/player.c | 14 ++++++++++++++
2 files changed, 18 insertions(+)
diff --git a/doc/media-api.txt b/doc/media-api.txt
index 12a2d7a..e2cafd1 100644
--- a/doc/media-api.txt
+++ b/doc/media-api.txt
@@ -288,6 +288,10 @@ Properties string Equalizer [readwrite]
Track duration in milliseconds
+ object Device [readonly]
+
+ Device object path.
+
MediaEndpoint1 hierarchy
========================
diff --git a/profiles/audio/player.c b/profiles/audio/player.c
index 81bb7fe..bac5649 100644
--- a/profiles/audio/player.c
+++ b/profiles/audio/player.c
@@ -56,6 +56,7 @@ struct pending_req {
};
struct media_player {
+ char *device; /* Device path */
char *path; /* Player object path */
GHashTable *settings; /* Player settings */
GHashTable *track; /* Player current track */
@@ -239,6 +240,16 @@ static gboolean get_track(const GDBusPropertyTable *property,
return TRUE;
}
+static gboolean get_device(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct media_player *mp = data;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &mp->device);
+
+ return TRUE;
+}
+
static DBusMessage *media_player_play(DBusConnection *conn, DBusMessage *msg,
void *data)
{
@@ -417,6 +428,7 @@ static const GDBusPropertyTable media_player_properties[] = {
{ "Shuffle", "s", get_setting, set_setting, setting_exists },
{ "Scan", "s", get_setting, set_setting, setting_exists },
{ "Track", "a{sv}", get_track, NULL, NULL },
+ { "Device", "s", get_device, NULL, NULL },
{ }
};
@@ -442,6 +454,7 @@ void media_player_destroy(struct media_player *mp)
g_free(mp->cb);
g_free(mp->status);
g_free(mp->path);
+ g_free(mp->device);
g_free(mp);
}
@@ -450,6 +463,7 @@ struct media_player *media_player_controller_create(const char *path)
struct media_player *mp;
mp = g_new0(struct media_player, 1);
+ mp->device = g_strdup(path);
mp->path = g_strdup_printf("%s/player1", path);
mp->settings = g_hash_table_new_full(g_str_hash, g_str_equal,
g_free, g_free);
--
1.8.0.1
^ permalink raw reply related
* [PATCH BlueZ 7/8 v2] player: Remove experimental flag from MediaPlayer1
From: Luiz Augusto von Dentz @ 2013-01-04 12:39 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1357303197-19673-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
doc/media-api.txt | 2 +-
profiles/audio/player.c | 21 +++++++--------------
2 files changed, 8 insertions(+), 15 deletions(-)
diff --git a/doc/media-api.txt b/doc/media-api.txt
index 5a6b68c..12a2d7a 100644
--- a/doc/media-api.txt
+++ b/doc/media-api.txt
@@ -179,7 +179,7 @@ MediaPlayer1 hierarchy
======================
Service org.bluez (Controller role)
-Interface org.bluez.MediaPlayer1 [Experimental]
+Interface org.bluez.MediaPlayer1
Object path [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX
Methods void Play()
diff --git a/profiles/audio/player.c b/profiles/audio/player.c
index 0b69912..81bb7fe 100644
--- a/profiles/audio/player.c
+++ b/profiles/audio/player.c
@@ -410,20 +410,13 @@ static const GDBusSignalTable media_player_signals[] = {
};
static const GDBusPropertyTable media_player_properties[] = {
- { "Position", "u", get_position, NULL, NULL,
- G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
- { "Status", "s", get_status, NULL, status_exists,
- G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
- { "Equalizer", "s", get_setting, set_setting, setting_exists,
- G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
- { "Repeat", "s", get_setting, set_setting, setting_exists,
- G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
- { "Shuffle", "s", get_setting, set_setting, setting_exists,
- G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
- { "Scan", "s", get_setting, set_setting, setting_exists,
- G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
- { "Track", "a{sv}", get_track, NULL, NULL,
- G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
+ { "Position", "u", get_position, NULL, NULL },
+ { "Status", "s", get_status, NULL, status_exists },
+ { "Equalizer", "s", get_setting, set_setting, setting_exists },
+ { "Repeat", "s", get_setting, set_setting, setting_exists },
+ { "Shuffle", "s", get_setting, set_setting, setting_exists },
+ { "Scan", "s", get_setting, set_setting, setting_exists },
+ { "Track", "a{sv}", get_track, NULL, NULL },
{ }
};
--
1.8.0.1
^ permalink raw reply related
* [PATCH BlueZ 6/8 v2] control: Mark all members of MediaControl1 as deprecated
From: Luiz Augusto von Dentz @ 2013-01-04 12:39 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1357303197-19673-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
profiles/audio/control.c | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/profiles/audio/control.c b/profiles/audio/control.c
index 642fdd5..70faab8 100644
--- a/profiles/audio/control.c
+++ b/profiles/audio/control.c
@@ -222,20 +222,23 @@ static gboolean control_property_get_connected(
}
static const GDBusMethodTable control_methods[] = {
- { GDBUS_METHOD("Play", NULL, NULL, control_play) },
- { GDBUS_METHOD("Pause", NULL, NULL, control_pause) },
- { GDBUS_METHOD("Stop", NULL, NULL, control_stop) },
- { GDBUS_METHOD("Next", NULL, NULL, control_next) },
- { GDBUS_METHOD("Previous", NULL, NULL, control_previous) },
- { GDBUS_METHOD("VolumeUp", NULL, NULL, control_volume_up) },
- { GDBUS_METHOD("VolumeDown", NULL, NULL, control_volume_down) },
- { GDBUS_METHOD("FastForward", NULL, NULL, control_fast_forward) },
- { GDBUS_METHOD("Rewind", NULL, NULL, control_rewind) },
+ { GDBUS_DEPRECATED_METHOD("Play", NULL, NULL, control_play) },
+ { GDBUS_DEPRECATED_METHOD("Pause", NULL, NULL, control_pause) },
+ { GDBUS_DEPRECATED_METHOD("Stop", NULL, NULL, control_stop) },
+ { GDBUS_DEPRECATED_METHOD("Next", NULL, NULL, control_next) },
+ { GDBUS_DEPRECATED_METHOD("Previous", NULL, NULL, control_previous) },
+ { GDBUS_DEPRECATED_METHOD("VolumeUp", NULL, NULL, control_volume_up) },
+ { GDBUS_DEPRECATED_METHOD("VolumeDown", NULL, NULL,
+ control_volume_down) },
+ { GDBUS_DEPRECATED_METHOD("FastForward", NULL, NULL,
+ control_fast_forward) },
+ { GDBUS_DEPRECATED_METHOD("Rewind", NULL, NULL, control_rewind) },
{ }
};
static const GDBusPropertyTable control_properties[] = {
- { "Connected", "b", control_property_get_connected },
+ { "Connected", "b", control_property_get_connected, NULL, NULL,
+ G_DBUS_PROPERTY_FLAG_DEPRECATED },
{ }
};
--
1.8.0.1
^ permalink raw reply related
* [PATCH BlueZ 5/8 v2] AVRCP: Always create a controller player even for version 1.0
From: Luiz Augusto von Dentz @ 2013-01-04 12:39 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1357303197-19673-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Since the buttons controls are now part of the MediaPlayer1 it can be used
even with AVRCP version 1.0.
---
profiles/audio/avrcp.c | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index 99741e8..74ef3ea 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -1952,6 +1952,9 @@ static bool ct_set_setting(struct media_player *mp, const char *key,
if (session == NULL)
return false;
+ if (session->version < 0x0103)
+ return false;
+
attr = attr_to_val(key);
if (attr < 0)
return false;
@@ -2063,24 +2066,15 @@ static gboolean avrcp_get_capabilities_resp(struct avctp *conn,
void *user_data)
{
struct avrcp *session = user_data;
- struct avrcp_player *player = session->player;
- struct media_player *mp;
struct avrcp_header *pdu = (void *) operands;
uint16_t events = 0;
uint8_t count;
- const char *path;
if (pdu->params[0] != CAP_EVENTS_SUPPORTED)
return FALSE;
count = pdu->params[1];
- path = device_get_path(session->dev->btd_dev);
-
- mp = media_player_controller_create(path);
- if (mp == NULL)
- return FALSE;
-
for (; count > 0; count--) {
uint8_t event = pdu->params[1 + count];
@@ -2095,10 +2089,6 @@ static gboolean avrcp_get_capabilities_resp(struct avctp *conn,
}
}
- media_player_set_callbacks(mp, &ct_cbs, player);
- player->user_data = mp;
- player->destroy = (GDestroyNotify) media_player_destroy;
-
if (!(events & (1 << AVRCP_EVENT_SETTINGS_CHANGED)))
avrcp_list_player_attributes(session);
@@ -2185,6 +2175,8 @@ static void session_tg_init(struct avrcp *session)
static void session_ct_init(struct avrcp *session)
{
struct avrcp_player *player;
+ struct media_player *mp;
+ const char *path;
session->control_handlers = ct_control_handlers;
@@ -2195,13 +2187,22 @@ static void session_ct_init(struct avrcp *session)
handle_vendordep_pdu,
session);
- if (session->version < 0x0103)
- return;
-
player = g_new0(struct avrcp_player, 1);
player->sessions = g_slist_prepend(player->sessions, session);
session->player = player;
+ path = device_get_path(session->dev->btd_dev);
+
+ mp = media_player_controller_create(path);
+ if (mp != NULL) {
+ media_player_set_callbacks(mp, &ct_cbs, player);
+ player->user_data = mp;
+ player->destroy = (GDestroyNotify) media_player_destroy;
+ }
+
+ if (session->version < 0x0103)
+ return;
+
avrcp_get_capabilities(session);
}
--
1.8.0.1
^ permalink raw reply related
* [PATCH BlueZ 4/8 v2] player: Fix documentation to use TrackNumber in track metadata
From: Luiz Augusto von Dentz @ 2013-01-04 12:39 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1357303197-19673-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Using Track key inside a Track property would be pointless, despite the
documentation and code where also inconsistent.
---
doc/media-api.txt | 2 +-
profiles/audio/avrcp.c | 2 +-
profiles/audio/player.c | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/doc/media-api.txt b/doc/media-api.txt
index eb1f74f..5a6b68c 100644
--- a/doc/media-api.txt
+++ b/doc/media-api.txt
@@ -280,7 +280,7 @@ Properties string Equalizer [readwrite]
Number of tracks in total
- uint32 Number:
+ uint32 TrackNumber:
Track number
diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index 7b7c2ef..99741e8 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -649,7 +649,7 @@ static const char *metadata_to_str(uint32_t id)
case AVRCP_MEDIA_ATTRIBUTE_GENRE:
return "Genre";
case AVRCP_MEDIA_ATTRIBUTE_TRACK:
- return "Track";
+ return "TrackNumber";
case AVRCP_MEDIA_ATTRIBUTE_N_TRACKS:
return "NumberOfTracks";
case AVRCP_MEDIA_ATTRIBUTE_DURATION:
diff --git a/profiles/audio/player.c b/profiles/audio/player.c
index 82c5bfb..0b69912 100644
--- a/profiles/audio/player.c
+++ b/profiles/audio/player.c
@@ -72,7 +72,7 @@ static void append_metadata(void *key, void *value, void *user_data)
DBusMessageIter *dict = user_data;
if (strcasecmp((char *) key, "Duration") == 0 ||
- strcasecmp((char *) key, "Track") == 0 ||
+ strcasecmp((char *) key, "TrackNumber") == 0 ||
strcasecmp((char *) key, "NumberOfTracks") == 0) {
uint32_t num = atoi(value);
dict_append_entry(dict, key, DBUS_TYPE_UINT32, &num);
--
1.8.0.1
^ permalink raw reply related
* [PATCH BlueZ 3/8 v2] player: Add support for button controls
From: Luiz Augusto von Dentz @ 2013-01-04 12:39 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1357303197-19673-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds support for buttons controls in MediaPlayer1
---
profiles/audio/avrcp.c | 91 ++++++++++++++++++++++++++-
profiles/audio/player.c | 162 ++++++++++++++++++++++++++++++++++++++++++++++++
profiles/audio/player.h | 9 +++
3 files changed, 261 insertions(+), 1 deletion(-)
diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index ce070cd..7b7c2ef 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -1965,8 +1965,96 @@ static bool ct_set_setting(struct media_player *mp, const char *key,
return true;
}
+static int ct_press(struct avrcp_player *player, uint8_t op)
+{
+ int err;
+ struct avrcp *session;
+
+ session = player->sessions->data;
+ if (session == NULL)
+ return -ENOTCONN;
+
+ err = avctp_send_passthrough(session->conn, op);
+ if (err < 0)
+ return err;
+
+ return 0;
+}
+
+static int ct_play(struct media_player *mp, void *user_data)
+{
+ struct avrcp_player *player = user_data;
+
+ return ct_press(player, AVC_PLAY);
+}
+
+static int ct_pause(struct media_player *mp, void *user_data)
+{
+ struct avrcp_player *player = user_data;
+
+ return ct_press(player, AVC_PAUSE);
+}
+
+static int ct_stop(struct media_player *mp, void *user_data)
+{
+ struct avrcp_player *player = user_data;
+
+ return ct_press(player, AVC_STOP);
+}
+
+static int ct_next(struct media_player *mp, void *user_data)
+{
+ struct avrcp_player *player = user_data;
+
+ return ct_press(player, AVC_FORWARD);
+}
+
+static int ct_previous(struct media_player *mp, void *user_data)
+{
+ struct avrcp_player *player = user_data;
+
+ return ct_press(player, AVC_BACKWARD);
+}
+
+static int ct_fast_forward(struct media_player *mp, void *user_data)
+{
+ struct avrcp_player *player = user_data;
+
+ return ct_press(player, AVC_FAST_FORWARD);
+}
+
+static int ct_rewind(struct media_player *mp, void *user_data)
+{
+ struct avrcp_player *player = user_data;
+
+ return ct_press(player, AVC_REWIND);
+}
+
+static int ct_volume_up(struct media_player *mp, void *user_data)
+{
+ struct avrcp_player *player = user_data;
+
+ return ct_press(player, AVC_VOLUME_UP);
+}
+
+static int ct_volume_down(struct media_player *mp, void *user_data)
+{
+ struct avrcp_player *player = user_data;
+
+ return ct_press(player, AVC_VOLUME_DOWN);
+}
+
static const struct media_player_callback ct_cbs = {
- .set_setting = ct_set_setting,
+ .set_setting = ct_set_setting,
+ .play = ct_play,
+ .pause = ct_pause,
+ .stop = ct_stop,
+ .next = ct_next,
+ .previous = ct_previous,
+ .fast_forward = ct_fast_forward,
+ .rewind = ct_rewind,
+ .volume_up = ct_volume_up,
+ .volume_down = ct_volume_down,
};
static gboolean avrcp_get_capabilities_resp(struct avctp *conn,
@@ -1988,6 +2076,7 @@ static gboolean avrcp_get_capabilities_resp(struct avctp *conn,
count = pdu->params[1];
path = device_get_path(session->dev->btd_dev);
+
mp = media_player_controller_create(path);
if (mp == NULL)
return FALSE;
diff --git a/profiles/audio/player.c b/profiles/audio/player.c
index c3aaef0..82c5bfb 100644
--- a/profiles/audio/player.c
+++ b/profiles/audio/player.c
@@ -239,7 +239,169 @@ static gboolean get_track(const GDBusPropertyTable *property,
return TRUE;
}
+static DBusMessage *media_player_play(DBusConnection *conn, DBusMessage *msg,
+ void *data)
+{
+ struct media_player *mp = data;
+ struct player_callback *cb = mp->cb;
+ int err;
+
+ if (cb->cbs->play == NULL)
+ return btd_error_not_supported(msg);
+
+ err = cb->cbs->play(mp, cb->user_data);
+ if (err < 0)
+ return btd_error_failed(msg, strerror(-err));
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *media_player_pause(DBusConnection *conn, DBusMessage *msg,
+ void *data)
+{
+ struct media_player *mp = data;
+ struct player_callback *cb = mp->cb;
+ int err;
+
+ if (cb->cbs->pause == NULL)
+ return btd_error_not_supported(msg);
+
+ err = cb->cbs->pause(mp, cb->user_data);
+ if (err < 0)
+ return btd_error_failed(msg, strerror(-err));
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *media_player_stop(DBusConnection *conn, DBusMessage *msg,
+ void *data)
+{
+ struct media_player *mp = data;
+ struct player_callback *cb = mp->cb;
+ int err;
+
+ if (cb->cbs->stop == NULL)
+ return btd_error_not_supported(msg);
+
+ err = cb->cbs->stop(mp, cb->user_data);
+ if (err < 0)
+ return btd_error_failed(msg, strerror(-err));
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *media_player_next(DBusConnection *conn, DBusMessage *msg,
+ void *data)
+{
+ struct media_player *mp = data;
+ struct player_callback *cb = mp->cb;
+ int err;
+
+ if (cb->cbs->next == NULL)
+ return btd_error_not_supported(msg);
+
+ err = cb->cbs->next(mp, cb->user_data);
+ if (err < 0)
+ return btd_error_failed(msg, strerror(-err));
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *media_player_previous(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct media_player *mp = data;
+ struct player_callback *cb = mp->cb;
+ int err;
+
+ if (cb->cbs->previous == NULL)
+ return btd_error_not_supported(msg);
+
+ err = cb->cbs->previous(mp, cb->user_data);
+ if (err < 0)
+ return btd_error_failed(msg, strerror(-err));
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *media_player_fast_forward(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct media_player *mp = data;
+ struct player_callback *cb = mp->cb;
+ int err;
+
+ if (cb->cbs->fast_forward == NULL)
+ return btd_error_not_supported(msg);
+
+ err = cb->cbs->fast_forward(mp, cb->user_data);
+ if (err < 0)
+ return btd_error_failed(msg, strerror(-err));
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *media_player_rewind(DBusConnection *conn, DBusMessage *msg,
+ void *data)
+{
+ struct media_player *mp = data;
+ struct player_callback *cb = mp->cb;
+ int err;
+
+ if (cb->cbs->rewind == NULL)
+ return btd_error_not_supported(msg);
+
+ err = cb->cbs->rewind(mp, cb->user_data);
+ if (err < 0)
+ return btd_error_failed(msg, strerror(-err));
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *media_player_volume_up(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct media_player *mp = data;
+ struct player_callback *cb = mp->cb;
+ int err;
+
+ if (cb->cbs->volume_up == NULL)
+ return btd_error_not_supported(msg);
+
+ err = cb->cbs->volume_up(mp, cb->user_data);
+ if (err < 0)
+ return btd_error_failed(msg, strerror(-err));
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *media_player_volume_down(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct media_player *mp = data;
+ struct player_callback *cb = mp->cb;
+ int err;
+
+ if (cb->cbs->volume_down == NULL)
+ return btd_error_not_supported(msg);
+
+ err = cb->cbs->volume_down(mp, cb->user_data);
+ if (err < 0)
+ return btd_error_failed(msg, strerror(-err));
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
static const GDBusMethodTable media_player_methods[] = {
+ { GDBUS_METHOD("Play", NULL, NULL, media_player_play) },
+ { GDBUS_METHOD("Pause", NULL, NULL, media_player_pause) },
+ { GDBUS_METHOD("Stop", NULL, NULL, media_player_stop) },
+ { GDBUS_METHOD("Next", NULL, NULL, media_player_next) },
+ { GDBUS_METHOD("Previous", NULL, NULL, media_player_previous) },
+ { GDBUS_METHOD("FastForward", NULL, NULL, media_player_fast_forward) },
+ { GDBUS_METHOD("Rewind", NULL, NULL, media_player_rewind) },
+ { GDBUS_METHOD("VolumeUp", NULL, NULL, media_player_volume_up) },
+ { GDBUS_METHOD("VolumeDown", NULL, NULL, media_player_volume_down) },
{ }
};
diff --git a/profiles/audio/player.h b/profiles/audio/player.h
index 87dfb66..4b92b30 100644
--- a/profiles/audio/player.h
+++ b/profiles/audio/player.h
@@ -28,6 +28,15 @@ struct media_player;
struct media_player_callback {
bool (*set_setting) (struct media_player *mp, const char *key,
const char *value, void *user_data);
+ int (*play) (struct media_player *mp, void *user_data);
+ int (*pause) (struct media_player *mp, void *user_data);
+ int (*stop) (struct media_player *mp, void *user_data);
+ int (*next) (struct media_player *mp, void *user_data);
+ int (*previous) (struct media_player *mp, void *user_data);
+ int (*fast_forward) (struct media_player *mp, void *user_data);
+ int (*rewind) (struct media_player *mp, void *user_data);
+ int (*volume_up) (struct media_player *mp, void *user_data);
+ int (*volume_down) (struct media_player *mp, void *user_data);
};
struct media_player *media_player_controller_create(const char *path);
--
1.8.0.1
^ permalink raw reply related
* [PATCH BlueZ 2/8 v2] player: Remove GetTrack and TrackChanged
From: Luiz Augusto von Dentz @ 2013-01-04 12:39 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1357303197-19673-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This turn track metadata into a property called "Track" of MediaPlayer1
---
profiles/audio/player.c | 81 +++++++++++++++----------------------------------
1 file changed, 25 insertions(+), 56 deletions(-)
diff --git a/profiles/audio/player.c b/profiles/audio/player.c
index 8748893..c3aaef0 100644
--- a/profiles/audio/player.c
+++ b/profiles/audio/player.c
@@ -82,33 +82,6 @@ static void append_metadata(void *key, void *value, void *user_data)
dict_append_entry(dict, key, DBUS_TYPE_STRING, &value);
}
-static DBusMessage *media_player_get_track(DBusConnection *conn,
- DBusMessage *msg, void *data)
-{
- struct media_player *mp = data;
- DBusMessage *reply;
- DBusMessageIter iter, dict;
-
- reply = dbus_message_new_method_return(msg);
- if (!reply)
- return NULL;
-
- dbus_message_iter_init_append(reply, &iter);
-
- dbus_message_iter_open_container(&iter, 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,
- &dict);
-
- g_hash_table_foreach(mp->track, append_metadata, &dict);
-
- dbus_message_iter_close_container(&iter, &dict);
-
- return reply;
-}
-
static struct pending_req *find_pending(struct media_player *mp,
const char *key)
{
@@ -246,16 +219,31 @@ static void set_setting(const GDBusPropertyTable *property,
player_set_setting(mp, id, property->name, value);
}
+static gboolean get_track(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct media_player *mp = data;
+ DBusMessageIter dict;
+
+ dbus_message_iter_open_container(iter, 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,
+ &dict);
+
+ g_hash_table_foreach(mp->track, append_metadata, &dict);
+
+ dbus_message_iter_close_container(iter, &dict);
+
+ return TRUE;
+}
+
static const GDBusMethodTable media_player_methods[] = {
- { GDBUS_EXPERIMENTAL_METHOD("GetTrack",
- NULL, GDBUS_ARGS({ "metadata", "a{sv}" }),
- media_player_get_track) },
{ }
};
static const GDBusSignalTable media_player_signals[] = {
- { GDBUS_EXPERIMENTAL_SIGNAL("TrackChanged",
- GDBUS_ARGS({ "metadata", "a{sv}" })) },
{ }
};
@@ -272,6 +260,8 @@ static const GDBusPropertyTable media_player_properties[] = {
G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
{ "Scan", "s", get_setting, set_setting, setting_exists,
G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
+ { "Track", "a{sv}", get_track, NULL, NULL,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
{ }
};
@@ -424,33 +414,12 @@ void media_player_set_status(struct media_player *mp, const char *status)
static gboolean process_metadata_changed(void *user_data)
{
struct media_player *mp = user_data;
- DBusMessage *signal;
- DBusMessageIter iter, dict;
mp->process_id = 0;
- signal = dbus_message_new_signal(mp->path, MEDIA_PLAYER_INTERFACE,
- "TrackChanged");
- if (signal == NULL) {
- error("Unable to allocate TrackChanged signal");
- return FALSE;
- }
-
- dbus_message_iter_init_append(signal, &iter);
-
- dbus_message_iter_open_container(&iter, 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,
- &dict);
-
-
- g_hash_table_foreach(mp->track, append_metadata, &dict);
-
- dbus_message_iter_close_container(&iter, &dict);
-
- g_dbus_send_message(btd_get_dbus_connection(), signal);
+ g_dbus_emit_property_changed(btd_get_dbus_connection(),
+ mp->path, MEDIA_PLAYER_INTERFACE,
+ "Track");
return FALSE;
}
--
1.8.0.1
^ permalink raw reply related
* [PATCH BlueZ 1/8 v2] media-api: Add playback control methods to MediaPlayer1
From: Luiz Augusto von Dentz @ 2013-01-04 12:39 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds methods such as Play, Pause directly in MediaPlayer1, in
addition to that Track is now turn into a property to take advantage of
ObjectManager and document the interface as experimental.
---
v2: Fix only emitting Track changes once and add device object propery
doc/media-api.txt | 99 ++++++++++++++++++++++++++++++++-----------------------
1 file changed, 57 insertions(+), 42 deletions(-)
diff --git a/doc/media-api.txt b/doc/media-api.txt
index e2a72dc..eb1f74f 100644
--- a/doc/media-api.txt
+++ b/doc/media-api.txt
@@ -129,7 +129,7 @@ Media Control hierarchy
=======================
Service org.bluez
-Interface org.bluez.MediaControl1
+Interface org.bluez.MediaControl1 [Deprecated]
Object path [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX
Methods void Play()
@@ -178,65 +178,47 @@ Properties
MediaPlayer1 hierarchy
======================
-Service unique name (Target role)
-Interface org.bluez.MediaPlayer1
-Object path freely definable
-
Service org.bluez (Controller role)
-Interface org.bluez.MediaPlayer1
+Interface org.bluez.MediaPlayer1 [Experimental]
Object path [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX
-Methods dict GetTrack()
-
- Returns known metadata of the current track.
-
- See TrackChanged for possible values.
-
- void Release()
-
- This method gets called when the service daemon
- unregisters the player which can then perform
- cleanup tasks. There is no need to unregister the
- player, because when this method gets called it has
- already been unregistered.
+Methods void Play()
-Signals TrackChanged(dict metadata)
+ Resume playback.
- This signal indicates that current track has changed.
- All available metadata for the new track shall be set
- at once in the metadata argument. Metadata cannot be
- updated in parts, otherwise it will be interpreted as
- multiple track changes.
+ void Pause()
- Possible values:
+ Pause playback.
- string Title:
+ void Stop()
- Track title name
+ Stop playback.
- string Artist:
+ void Next()
- Track artist name
+ Next item.
- string Album:
+ void Previous()
- Track album name
+ Previous item.
- string Genre:
+ void VolumeUp()
- Track genre name
+ Adjust remote volume one step up
- uint32 NumberOfTracks:
+ void VolumeDown()
- Number of tracks in total
+ Adjust remote volume one step down
- uint32 Number:
+ void FastForward()
- Track number
+ Fast forward playback, this action is only stopped
+ when another method in this interface is called.
- uint32 Duration:
+ void Rewind()
- Track duration in milliseconds
+ Rewind playback, this action is only stopped
+ when another method in this interface is called.
Properties string Equalizer [readwrite]
@@ -258,8 +240,8 @@ Properties string Equalizer [readwrite]
string Status [readonly]
Possible status: "playing", "stopped", "paused",
- "forward-seek", "reverse-seek" or
- "error"
+ "forward-seek", "reverse-seek"
+ or "error"
uint32 Position [readonly]
@@ -272,6 +254,39 @@ Properties string Equalizer [readwrite]
possible to signal its end by setting position to the
maximum uint32 value.
+ dict Track [readonly]
+
+ Track metadata.
+
+ Possible values:
+
+ string Title:
+
+ Track title name
+
+ string Artist:
+
+ Track artist name
+
+ string Album:
+
+ Track album name
+
+ string Genre:
+
+ Track genre name
+
+ uint32 NumberOfTracks:
+
+ Number of tracks in total
+
+ uint32 Number:
+
+ Track number
+
+ uint32 Duration:
+
+ Track duration in milliseconds
MediaEndpoint1 hierarchy
========================
--
1.8.0.1
^ permalink raw reply related
* Re: [PATCH v2 2/2] Bluetooth: Fix stop discovery while in STARTING state
From: Jaganath Kanakkassery @ 2013-01-04 7:46 UTC (permalink / raw)
To: Gustavo Padovan; +Cc: linux-bluetooth
In-Reply-To: <20130103193837.GB2114@joana>
Hi Gustavo,
--------------------------------------------------
From: "Gustavo Padovan" <gustavo@padovan.org>
Sent: Friday, January 04, 2013 1:08 AM
To: "Jaganath Kanakkassery" <jaganath.k@samsung.com>
Cc: <linux-bluetooth@vger.kernel.org>
Subject: Re: [PATCH v2 2/2] Bluetooth: Fix stop discovery while in STARTING
state
> Hi Jaganath,
>
> * Jaganath Kanakkassery <jaganath.k@samsung.com> [2012-12-21 18:20:25
> +0530]:
>
>> If stop_discovery() is called when discovery state is STARTING, it
>> will be failed currently. This patch fixes this.
>>
>> Signed-off-by: Jaganath Kanakkassery <jaganath.k@samsung.com>
>> ---
>> include/net/bluetooth/hci_core.h | 2 ++
>> net/bluetooth/hci_event.c | 14 ++++++++++++--
>> net/bluetooth/mgmt.c | 31 ++++++++++++++++++++++++++++++-
>> 3 files changed, 44 insertions(+), 3 deletions(-)
>>
>> diff --git a/include/net/bluetooth/hci_core.h
>> b/include/net/bluetooth/hci_core.h
>> index 119fcb6..c2886b7 100644
>> --- a/include/net/bluetooth/hci_core.h
>> +++ b/include/net/bluetooth/hci_core.h
>> @@ -64,6 +64,7 @@ struct discovery_state {
>> DISCOVERY_RESOLVING,
>> DISCOVERY_STOPPING,
>> } state;
>> + u8 discovering;
>> struct list_head all; /* All devices found during inquiry */
>> struct list_head unknown; /* Name state not known */
>> struct list_head resolve; /* Name needs to be resolved */
>> @@ -1066,6 +1067,7 @@ int mgmt_device_found(struct hci_dev *hdev,
>> bdaddr_t *bdaddr, u8 link_type,
>> int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8
>> link_type,
>> u8 addr_type, s8 rssi, u8 *name, u8 name_len);
>> int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status);
>> +int mgmt_start_discovery_complete(struct hci_dev *hdev, u8 status);
>> int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status);
>> int mgmt_discovering(struct hci_dev *hdev, u8 discovering);
>> int mgmt_interleaved_discovery(struct hci_dev *hdev);
>> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
>> index e248e7c..b486458 100644
>> --- a/net/bluetooth/hci_event.c
>> +++ b/net/bluetooth/hci_event.c
>> @@ -1092,7 +1092,12 @@ static void hci_cc_le_set_scan_enable(struct
>> hci_dev *hdev,
>> set_bit(HCI_LE_SCAN, &hdev->dev_flags);
>>
>> hci_dev_lock(hdev);
>> - hci_discovery_set_state(hdev, DISCOVERY_FINDING);
>> + if (hdev->discovery.state == DISCOVERY_STOPPING) {
>> + hci_cancel_le_scan(hdev);
>> + mgmt_start_discovery_complete(hdev, 0);
>
> Reply to mgmt with an error here might be better.
I think the best error which can be given here is
MGMT_STATUS_CANCELLED. But this error is not accessible in hci_event.c
>> + } else {
>> + hci_discovery_set_state(hdev, DISCOVERY_FINDING);
>> + }
>> hci_dev_unlock(hdev);
>> break;
>>
>> @@ -1189,7 +1194,12 @@ static void hci_cs_inquiry(struct hci_dev *hdev,
>> __u8 status)
>> set_bit(HCI_INQUIRY, &hdev->flags);
>>
>> hci_dev_lock(hdev);
>> - hci_discovery_set_state(hdev, DISCOVERY_FINDING);
>> + if (hdev->discovery.state == DISCOVERY_STOPPING) {
>> + hci_cancel_inquiry(hdev);
>> + mgmt_start_discovery_complete(hdev, 0);
>> + } else {
>> + hci_discovery_set_state(hdev, DISCOVERY_FINDING);
>> + }
>> hci_dev_unlock(hdev);
>> }
>>
>> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
>> index d6c0d78..ba4171f 100644
>> --- a/net/bluetooth/mgmt.c
>> +++ b/net/bluetooth/mgmt.c
>> @@ -2385,7 +2385,8 @@ static int stop_discovery(struct sock *sk, struct
>> hci_dev *hdev, void *data,
>>
>> hci_dev_lock(hdev);
>>
>> - if (!hci_discovery_active(hdev)) {
>> + if (hdev->discovery.state != DISCOVERY_STARTING &&
>> + !hci_discovery_active(hdev)) {
>> err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
>> MGMT_STATUS_REJECTED, &mgmt_cp->type,
>> sizeof(mgmt_cp->type));
>> @@ -2433,6 +2434,10 @@ static int stop_discovery(struct sock *sk, struct
>> hci_dev *hdev, void *data,
>>
>> break;
>>
>> + case DISCOVERY_STARTING:
>> + err = 0;
>> + break;
>> +
>> default:
>> BT_DBG("unknown discovery state %u", hdev->discovery.state);
>> err = -EFAULT;
>> @@ -3624,6 +3629,25 @@ int mgmt_start_discovery_failed(struct hci_dev
>> *hdev, u8 status)
>> return err;
>> }
>>
>> +int mgmt_start_discovery_complete(struct hci_dev *hdev, u8 status)
>> +{
>> + struct pending_cmd *cmd;
>> + u8 type;
>> + int err;
>> +
>> + cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
>> + if (!cmd)
>> + return -ENOENT;
>> +
>> + type = hdev->discovery.type;
>> +
>> + err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
>> + &type, sizeof(type));
>> + mgmt_pending_remove(cmd);
>> +
>> + return err;
>> +}
>
> This is exactly the same thing as mgmt_start_discovery_failed(), just
> rename it
> to _complete() as you did with mgmt_stop_discovery_failed(). Do it as a
> separate patch.
mgmt_start_discovery_failed() sets discovery state to STOPPED which also
sends
stop_discovery_complete internally. I think both are inappropriate at the
point
where mgmt_start_discovery_complete() is called.
How abt renaming the new function mgmt_start_discovery_complete() to
mgmt_start_discovery_cancelled and send MGMT_STATUS_CANCELLED in that?
This way your first comment also will be taken care.
Please let me know your opinion.
Thanks,
Jaganath
^ permalink raw reply
* Re: [PATCH 2/2] Bluetooth: Fix authentication if acl data comes before remote feature evt
From: Jaganath Kanakkassery @ 2013-01-04 5:57 UTC (permalink / raw)
To: Johan Hedberg; +Cc: linux-bluetooth
In-Reply-To: <20130103140026.GB18154@x220.ger.corp.intel.com>
Hi Johan,
--------------------------------------------------
From: "Johan Hedberg" <johan.hedberg@gmail.com>
Sent: Thursday, January 03, 2013 7:30 PM
To: "Jaganath Kanakkassery" <jaganath.k@samsung.com>
Cc: <linux-bluetooth@vger.kernel.org>
Subject: Re: [PATCH 2/2] Bluetooth: Fix authentication if acl data comes
before remote feature evt
> Hi Jaganath,
>
> On Thu, Jan 03, 2013, Jaganath Kanakkassery wrote:
>> If remote device sends l2cap info request before read_remote_ext_feature
>> completes then mgmt_connected will be sent in hci_acldata_packet() and
>> remote name request wont be sent and eventually authentication wont
>> happen
>>
>> Hcidump log of the issue
>>
>> < HCI Command: Create Connection (0x01|0x0005) plen 13
>> bdaddr BC:85:1F:74:7F:29 ptype 0xcc18 rswitch 0x01 clkoffset 0x4bf7
>> (valid)
>> Packet type: DM1 DM3 DM5 DH1 DH3 DH5
>> > HCI Event: Command Status (0x0f) plen 4
>> Create Connection (0x01|0x0005) status 0x00 ncmd 1
>> > HCI Event: Connect Complete (0x03) plen 11
>> status 0x00 handle 12 bdaddr BC:85:1F:74:7F:29 type ACL encrypt 0x00
>> < HCI Command: Read Remote Supported Features (0x01|0x001b) plen 2
>> handle 12
>> > HCI Event: Command Status (0x0f) plen 4
>> Read Remote Supported Features (0x01|0x001b) status 0x00 ncmd 1
>> > HCI Event: Read Remote Supported Features (0x0b) plen 11
>> status 0x00 handle 12
>> Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
>> > HCI Event: Max Slots Change (0x1b) plen 3
>> handle 12 slots 5
>> < HCI Command: Read Remote Extended Features (0x01|0x001c) plen 3
>> handle 12 page 1
>> > HCI Event: Command Status (0x0f) plen 4
>> Read Remote Extended Features (0x01|0x001c) status 0x00 ncmd 1
>> > ACL data: handle 12 flags 0x02 dlen 10
>> L2CAP(s): Info req: type 2
>> < ACL data: handle 12 flags 0x00 dlen 16
>> L2CAP(s): Info rsp: type 2 result 0
>> Extended feature mask 0x00b8
>> Enhanced Retransmission mode
>> Streaming mode
>> FCS Option
>> Fixed Channels
>> > HCI Event: Read Remote Extended Features (0x23) plen 13
>> status 0x00 handle 12 page 1 max 1
>> Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
>> > ACL data: handle 12 flags 0x02 dlen 10
>> L2CAP(s): Info req: type 3
>> < ACL data: handle 12 flags 0x00 dlen 20
>> L2CAP(s): Info rsp: type 3 result 0
>> Fixed channel list 0x00000002
>> L2CAP Signalling Channel
>> > HCI Event: Number of Completed Packets (0x13) plen 5
>> handle 12 packets 2
>>
>> Signed-off-by: Jaganath Kanakkassery <jaganath.k@samsung.com>
>> ---
>> net/bluetooth/hci_core.c | 1 +
>> 1 file changed, 1 insertion(+)
>>
>> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
>> index 596660d..c14def9 100644
>> --- a/net/bluetooth/hci_core.c
>> +++ b/net/bluetooth/hci_core.c
>> @@ -2812,6 +2812,7 @@ static void hci_acldata_packet(struct hci_dev
>> *hdev, struct sk_buff *skb)
>>
>> hci_dev_lock(hdev);
>> if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
>> + !hci_outgoing_auth_needed(hdev, conn) &&
>> !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
>> mgmt_device_connected(hdev, &conn->dst, conn->type,
>> conn->dst_type, 0, NULL, 0,
>
> I'm not completely sure if this is the right way or even the right place
> to fix the issue. The reason why this if-clause is here is so that we
> don't get a too late mgmt_connected event in case the remote device is
> fast in sending an L2CAP Connect Request. Maybe if-clause needs to be
> made L2CAP Connect request specific (and moved to an L2CAP specific
> location) or then something added to the code path taken for the info
> request?
If the reason for mgmt_connected in acl_data() is to handle early l2cap
connect request from remote then I think it is better to move it to
l2cap connect request as you said.
So I will add mgmt_connected in l2cap_connect_req() before sending
l2cap connect response?
This will solve the authentication issue as well.
Thanks,
Jaganath
^ permalink raw reply
* [PATCH 2/2] rfkill: Fix count parameter in read
From: Jaganath Kanakkassery @ 2013-01-04 5:42 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jaganath Kanakkassery
In-Reply-To: <1357278148-27872-1-git-send-email-jaganath.k@samsung.com>
Since g_str_has_prefix() has been used with the output buffer of read
it should be NULL terminated
---
src/rfkill.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/rfkill.c b/src/rfkill.c
index bac9efd..51591cb 100644
--- a/src/rfkill.c
+++ b/src/rfkill.c
@@ -114,7 +114,7 @@ static gboolean rfkill_event(GIOChannel *chan,
memset(sysname, 0, sizeof(sysname));
- if (read(fd, sysname, sizeof(sysname)) < 4) {
+ if (read(fd, sysname, sizeof(sysname) - 1) < 4) {
close(fd);
return TRUE;
}
--
1.7.9.5
^ permalink raw reply related
* [PATCH 1/2] storage: Fix memory leak
From: Jaganath Kanakkassery @ 2013-01-04 5:42 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jaganath Kanakkassery
If bt_uuid2string() returns NULL then svcclass has to be freed
---
src/storage.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/storage.c b/src/storage.c
index 375974a..be3bbf2 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -180,8 +180,10 @@ sdp_record_t *find_record_in_list(sdp_list_t *recs, const char *uuid)
/* Extract the uuid */
uuid_str = bt_uuid2string(svcclass->data);
- if (!uuid_str)
+ if (!uuid_str) {
+ sdp_list_free(svcclass, free);
continue;
+ }
if (!strcasecmp(uuid_str, uuid)) {
sdp_list_free(svcclass, free);
--
1.7.9.5
^ permalink raw reply related
* Re: [PATCH BlueZ] gdbus: Don't include just added interfaces in GetManagedObjects
From: Marcel Holtmann @ 2013-01-04 5:36 UTC (permalink / raw)
To: Lucas De Marchi; +Cc: linux-bluetooth
In-Reply-To: <1357270424-24036-1-git-send-email-lucas.demarchi@profusion.mobi>
Hi Lucas,
> If we received a call to ObjectManager.GetManagedObject we should not
> include in the response the interfaces in data->added. This is because
> it's not guaranteed that those interfaces will trigger an
> InterfacesAdded signal, which is the case if the interface is removed in
> the same mainloop iteration.
> ---
> gdbus/object.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
patch has been applied.
Regards
Marcel
^ permalink raw reply
* Re: [PATCH BlueZ 3/3] gitignore: Ignore file generated by Automake 1.13
From: Marcel Holtmann @ 2013-01-04 5:32 UTC (permalink / raw)
To: Lucas De Marchi; +Cc: linux-bluetooth, Lucas De Marchi
In-Reply-To: <1357262465-19231-3-git-send-email-lucas.demarchi@profusion.mobi>
Hi Lucas,
> ---
> .gitignore | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/.gitignore b/.gitignore
> index 04c9862..619f492 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -25,6 +25,7 @@ ltmain.sh
> missing
> stamp-h1
> autom4te.cache
> +test-driver
no idea what this is. I do not have that. What is it actually.
Regards
Marcel
^ permalink raw reply
* Re: [PATCH BlueZ 2/3] gdbus: Simplify generated introspection
From: Marcel Holtmann @ 2013-01-04 5:32 UTC (permalink / raw)
To: Lucas De Marchi; +Cc: linux-bluetooth, Lucas De Marchi
In-Reply-To: <1357262465-19231-2-git-send-email-lucas.demarchi@profusion.mobi>
Hi Lucas,
> The generated introspection is not supposed to be read as is by human,
> so there's no point in printing the indentation or writing more code to
> use auto-close tags.
>
> If it's desired to read the raw xml file, user can always use other
> tools to transform the output such as "xmllint --format".
>
> This also fixes a missing </property> when property is deprecated.
> ---
> gdbus/object.c | 103 +++++++++++++++++++++------------------------------------
> 1 file changed, 38 insertions(+), 65 deletions(-)
patch has been applied.
Regards
Marcel
^ permalink raw reply
* Re: [PATCH BlueZ 1/3] build: Do not use deprecated AM_CONFIG_HEADER
From: Marcel Holtmann @ 2013-01-04 5:29 UTC (permalink / raw)
To: Lucas De Marchi; +Cc: linux-bluetooth, Lucas De Marchi
In-Reply-To: <1357262465-19231-1-git-send-email-lucas.demarchi@profusion.mobi>
Hi Lucas,
> The long-obsoleted AM_CONFIG_HEADER macro was removed in automake 1.13.
> Use AC_CONFIG_HEADERS instead.
> ---
> configure.ac | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
patch has been applied.
For extra credits, you could update the other projects as well.
Regards
Marcel
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox