文档介绍:Android 蓝牙AVRCP功能的实现
作者:Macro Liu
AVRCP的按键定义:
\sdk\emulator\keymaps\
key 200 MEDIA_PLAY_PAUSE WAKE
key 201 MEDIA_PLAY_PAUSE WAKE
key 166 MEDIA_STOP WAKE
key 163 MEDIA_NEXT WAKE
key 165 MEDIA_PREVIOUS WAKE
key 168 MEDIA_REWIND WAKE
key 208 MEDIA_FAST_FORWARD WAKE
BCM()宏定义需要打开:
BOARD_HAVE_BLUETOOTH_BCM := true
BT音频控制的代码
external\bluetooth\bluez\audio\
(1) 按键的MAP
static struct {
const char *name;
uint8_t avrcp;
uint16_t uinput;
} key_map[] = {
{ "PLAY", PLAY_OP, KEY_PLAYCD },
{ "STOP", STOP_OP, KEY_STOPCD },
{ "PAUSE", PAUSE_OP, KEY_PAUSECD },
{ "FORWARD", FORWARD_OP, KEY_NEXTSONG },
{ "BACKWARD", BACKWARD_OP, KEY_PREVIOUSSONG },
{ "REWIND", REWIND_OP, KEY_REWIND },
{ "FAST FORWARD", FAST_FORWARD_OP, KEY_FASTFORWARD },
{ NULL }
};
(2) 按键处理
static void handle_panel_passthrough(struct control *control,
{
…
for (i = 0; key_map[i].name != NULL; i++) {
uint8_t key_quirks;
if ((operands[0] & 0x7F) != key_map[i].avrcp)
continue;
DBG("AVRCP: %s %s", key_map[i].name, status);
key_quirks = control->key_quirks[key_map[i].avrcp];
if (key_quirks & QUIRK_NO_RELEASE) {
if (!pressed) {
DBG("AVRCP: Ignoring release");
break;
}
DBG("AVRCP: treating key press as press + release");
send_key(control->uinput, key_map[i].uinput, 1);
send_key(control->uinput, key_map[i].uinput, 0);
break;
}
send_key(control->u