mirror of
https://github.com/libretro/RetroArch.git
synced 2024-11-23 07:59:42 +00:00
(bluetooth drivers) Move driver info to userdata, clean up API
This commit is contained in:
parent
b2dbbeb386
commit
f668ed063e
@ -28,13 +28,7 @@ enum rarch_bluetooth_ctl_state
|
||||
RARCH_BLUETOOTH_CTL_NONE = 0,
|
||||
RARCH_BLUETOOTH_CTL_DESTROY,
|
||||
RARCH_BLUETOOTH_CTL_DEINIT,
|
||||
RARCH_BLUETOOTH_CTL_SET_ACTIVE,
|
||||
RARCH_BLUETOOTH_CTL_UNSET_ACTIVE,
|
||||
RARCH_BLUETOOTH_CTL_IS_ACTIVE,
|
||||
RARCH_BLUETOOTH_CTL_FIND_DRIVER,
|
||||
RARCH_BLUETOOTH_CTL_SET_CB,
|
||||
RARCH_BLUETOOTH_CTL_STOP,
|
||||
RARCH_BLUETOOTH_CTL_START,
|
||||
RARCH_BLUETOOTH_CTL_INIT
|
||||
};
|
||||
|
||||
@ -44,14 +38,11 @@ typedef struct bluetooth_driver
|
||||
|
||||
void (*free)(void *data);
|
||||
|
||||
bool (*start)(void *data);
|
||||
void (*stop)(void *data);
|
||||
|
||||
void (*scan)(void);
|
||||
void (*get_devices)(struct string_list *list);
|
||||
bool (*device_is_connected)(unsigned i);
|
||||
void (*device_get_sublabel)(char *s, unsigned i, size_t len);
|
||||
bool (*connect_device)(unsigned i);
|
||||
void (*scan)(void *data);
|
||||
void (*get_devices)(void *data, struct string_list *list);
|
||||
bool (*device_is_connected)(void *data, unsigned i);
|
||||
void (*device_get_sublabel)(void *data, char *s, unsigned i, size_t len);
|
||||
bool (*connect_device)(void *data, unsigned i);
|
||||
|
||||
const char *ident;
|
||||
} bluetooth_driver_t;
|
||||
@ -70,10 +61,6 @@ extern bluetooth_driver_t bluetooth_bluez;
|
||||
**/
|
||||
const char* config_get_bluetooth_driver_options(void);
|
||||
|
||||
void driver_bluetooth_stop(void);
|
||||
|
||||
bool driver_bluetooth_start(void);
|
||||
|
||||
void driver_bluetooth_scan(void);
|
||||
|
||||
void driver_bluetooth_get_devices(struct string_list *list);
|
||||
|
@ -18,48 +18,40 @@
|
||||
#include "../bluetooth_driver.h"
|
||||
#include "../../retroarch.h"
|
||||
|
||||
/* TODO/FIXME - static globals - should go into userdata
|
||||
* struct for driver */
|
||||
static bool bluetoothctl_cache[256] = {0};
|
||||
static unsigned bluetoothctl_counter[256] = {0};
|
||||
static struct string_list* lines = NULL;
|
||||
static char command[256] = {0};
|
||||
typedef struct
|
||||
{
|
||||
bool bluetoothctl_cache[256];
|
||||
unsigned bluetoothctl_counter[256];
|
||||
struct string_list* lines;
|
||||
char command[256];
|
||||
} bluetoothctl_t;
|
||||
|
||||
static void *bluetoothctl_init(void)
|
||||
{
|
||||
return (void*)-1;
|
||||
return calloc(1, sizeof(bluetoothctl_t));
|
||||
}
|
||||
|
||||
static void bluetoothctl_free(void *data)
|
||||
{
|
||||
(void)data;
|
||||
if (data)
|
||||
free(data);
|
||||
}
|
||||
|
||||
static bool bluetoothctl_start(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void bluetoothctl_stop(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static void bluetoothctl_scan(void)
|
||||
static void bluetoothctl_scan(void *data)
|
||||
{
|
||||
bluetoothctl_t *btctl = (bluetoothctl_t*) data;
|
||||
char line[512];
|
||||
union string_list_elem_attr attr;
|
||||
FILE *dev_file = NULL;
|
||||
|
||||
attr.i = 0;
|
||||
if (lines)
|
||||
free(lines);
|
||||
lines = string_list_new();
|
||||
if (btctl->lines)
|
||||
free(btctl->lines);
|
||||
btctl->lines = string_list_new();
|
||||
|
||||
pclose(popen("bluetoothctl -- power on", "r"));
|
||||
|
||||
pclose(popen("bluetoothctl --timeout 15 scan on", "r"));
|
||||
pclose(popen("bluetoothctl --timeout 10 scan on", "r"));
|
||||
|
||||
runloop_msg_queue_push(msg_hash_to_str(MSG_BLUETOOTH_SCAN_COMPLETE),
|
||||
1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT,
|
||||
@ -73,26 +65,27 @@ static void bluetoothctl_scan(void)
|
||||
if (len > 0 && line[len-1] == '\n')
|
||||
line[--len] = '\0';
|
||||
|
||||
string_list_append(lines, line, attr);
|
||||
string_list_append(btctl->lines, line, attr);
|
||||
}
|
||||
|
||||
pclose(dev_file);
|
||||
}
|
||||
|
||||
static void bluetoothctl_get_devices(struct string_list* devices)
|
||||
static void bluetoothctl_get_devices(void *data, struct string_list* devices)
|
||||
{
|
||||
bluetoothctl_t *btctl = (bluetoothctl_t*) data;
|
||||
unsigned i;
|
||||
union string_list_elem_attr attr;
|
||||
|
||||
attr.i = 0;
|
||||
|
||||
if (!lines)
|
||||
if (!btctl->lines)
|
||||
return;
|
||||
|
||||
for (i = 0; i < lines->size; i++)
|
||||
for (i = 0; i < btctl->lines->size; i++)
|
||||
{
|
||||
char device[64];
|
||||
const char *line = lines->elems[i].data;
|
||||
const char *line = btctl->lines->elems[i].data;
|
||||
|
||||
/* bluetoothctl devices outputs lines of the format:
|
||||
* $ bluetoothctl devices
|
||||
@ -103,17 +96,18 @@ static void bluetoothctl_get_devices(struct string_list* devices)
|
||||
}
|
||||
}
|
||||
|
||||
static bool bluetoothctl_device_is_connected(unsigned i)
|
||||
static bool bluetoothctl_device_is_connected(void *data, unsigned i)
|
||||
{
|
||||
bluetoothctl_t *btctl = (bluetoothctl_t*) data;
|
||||
char ln[512] = {0};
|
||||
char device[18] = {0};
|
||||
const char *line = lines->elems[i].data;
|
||||
const char *line = btctl->lines->elems[i].data;
|
||||
FILE *command_file = NULL;
|
||||
|
||||
if (bluetoothctl_counter[i] == 60)
|
||||
if (btctl->bluetoothctl_counter[i] == 60)
|
||||
{
|
||||
static struct string_list* list = NULL;
|
||||
bluetoothctl_counter[i] = 0;
|
||||
btctl->bluetoothctl_counter[i] = 0;
|
||||
list = string_split(line, " ");
|
||||
if (!list)
|
||||
return false;
|
||||
@ -127,34 +121,35 @@ static bool bluetoothctl_device_is_connected(unsigned i)
|
||||
strlcpy(device, list->elems[1].data, sizeof(device));
|
||||
string_list_free(list);
|
||||
|
||||
snprintf(command, sizeof(command), "\
|
||||
snprintf(btctl->command, sizeof(btctl->command), "\
|
||||
bluetoothctl -- info %s | grep 'Connected: yes'",
|
||||
device);
|
||||
|
||||
command_file = popen(command, "r");
|
||||
command_file = popen(btctl->command, "r");
|
||||
|
||||
while (fgets(ln, 512, command_file))
|
||||
{
|
||||
bluetoothctl_cache[i] = true;
|
||||
btctl->bluetoothctl_cache[i] = true;
|
||||
return true;
|
||||
}
|
||||
pclose(command_file);
|
||||
bluetoothctl_cache[i] = false;
|
||||
btctl->bluetoothctl_cache[i] = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
bluetoothctl_counter[i]++;
|
||||
return bluetoothctl_cache[i];
|
||||
btctl->bluetoothctl_counter[i]++;
|
||||
return btctl->bluetoothctl_cache[i];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool bluetoothctl_connect_device(unsigned idx)
|
||||
static bool bluetoothctl_connect_device(void *data, unsigned idx)
|
||||
{
|
||||
bluetoothctl_t *btctl = (bluetoothctl_t*) data;
|
||||
unsigned i;
|
||||
char device[18] = {0};
|
||||
const char *line = lines->elems[idx].data;
|
||||
const char *line = btctl->lines->elems[idx].data;
|
||||
static struct string_list* list = NULL;
|
||||
|
||||
/* bluetoothctl devices outputs lines of the format:
|
||||
@ -174,43 +169,42 @@ static bool bluetoothctl_connect_device(unsigned idx)
|
||||
strlcpy(device, list->elems[1].data, sizeof(device));
|
||||
string_list_free(list);
|
||||
|
||||
snprintf(command, sizeof(command), "\
|
||||
snprintf(btctl->command, sizeof(btctl->command), "\
|
||||
bluetoothctl -- trust %s",
|
||||
device);
|
||||
|
||||
pclose(popen(command, "r"));
|
||||
pclose(popen(btctl->command, "r"));
|
||||
|
||||
snprintf(command, sizeof(command), "\
|
||||
snprintf(btctl->command, sizeof(btctl->command), "\
|
||||
bluetoothctl -- pair %s",
|
||||
device);
|
||||
|
||||
pclose(popen(command, "r"));
|
||||
pclose(popen(btctl->command, "r"));
|
||||
|
||||
snprintf(command, sizeof(command), "\
|
||||
snprintf(btctl->command, sizeof(btctl->command), "\
|
||||
bluetoothctl -- connect %s",
|
||||
device);
|
||||
|
||||
pclose(popen(command, "r"));
|
||||
pclose(popen(btctl->command, "r"));
|
||||
|
||||
bluetoothctl_counter[idx] = 0;
|
||||
btctl->bluetoothctl_counter[idx] = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
void bluetoothctl_device_get_sublabel (char *s, unsigned i, size_t len)
|
||||
void bluetoothctl_device_get_sublabel (void *data, char *s, unsigned i, size_t len)
|
||||
{
|
||||
bluetoothctl_t *btctl = (bluetoothctl_t*) data;
|
||||
/* bluetoothctl devices outputs lines of the format:
|
||||
* $ bluetoothctl devices
|
||||
* 'Device (mac address) (device name)'
|
||||
*/
|
||||
const char *line = lines->elems[i].data;
|
||||
const char *line = btctl->lines->elems[i].data;
|
||||
strlcpy(s, line+7, 18);
|
||||
}
|
||||
|
||||
bluetooth_driver_t bluetooth_bluetoothctl = {
|
||||
bluetoothctl_init,
|
||||
bluetoothctl_free,
|
||||
bluetoothctl_start,
|
||||
bluetoothctl_stop,
|
||||
bluetoothctl_scan,
|
||||
bluetoothctl_get_devices,
|
||||
bluetoothctl_device_is_connected,
|
||||
|
@ -49,37 +49,29 @@ typedef struct
|
||||
#undef VECTOR_LIST_TYPE
|
||||
#undef VECTOR_LIST_NAME
|
||||
|
||||
/* TODO/FIXME - static globals - should go into userdata
|
||||
* struct for driver */
|
||||
static struct device_info_vector_list *devices = NULL;
|
||||
static char adapter[256] = {0};
|
||||
static DBusConnection* dbus_connection = NULL;
|
||||
static bool bluez_cache[256] = {0};
|
||||
static int bluez_cache_counter[256] = {0};
|
||||
typedef struct
|
||||
{
|
||||
struct device_info_vector_list *devices;
|
||||
char adapter[256];
|
||||
DBusConnection* dbus_connection;
|
||||
bool bluez_cache[256];
|
||||
int bluez_cache_counter[256];
|
||||
} bluez_t;
|
||||
|
||||
static void *bluez_init (void)
|
||||
{
|
||||
return (void*)-1;
|
||||
return calloc(1, sizeof(bluez_t));
|
||||
}
|
||||
|
||||
static void bluez_free (void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static bool bluez_start (void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void bluez_stop (void *data)
|
||||
{
|
||||
(void)data;
|
||||
if (data)
|
||||
free(data);
|
||||
}
|
||||
|
||||
static int
|
||||
set_bool_property (
|
||||
bluez_t *bluez,
|
||||
const char *path,
|
||||
const char *arg_adapter,
|
||||
const char *arg_property,
|
||||
@ -118,7 +110,7 @@ set_bool_property (
|
||||
&req_iter, &req_subiter))
|
||||
goto fault;
|
||||
|
||||
reply = dbus_connection_send_with_reply_and_block(dbus_connection,
|
||||
reply = dbus_connection_send_with_reply_and_block(bluez->dbus_connection,
|
||||
message, 1000, &err);
|
||||
if (!reply)
|
||||
goto fault;
|
||||
@ -133,6 +125,7 @@ fault:
|
||||
}
|
||||
|
||||
static int get_bool_property(
|
||||
bluez_t *bluez,
|
||||
const char *path,
|
||||
const char *arg_adapter,
|
||||
const char *arg_property,
|
||||
@ -155,7 +148,7 @@ static int get_bool_property(
|
||||
DBUS_TYPE_INVALID))
|
||||
return 1;
|
||||
|
||||
reply = dbus_connection_send_with_reply_and_block(dbus_connection,
|
||||
reply = dbus_connection_send_with_reply_and_block(bluez->dbus_connection,
|
||||
message, 1000, &err);
|
||||
|
||||
dbus_message_unref(message);
|
||||
@ -176,24 +169,24 @@ static int get_bool_property(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adapter_discovery (const char *method)
|
||||
static int adapter_discovery (bluez_t *bluez, const char *method)
|
||||
{
|
||||
DBusMessage *message = dbus_message_new_method_call(
|
||||
"org.bluez", adapter,
|
||||
"org.bluez", bluez->adapter,
|
||||
"org.bluez.Adapter1", method);
|
||||
if (!message)
|
||||
return 1;
|
||||
|
||||
if (!dbus_connection_send(dbus_connection, message, NULL))
|
||||
if (!dbus_connection_send(bluez->dbus_connection, message, NULL))
|
||||
return 1;
|
||||
|
||||
dbus_connection_flush(dbus_connection);
|
||||
dbus_connection_flush(bluez->dbus_connection);
|
||||
dbus_message_unref(message);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_managed_objects (DBusMessage **reply)
|
||||
static int get_managed_objects (bluez_t *bluez, DBusMessage **reply)
|
||||
{
|
||||
DBusMessage *message;
|
||||
DBusError err;
|
||||
@ -205,7 +198,7 @@ static int get_managed_objects (DBusMessage **reply)
|
||||
if (!message)
|
||||
return 1;
|
||||
|
||||
*reply = dbus_connection_send_with_reply_and_block(dbus_connection,
|
||||
*reply = dbus_connection_send_with_reply_and_block(bluez->dbus_connection,
|
||||
message, -1, &err);
|
||||
/* if (!reply) is done by the caller in this one */
|
||||
|
||||
@ -213,7 +206,7 @@ static int get_managed_objects (DBusMessage **reply)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int device_method (const char *path, const char *method)
|
||||
static int device_method (bluez_t *bluez, const char *path, const char *method)
|
||||
{
|
||||
DBusMessage *message, *reply;
|
||||
DBusError err;
|
||||
@ -225,46 +218,18 @@ static int device_method (const char *path, const char *method)
|
||||
if (!message)
|
||||
return 1;
|
||||
|
||||
reply = dbus_connection_send_with_reply_and_block(dbus_connection,
|
||||
reply = dbus_connection_send_with_reply_and_block(bluez->dbus_connection,
|
||||
message, 10000, &err);
|
||||
if (!reply)
|
||||
return 1;
|
||||
|
||||
dbus_connection_flush(dbus_connection);
|
||||
dbus_connection_flush(bluez->dbus_connection);
|
||||
dbus_message_unref(message);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int device_remove (const char *path)
|
||||
{
|
||||
DBusMessage *message, *reply;
|
||||
DBusError err;
|
||||
|
||||
dbus_error_init(&err);
|
||||
|
||||
message = dbus_message_new_method_call( "org.bluez", adapter,
|
||||
"org.bluez.Adapter11", "RemoveDevice");
|
||||
if (!message)
|
||||
return 1;
|
||||
|
||||
if (!dbus_message_append_args(message,
|
||||
DBUS_TYPE_OBJECT_PATH, &path,
|
||||
DBUS_TYPE_INVALID))
|
||||
return 1;
|
||||
|
||||
reply = dbus_connection_send_with_reply_and_block(dbus_connection,
|
||||
message, 10000, &err);
|
||||
if (!reply)
|
||||
return 1;
|
||||
|
||||
dbus_connection_flush(dbus_connection);
|
||||
dbus_message_unref(message);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_default_adapter(DBusMessage *reply)
|
||||
static int get_default_adapter(bluez_t *bluez, DBusMessage *reply)
|
||||
{
|
||||
/* "...an application would discover the available adapters by
|
||||
* performing a ObjectManager.GetManagedObjects call and look for any
|
||||
@ -329,7 +294,7 @@ static int get_default_adapter(DBusMessage *reply)
|
||||
|
||||
if (string_is_equal(interface_name, "org.bluez.Adapter1"))
|
||||
{
|
||||
strlcpy(adapter, obj_path, 256);
|
||||
strlcpy(bluez->adapter, obj_path, 256);
|
||||
return 0;
|
||||
}
|
||||
} while (dbus_message_iter_next(&array_2_iter));
|
||||
@ -339,7 +304,7 @@ static int get_default_adapter(DBusMessage *reply)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int read_scanned_devices (DBusMessage *reply)
|
||||
static int read_scanned_devices (bluez_t *bluez, DBusMessage *reply)
|
||||
{
|
||||
device_info_t device;
|
||||
DBusMessageIter root_iter;
|
||||
@ -490,7 +455,7 @@ static int read_scanned_devices (DBusMessage *reply)
|
||||
}
|
||||
} while (dbus_message_iter_next(&array_3_iter));
|
||||
|
||||
if (!device_info_vector_list_append(devices, device))
|
||||
if (!device_info_vector_list_append(bluez->devices, device))
|
||||
return 1;
|
||||
|
||||
} while (dbus_message_iter_next(&array_2_iter));
|
||||
@ -499,138 +464,143 @@ static int read_scanned_devices (DBusMessage *reply)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void bluez_dbus_connect (void)
|
||||
static void bluez_dbus_connect (bluez_t *bluez)
|
||||
{
|
||||
DBusError err;
|
||||
dbus_error_init(&err);
|
||||
dbus_connection = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err);
|
||||
bluez->dbus_connection = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err);
|
||||
}
|
||||
|
||||
static void bluez_dbus_disconnect (void)
|
||||
static void bluez_dbus_disconnect (bluez_t *bluez)
|
||||
{
|
||||
if (!dbus_connection)
|
||||
if (!bluez->dbus_connection)
|
||||
return;
|
||||
|
||||
dbus_connection_close(dbus_connection);
|
||||
dbus_connection_unref(dbus_connection);
|
||||
dbus_connection = NULL;
|
||||
dbus_connection_close(bluez->dbus_connection);
|
||||
dbus_connection_unref(bluez->dbus_connection);
|
||||
bluez->dbus_connection = NULL;
|
||||
}
|
||||
|
||||
static void bluez_scan (void)
|
||||
static void bluez_scan (void *data)
|
||||
{
|
||||
bluez_t *bluez = (bluez_t*)data;
|
||||
DBusError err;
|
||||
DBusMessage *reply;
|
||||
|
||||
bluez_dbus_connect();
|
||||
bluez_dbus_connect(bluez);
|
||||
|
||||
if (get_managed_objects(&reply))
|
||||
if (get_managed_objects(bluez, &reply))
|
||||
return;
|
||||
if (!reply)
|
||||
return;
|
||||
|
||||
/* Get default adapter */
|
||||
if (get_default_adapter(reply))
|
||||
if (get_default_adapter(bluez, reply))
|
||||
return;
|
||||
dbus_message_unref(reply);
|
||||
|
||||
/* Power device on */
|
||||
if (set_bool_property(adapter, "org.bluez.Adapter1", "Powered", 1))
|
||||
if (set_bool_property(bluez, bluez->adapter, "org.bluez.Adapter1", "Powered", 1))
|
||||
return;
|
||||
|
||||
/* Start discovery */
|
||||
if (adapter_discovery("StartDiscovery"))
|
||||
if (adapter_discovery(bluez, "StartDiscovery"))
|
||||
return;
|
||||
|
||||
retro_sleep(10000);
|
||||
|
||||
/* Stop discovery */
|
||||
if (adapter_discovery("StopDiscovery"))
|
||||
if (adapter_discovery(bluez, "StopDiscovery"))
|
||||
return;
|
||||
|
||||
/* Get scanned devices */
|
||||
if (get_managed_objects(&reply))
|
||||
if (get_managed_objects(bluez, &reply))
|
||||
return;
|
||||
if (!reply)
|
||||
return;
|
||||
|
||||
if (devices)
|
||||
device_info_vector_list_free(devices);
|
||||
devices = device_info_vector_list_new();
|
||||
if (bluez->devices)
|
||||
device_info_vector_list_free(bluez->devices);
|
||||
bluez->devices = device_info_vector_list_new();
|
||||
|
||||
read_scanned_devices(reply);
|
||||
read_scanned_devices(bluez, reply);
|
||||
dbus_message_unref(reply);
|
||||
bluez_dbus_disconnect();
|
||||
bluez_dbus_disconnect(bluez);
|
||||
}
|
||||
|
||||
static void bluez_get_devices (struct string_list* devices_string_list)
|
||||
static void bluez_get_devices (void *data, struct string_list* devices_string_list)
|
||||
{
|
||||
bluez_t *bluez = (bluez_t*)data;
|
||||
unsigned i;
|
||||
union string_list_elem_attr attr;
|
||||
attr.i = 0;
|
||||
|
||||
if (!devices)
|
||||
if (!bluez->devices)
|
||||
return;
|
||||
|
||||
for (i = 0; i < devices->count; i++)
|
||||
for (i = 0; i < bluez->devices->count; i++)
|
||||
{
|
||||
char device[64];
|
||||
strlcpy(device, devices->data[i].name, sizeof(device));
|
||||
strlcpy(device, bluez->devices->data[i].name, sizeof(device));
|
||||
string_list_append(devices_string_list, device, attr);
|
||||
}
|
||||
}
|
||||
|
||||
static bool bluez_device_is_connected (unsigned i)
|
||||
static bool bluez_device_is_connected (void *data, unsigned i)
|
||||
{
|
||||
bluez_t *bluez = (bluez_t*)data;
|
||||
int value;
|
||||
|
||||
if (bluez_cache_counter[i] == 60)
|
||||
if (bluez->bluez_cache_counter[i] == 60)
|
||||
{
|
||||
bluez_cache_counter[i] = 0;
|
||||
bluez_dbus_connect();
|
||||
get_bool_property(devices->data[i].path, "org.bluez.Device1",
|
||||
"Connected", &value);
|
||||
bluez_dbus_disconnect();
|
||||
bluez->bluez_cache_counter[i] = 0;
|
||||
bluez_dbus_connect(bluez);
|
||||
if (get_bool_property(bluez, bluez->devices->data[i].path,
|
||||
"org.bluez.Device1", "Connected", &value))
|
||||
{
|
||||
/* Device disappeared */
|
||||
value = false;
|
||||
}
|
||||
bluez_dbus_disconnect(bluez);
|
||||
|
||||
bluez_cache[i] = value;
|
||||
bluez->bluez_cache[i] = value;
|
||||
return value;
|
||||
}
|
||||
|
||||
bluez_cache_counter[i]++;
|
||||
return bluez_cache[i];
|
||||
bluez->bluez_cache_counter[i]++;
|
||||
return bluez->bluez_cache[i];
|
||||
}
|
||||
|
||||
static void bluez_device_get_sublabel(char *s, unsigned i, size_t len)
|
||||
static void bluez_device_get_sublabel(void *data, char *s, unsigned i, size_t len)
|
||||
{
|
||||
strlcpy(s, devices->data[i].address, len);
|
||||
bluez_t *bluez = (bluez_t*)data;
|
||||
strlcpy(s, bluez->devices->data[i].address, len);
|
||||
}
|
||||
|
||||
static bool bluez_connect_device(unsigned i)
|
||||
static bool bluez_connect_device(void *data, unsigned i)
|
||||
{
|
||||
bluez_dbus_connect();
|
||||
bluez_t *bluez = (bluez_t*)data;
|
||||
bluez_dbus_connect(bluez);
|
||||
|
||||
/* Remove the device */
|
||||
device_remove(devices->data[i].path);
|
||||
/* Trust the device */
|
||||
if (set_bool_property(devices->data[i].path,
|
||||
if (set_bool_property(bluez, bluez->devices->data[i].path,
|
||||
"org.bluez.Device1", "Trusted", 1))
|
||||
return false;
|
||||
/* Pair the device */
|
||||
if (device_method(devices->data[i].path, "Pair"))
|
||||
return false;
|
||||
device_method(bluez, bluez->devices->data[i].path, "Pair");
|
||||
/* Can be "Already Exists" */
|
||||
/* Connect the device */
|
||||
if (device_method(devices->data[i].path, "Connect"))
|
||||
if (device_method(bluez, bluez->devices->data[i].path, "Connect"))
|
||||
return false;
|
||||
|
||||
bluez_dbus_disconnect();
|
||||
bluez_cache_counter[i] = 0;
|
||||
bluez_dbus_disconnect(bluez);
|
||||
bluez->bluez_cache_counter[i] = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
bluetooth_driver_t bluetooth_bluez = {
|
||||
bluez_init,
|
||||
bluez_free,
|
||||
bluez_start,
|
||||
bluez_stop,
|
||||
bluez_scan,
|
||||
bluez_get_devices,
|
||||
bluez_device_is_connected,
|
||||
|
82
retroarch.c
82
retroarch.c
@ -877,8 +877,6 @@ static hid_driver_t *hid_drivers[] = {
|
||||
static bluetooth_driver_t bluetooth_null = {
|
||||
NULL, /* init */
|
||||
NULL, /* free */
|
||||
NULL, /* start */
|
||||
NULL, /* stop */
|
||||
NULL, /* scan */
|
||||
NULL, /* get_devices */
|
||||
NULL, /* device_is_connected */
|
||||
@ -20471,31 +20469,46 @@ const char* config_get_bluetooth_driver_options(void)
|
||||
void driver_bluetooth_scan(void)
|
||||
{
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
p_rarch->bluetooth_driver->scan();
|
||||
if ( (p_rarch->bluetooth_driver_active) &&
|
||||
(p_rarch->bluetooth_driver->scan) )
|
||||
p_rarch->bluetooth_driver->scan(p_rarch->bluetooth_data);
|
||||
}
|
||||
|
||||
void driver_bluetooth_get_devices(struct string_list* devices)
|
||||
{
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
p_rarch->bluetooth_driver->get_devices(devices);
|
||||
if ( (p_rarch->bluetooth_driver_active) &&
|
||||
(p_rarch->bluetooth_driver->get_devices) )
|
||||
p_rarch->bluetooth_driver->get_devices(p_rarch->bluetooth_data, devices);
|
||||
}
|
||||
|
||||
bool driver_bluetooth_device_is_connected(unsigned i)
|
||||
{
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
return p_rarch->bluetooth_driver->device_is_connected(i);
|
||||
if ( (p_rarch->bluetooth_driver_active) &&
|
||||
(p_rarch->bluetooth_driver->device_is_connected) )
|
||||
{
|
||||
return p_rarch->bluetooth_driver->device_is_connected(p_rarch->bluetooth_data, i);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void driver_bluetooth_device_get_sublabel(char *s, unsigned i, size_t len)
|
||||
{
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
p_rarch->bluetooth_driver->device_get_sublabel(s, i, len);
|
||||
if ( (p_rarch->bluetooth_driver_active) &&
|
||||
(p_rarch->bluetooth_driver->device_get_sublabel) )
|
||||
p_rarch->bluetooth_driver->device_get_sublabel(p_rarch->bluetooth_data, s, i, len);
|
||||
}
|
||||
|
||||
bool driver_bluetooth_connect_device(unsigned i)
|
||||
{
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
return p_rarch->bluetooth_driver->connect_device(i);
|
||||
if (p_rarch->bluetooth_driver_active)
|
||||
return p_rarch->bluetooth_driver->connect_device(p_rarch->bluetooth_data, i);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
bool bluetooth_driver_ctl(enum rarch_bluetooth_ctl_state state, void *data)
|
||||
@ -20506,12 +20519,9 @@ bool bluetooth_driver_ctl(enum rarch_bluetooth_ctl_state state, void *data)
|
||||
switch (state)
|
||||
{
|
||||
case RARCH_BLUETOOTH_CTL_DESTROY:
|
||||
p_rarch->bluetooth_driver_active = false;
|
||||
p_rarch->bluetooth_driver = NULL;
|
||||
p_rarch->bluetooth_data = NULL;
|
||||
break;
|
||||
case RARCH_BLUETOOTH_CTL_SET_ACTIVE:
|
||||
p_rarch->bluetooth_driver_active = true;
|
||||
p_rarch->bluetooth_driver_active = false;
|
||||
break;
|
||||
case RARCH_BLUETOOTH_CTL_FIND_DRIVER:
|
||||
{
|
||||
@ -20548,11 +20558,6 @@ bool bluetooth_driver_ctl(enum rarch_bluetooth_ctl_state state, void *data)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RARCH_BLUETOOTH_CTL_UNSET_ACTIVE:
|
||||
p_rarch->bluetooth_driver_active = false;
|
||||
break;
|
||||
case RARCH_BLUETOOTH_CTL_IS_ACTIVE:
|
||||
return p_rarch->bluetooth_driver_active;
|
||||
case RARCH_BLUETOOTH_CTL_DEINIT:
|
||||
if (p_rarch->bluetooth_data && p_rarch->bluetooth_driver)
|
||||
{
|
||||
@ -20561,29 +20566,7 @@ bool bluetooth_driver_ctl(enum rarch_bluetooth_ctl_state state, void *data)
|
||||
}
|
||||
|
||||
p_rarch->bluetooth_data = NULL;
|
||||
break;
|
||||
case RARCH_BLUETOOTH_CTL_STOP:
|
||||
if ( p_rarch->bluetooth_driver
|
||||
&& p_rarch->bluetooth_driver->stop
|
||||
&& p_rarch->bluetooth_data)
|
||||
p_rarch->bluetooth_driver->stop(p_rarch->bluetooth_data);
|
||||
break;
|
||||
case RARCH_BLUETOOTH_CTL_START:
|
||||
if ( p_rarch->bluetooth_driver
|
||||
&& p_rarch->bluetooth_data
|
||||
&& p_rarch->bluetooth_driver->start)
|
||||
{
|
||||
bool bluetooth_allow = settings->bools.bluetooth_allow;
|
||||
if (bluetooth_allow)
|
||||
return p_rarch->bluetooth_driver->start(p_rarch->bluetooth_data);
|
||||
}
|
||||
return false;
|
||||
case RARCH_BLUETOOTH_CTL_SET_CB:
|
||||
{
|
||||
/*struct retro_bluetooth_callback *cb =
|
||||
(struct retro_bluetooth_callback*)data;
|
||||
bluetooth_cb = *cb;*/
|
||||
}
|
||||
p_rarch->bluetooth_driver_active = false;
|
||||
break;
|
||||
case RARCH_BLUETOOTH_CTL_INIT:
|
||||
/* Resource leaks will follow if bluetooth is initialized twice. */
|
||||
@ -20592,16 +20575,20 @@ bool bluetooth_driver_ctl(enum rarch_bluetooth_ctl_state state, void *data)
|
||||
|
||||
bluetooth_driver_ctl(RARCH_BLUETOOTH_CTL_FIND_DRIVER, NULL);
|
||||
|
||||
p_rarch->bluetooth_data = p_rarch->bluetooth_driver->init();
|
||||
|
||||
if (!p_rarch->bluetooth_data)
|
||||
if (p_rarch->bluetooth_driver && p_rarch->bluetooth_driver->init)
|
||||
{
|
||||
RARCH_ERR("Failed to initialize bluetooth driver. Will continue without bluetooth.\n");
|
||||
bluetooth_driver_ctl(RARCH_BLUETOOTH_CTL_UNSET_ACTIVE, NULL);
|
||||
p_rarch->bluetooth_driver_active = true;
|
||||
p_rarch->bluetooth_data = p_rarch->bluetooth_driver->init();
|
||||
|
||||
if (!p_rarch->bluetooth_data)
|
||||
{
|
||||
RARCH_ERR("Failed to initialize bluetooth driver. Will continue without bluetooth.\n");
|
||||
p_rarch->bluetooth_driver_active = false;
|
||||
}
|
||||
} else {
|
||||
p_rarch->bluetooth_driver_active = false;
|
||||
}
|
||||
|
||||
/*if (bluetooth_cb.initialized)
|
||||
bluetooth_cb.initialized();*/
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -33813,6 +33800,9 @@ static void drivers_init(struct rarch_state *p_rarch, int flags)
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & DRIVER_BLUETOOTH_MASK)
|
||||
bluetooth_driver_ctl(RARCH_BLUETOOTH_CTL_INIT, NULL);
|
||||
|
||||
if (flags & DRIVER_LOCATION_MASK)
|
||||
{
|
||||
/* Only initialize location driver if we're ever going to use it. */
|
||||
|
Loading…
Reference in New Issue
Block a user