--- /dev/null
+// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <string.h>
+#include "esp_err.h"
+#include "esp_avrc_api.h"
+#include "esp_bt_main.h"
+#include "btc_manage.h"
+#include "btc_avrc.h"
+
+esp_err_t esp_avrc_ct_register_callback(esp_avrc_ct_cb_t callback)
+{
+ if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
+ if (callback == NULL) {
+ return ESP_FAIL;
+ }
+
+ btc_profile_cb_set(BTC_PID_AVRC, callback);
+ return ESP_OK;
+}
+
+esp_err_t esp_avrc_ct_init(void)
+{
+ if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
+ btc_msg_t msg;
+
+ msg.sig = BTC_SIG_API_CALL;
+ msg.pid = BTC_PID_AVRC;
+ msg.act = BTC_AVRC_CTRL_API_INIT_EVT;
+
+ /* Switch to BTC context */
+ bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
+ return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
+}
+
+esp_err_t esp_avrc_ct_deinit(void)
+{
+ if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
+ btc_msg_t msg;
+
+ msg.sig = BTC_SIG_API_CALL;
+ msg.pid = BTC_PID_AVRC;
+ msg.act = BTC_AVRC_CTRL_API_DEINIT_EVT;
+
+ /* Switch to BTC context */
+ bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL);
+ return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
+}
+
+esp_err_t esp_avrc_ct_send_passthrough_cmd(uint8_t tl, uint8_t key_code, uint8_t key_state)
+{
+ if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
+ btc_msg_t msg;
+ msg.sig = BTC_SIG_API_CALL;
+ msg.pid = BTC_PID_AVRC;
+ msg.act = BTC_AVRC_CTRL_API_SND_PTCMD_EVT;
+
+ btc_avrc_args_t arg;
+ memset(&arg, 0, sizeof(btc_avrc_args_t));
+
+ arg.pt_cmd.tl = tl;
+ arg.pt_cmd.key_code = key_code;
+ arg.pt_cmd.key_state = key_state;
+
+ /* Switch to BTC context */
+ bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_avrc_args_t), NULL);
+ return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
+}
#include "btc_util.h"
#include "btc_av.h"
#include "btc_avrc.h"
+#include "btc_manage.h"
#include "uinput.h"
#include "esp_avrc_api.h"
******************************************************************************/
static btc_rc_cb_t btc_rc_vb;
static btrc_callbacks_t *bt_rc_callbacks = NULL;
-// static btrc_ctrl_callbacks_t *bt_rc_ctrl_callbacks = NULL;
-static esp_avrc_ct_cb_t bt_rc_ctrl_callback = NULL;
-
-// TODO: need protection against race
-#define BTC_AVRC_CT_CB_TO_APP(_event, _param) do { \
- if (bt_rc_ctrl_callback) { \
- bt_rc_ctrl_callback(_event, _param); \
- } \
- } while (0)
/*****************************************************************************
** Static functions
/*****************************************************************************
** Local uinput helper functions
******************************************************************************/
+static inline void btc_avrc_ct_cb_to_app(esp_avrc_ct_cb_event_t event, esp_avrc_ct_cb_param_t *param)
+{
+ esp_a2d_cb_t btc_avrc_cb = (esp_a2d_cb_t)btc_profile_cb_get(BTC_PID_AVRC);
+ if (btc_avrc_cb) {
+ btc_avrc_cb(event, param);
+ }
+}
+
void send_key (int fd, uint16_t key, int pressed)
{
LOG_DEBUG("%s fd:%d key:%u pressed:%d, func not implemented", __FUNCTION__,
param.conn_stat.connected = true;
param.conn_stat.feat_mask = btc_rc_vb.rc_features;
memcpy(param.conn_stat.remote_bda, &rc_addr, sizeof(esp_bd_addr_t));
- BTC_AVRC_CT_CB_TO_APP(ESP_AVRC_CT_CONNECTION_STATE_EVT, ¶m);
+ btc_avrc_ct_cb_to_app(ESP_AVRC_CT_CONNECTION_STATE_EVT, ¶m);
}
#endif
}
memset(¶m, 0, sizeof(esp_avrc_ct_cb_param_t));
param.conn_stat.connected = false;
memcpy(param.conn_stat.remote_bda, &rc_addr, sizeof(esp_bd_addr_t));
- BTC_AVRC_CT_CB_TO_APP(ESP_AVRC_CT_CONNECTION_STATE_EVT, ¶m);
+ btc_avrc_ct_cb_to_app(ESP_AVRC_CT_CONNECTION_STATE_EVT, ¶m);
}
#endif
}
param.psth_rsp.tl = p_remote_rsp->label;
param.psth_rsp.key_code = p_remote_rsp->rc_id;
param.psth_rsp.key_state = key_state;
- BTC_AVRC_CT_CB_TO_APP(ESP_AVRC_CT_PASSTHROUGH_RSP_EVT, ¶m);
+ btc_avrc_ct_cb_to_app(ESP_AVRC_CT_PASSTHROUGH_RSP_EVT, ¶m);
} while (0);
}
else
** AVRCP API Functions
************************************************************************************/
+#if 0
/*******************************************************************************
**
** Function esp_avrc_ct_register_callback
bt_rc_ctrl_callback = callback;
return ESP_OK;
}
-
+#endif
/*******************************************************************************
**
-** Function esp_avrc_ct_init
+** Function btc_avrc_ct_init
**
** Description Initializes the AVRC interface
**
** Returns esp_err_t
**
*******************************************************************************/
-esp_err_t esp_avrc_ct_init(void)
+static void btc_avrc_ct_init(void)
{
LOG_INFO("## %s ##", __FUNCTION__);
- esp_err_t result = ESP_OK;
memset (&btc_rc_vb, 0, sizeof(btc_rc_vb));
btc_rc_vb.rc_vol_label=MAX_LABEL;
btc_rc_vb.rc_volume=MAX_VOLUME;
lbl_init();
-
- return result;
}
** Returns void
**
***************************************************************************/
-void esp_avrc_ct_deinit(void)
+static void btc_avrc_ct_deinit(void)
{
LOG_INFO("## %s ##", __FUNCTION__);
- if (bt_rc_ctrl_callback)
- {
- bt_rc_ctrl_callback = NULL;
- }
memset(&btc_rc_vb, 0, sizeof(btc_rc_cb_t));
lbl_destroy();
LOG_INFO("## %s ## completed", __FUNCTION__);
}
-esp_err_t esp_avrc_ct_send_passthrough_cmd(uint8_t tl, uint8_t key_code, uint8_t key_state)
+static bt_status_t btc_avrc_ct_send_passthrough_cmd(uint8_t tl, uint8_t key_code, uint8_t key_state)
{
tAVRC_STS status = BT_STATUS_UNSUPPORTED;
if (tl >= 16 ||
LOG_DEBUG("%s: feature not enabled", __FUNCTION__);
#endif
- switch (status) {
- case BT_STATUS_SUCCESS: return ESP_OK;
- case BT_STATUS_UNSUPPORTED: return ESP_ERR_NOT_SUPPORTED;
- default: return ESP_FAIL;
- }
+ return status;
}
/*******************************************************************************
{
pthread_mutex_destroy(&(device.lbllock));
}
+
+void btc_avrc_evt_handler(btc_msg_t *msg)
+{
+ btc_avrc_args_t *arg = (btc_avrc_args_t *)(msg->arg);
+ switch (msg->act) {
+ case BTC_AVRC_CTRL_API_INIT_EVT: {
+ btc_avrc_ct_init();
+ // todo: callback to application
+ break;
+ }
+ case BTC_AVRC_CTRL_API_DEINIT_EVT: {
+ btc_avrc_ct_deinit();
+ // todo: callback to application
+ break;
+ }
+ case BTC_AVRC_CTRL_API_SND_PTCMD_EVT: {
+ btc_avrc_ct_send_passthrough_cmd(arg->pt_cmd.tl, arg->pt_cmd.key_code, arg->pt_cmd.key_state);
+ // todo: callback to application
+ break;
+ }
+ default:
+ LOG_WARN("%s : unhandled event: %d\n", __FUNCTION__, msg->act);
+ }
+}
uint8_t attr_values[BTRC_MAX_APP_SETTINGS];
} btrc_player_settings_t;
+typedef enum {
+ BTC_AVRC_CTRL_API_INIT_EVT = 0,
+ BTC_AVRC_CTRL_API_DEINIT_EVT,
+ BTC_AVRC_CTRL_API_SND_PTCMD_EVT
+} btc_avrc_act_t;
+
+typedef struct {
+ uint8_t tl; /* transaction label */
+ uint8_t key_code;
+ uint8_t key_state;
+} pt_cmd_t;
+
+/* btc_avrc_args_t */
+typedef union {
+ // BTC_AVRC_CTRL_API_SND_PT_CMD_EVT
+ struct {
+ uint8_t tl;
+ uint8_t key_code;
+ uint8_t key_state;
+ } pt_cmd;
+} btc_avrc_args_t;
+
typedef union
{
btrc_play_status_t play_status;
} btrc_interface_t;
+/** BT-RC Controller callback structure. */
+
typedef void (* btrc_passthrough_rsp_callback) (int id, int key_state);
typedef void (* btrc_connection_state_callback) (bool state, bt_bdaddr_t *bd_addr);
-/** BT-RC Controller callback structure. */
-typedef struct {
- /** set to sizeof(BtRcCallbacks) */
- size_t size;
- btrc_passthrough_rsp_callback passthrough_rsp_cb;
- btrc_connection_state_callback connection_state_cb;
-} btrc_ctrl_callbacks_t;
-
void btc_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data);
BOOLEAN btc_rc_get_connected_peer(BD_ADDR peer_addr);
void btc_rc_check_handle_pending_play (BD_ADDR peer_addr, BOOLEAN bSendToApp);
+
+/*******************************************************************************
+** BTC AVRC API
+********************************************************************************/
+void btc_avrc_evt_handler(btc_msg_t *msg);
+
#endif /* __BTC_AVRC_H__ */