/*
|
* BlueALSA - bluealsa.h
|
* Copyright (c) 2016-2018 Arkadiusz Bokowy
|
*
|
* This file is a part of bluez-alsa.
|
*
|
* This project is licensed under the terms of the MIT license.
|
*
|
*/
|
|
#ifndef BLUEALSA_BLUEALSA_H
|
#define BLUEALSA_BLUEALSA_H
|
|
#if HAVE_CONFIG_H
|
# include "config.h"
|
#endif
|
|
#include <poll.h>
|
#include <pthread.h>
|
#include <stdbool.h>
|
|
#include <bluetooth/bluetooth.h>
|
#include <bluetooth/hci.h>
|
|
#include <glib.h>
|
#include <gio/gio.h>
|
|
#include "bluez.h"
|
#include "bluez-a2dp.h"
|
#include "shared/ctl-proto.h"
|
|
/* Maximal number of clients connected to the controller. */
|
#define BLUEALSA_MAX_CLIENTS 7
|
|
/* Indexes of special file descriptors in the poll array. */
|
#define CTL_IDX_SRV 0
|
#define CTL_IDX_EVT 1
|
#define __CTL_IDX_MAX 2
|
|
struct ba_config {
|
|
/* used HCI device */
|
struct hci_dev_info hci_dev;
|
|
/* set of enabled profiles */
|
struct {
|
bool a2dp_source;
|
bool a2dp_sink;
|
bool hsp_hs;
|
bool hsp_ag;
|
bool hfp_hf;
|
bool hfp_ag;
|
} enable;
|
|
/* established D-Bus connection */
|
GDBusConnection *dbus;
|
|
/* used for main thread identification */
|
pthread_t main_thread;
|
|
/* collection of connected devices */
|
pthread_mutex_t devices_mutex;
|
GHashTable *devices;
|
|
/* registered D-Bus objects */
|
GHashTable *dbus_objects;
|
|
/* audio group ID */
|
gid_t gid_audio;
|
|
struct {
|
|
pthread_t thread;
|
bool socket_created;
|
bool thread_created;
|
|
struct pollfd pfds[__CTL_IDX_MAX + BLUEALSA_MAX_CLIENTS];
|
/* event subscriptions for connected clients */
|
enum ba_event subs[BLUEALSA_MAX_CLIENTS];
|
|
/* PIPE for transferring events */
|
int evt[2];
|
|
} ctl;
|
|
struct {
|
/* set of features exposed via Service Discovery */
|
int features_sdp_hf;
|
int features_sdp_ag;
|
/* set of features exposed via RFCOMM connection */
|
int features_rfcomm_hf;
|
int features_rfcomm_ag;
|
} hfp;
|
|
struct {
|
|
/* NULL-terminated list of available A2DP codecs */
|
const struct bluez_a2dp_codec **codecs;
|
|
/* Control audio volume natively by the connected device. The disadvantage
|
* of this control type is a monophonic volume change. */
|
bool volume;
|
|
/* Support for monophonic sound in the A2DP profile is mandatory for
|
* sink and semi-mandatory for source. So, if one wants only the bare
|
* minimum, it would be possible - e.g. due to bandwidth limitations. */
|
bool force_mono;
|
/* The sampling rates of 44.1 kHz (aka Audio CD) and 48 kHz are mandatory
|
* for sink endpoint and semi-mandatory for source. It is then possible
|
* to force lower sampling in order to save Bluetooth bandwidth. */
|
bool force_44100;
|
|
/* The number of seconds for keeping A2DP transport alive after PCM has
|
* been closed. One might set this value to negative number for infinite
|
* time. This option applies for the source profile only. */
|
int keep_alive;
|
|
} a2dp;
|
|
#if ENABLE_AAC
|
bool aac_afterburner;
|
uint8_t aac_vbr_mode;
|
#endif
|
|
#if ENABLE_LDAC
|
bool ldac_abr;
|
uint8_t ldac_eqmid;
|
#endif
|
|
};
|
|
/* Structure describing registered D-Bus object. */
|
struct ba_dbus_object {
|
/* D-Bus object registration ID */
|
unsigned int id;
|
enum bluetooth_profile profile;
|
uint16_t codec;
|
/* determine whether profile is used */
|
bool connected;
|
};
|
|
/* Global BlueALSA configuration. */
|
extern struct ba_config config;
|
|
int bluealsa_config_init(void);
|
void bluealsa_config_free(void);
|
|
#endif
|