avrcp_target: implement response for add to now playing cmd

This commit is contained in:
Milanka Ringwald 2024-11-13 16:59:40 +01:00 committed by Matthias Ringwald
parent 25c2629806
commit 163cc38682
2 changed files with 48 additions and 15 deletions

View File

@ -145,6 +145,27 @@ static void avrcp_target_emit_respond_play_item(btstack_packet_handler_t callbac
(*callback)(HCI_EVENT_PACKET, 0, event, pos);
}
static void avrcp_target_emit_add_to_now_playing_item(btstack_packet_handler_t callback, uint16_t avrcp_cid, uint16_t uid_counter, avrcp_browsing_scope_t scope, uint8_t * uid){
btstack_assert(callback != NULL);
uint8_t event[16];
int pos = 0;
event[pos++] = HCI_EVENT_AVRCP_META;
event[pos++] = sizeof(event) - 2;
event[pos++] = AVRCP_SUBEVENT_ADD_TO_NOW_PLAYING;
little_endian_store_16(event, pos, avrcp_cid);
pos += 2;
little_endian_store_16(event, pos, uid_counter);
pos += 2;
event[pos++] = (uint8_t) scope;
memcpy(&event[pos], uid, 8);
pos += 8;
(*callback)(HCI_EVENT_PACKET, 0, event, pos);
}
// returns number of bytes stored
static uint16_t avrcp_target_pack_single_element_header(uint8_t * buffer, avrcp_media_attribute_id_t attr_id, uint16_t attr_value_size){
btstack_assert(attr_id > AVRCP_MEDIA_ATTR_ALL);
@ -1106,6 +1127,24 @@ static void avrcp_handle_l2cap_data_packet_for_signaling_connection(avrcp_connec
pos += 2;
// pos = 13
switch (pdu_id){
case AVRCP_PDU_ID_ADD_TO_NOW_PLAYING:
if ( (pos + 11) > size){
avrcp_target_vendor_dependent_response_accept(connection, pdu_id, AVRCP_STATUS_INVALID_COMMAND);
return;
}
connection->target_scope = packet[pos++];
if (connection->target_scope >= AVRCP_BROWSING_RFU){
avrcp_target_vendor_dependent_response_accept(connection, pdu_id, AVRCP_STATUS_INVALID_PARAMETER);
return;
}
memcpy(connection->target_track_id, &packet[pos], 8);
pos += 8;
connection->target_uid_counter = big_endian_read_16(packet,pos);
connection->state = AVCTP_W2_CHECK_DATABASE;
avrcp_target_emit_add_to_now_playing_item(avrcp_target_context.avrcp_callback, connection->avrcp_cid, connection->target_uid_counter, connection->target_scope,connection->target_track_id);
break;
case AVRCP_PDU_ID_PLAY_ITEM:
if ( (pos + 11) > size){
avrcp_target_vendor_dependent_response_accept(connection, pdu_id, AVRCP_STATUS_INVALID_COMMAND);
@ -1496,8 +1535,7 @@ void avrcp_target_register_set_addressed_player_handler(bool (*callback)(uint16_
avrcp_target_context.set_addressed_player_callback = callback;
}
uint8_t avrcp_target_send_response_for_play_item_cmd(uint16_t avrcp_cid, avrcp_status_code_t status){
static uint8_t avrcp_target_send_status_response(uint16_t avrcp_cid, avrcp_pdu_id_t pdu_id, avrcp_status_code_t status){
avrcp_connection_t * connection = avrcp_get_connection_for_avrcp_cid_for_role(avrcp_cid, AVRCP_TARGET);
if (connection == NULL){
return ERROR_CODE_COMMAND_DISALLOWED;
@ -1506,21 +1544,15 @@ uint8_t avrcp_target_send_response_for_play_item_cmd(uint16_t avrcp_cid, avrcp_s
return ERROR_CODE_COMMAND_DISALLOWED;
}
if (status != AVRCP_STATUS_SUCCESS){
return avrcp_target_response_vendor_dependent_reject(connection, AVRCP_PDU_ID_PLAY_ITEM, status);
return avrcp_target_response_vendor_dependent_reject(connection, pdu_id, status);
}
return avrcp_target_vendor_dependent_response_accept(connection, AVRCP_PDU_ID_PLAY_ITEM, status);
return avrcp_target_vendor_dependent_response_accept(connection, pdu_id, status);
}
uint8_t avrcp_target_send_response_for_play_item_cmd(uint16_t avrcp_cid, avrcp_status_code_t status){
return avrcp_target_send_status_response(avrcp_cid, AVRCP_PDU_ID_PLAY_ITEM, status);
}
uint8_t avrcp_target_send_response_for_add_to_now_playing_cmd(uint16_t avrcp_cid, avrcp_status_code_t status){
avrcp_connection_t * connection = avrcp_get_connection_for_avrcp_cid_for_role(avrcp_cid, AVRCP_TARGET);
if (connection == NULL){
return ERROR_CODE_COMMAND_DISALLOWED;
}
if (connection->state != AVCTP_W2_CHECK_DATABASE){
return ERROR_CODE_COMMAND_DISALLOWED;
}
if (status != AVRCP_STATUS_SUCCESS){
return avrcp_target_response_vendor_dependent_reject(connection, AVRCP_PDU_ID_PLAY_ITEM, status);
}
return avrcp_target_vendor_dependent_response_accept(connection, AVRCP_PDU_ID_PLAY_ITEM, status);
return avrcp_target_send_status_response(avrcp_cid, AVRCP_PDU_ID_ADD_TO_NOW_PLAYING, status);
}

View File

@ -239,6 +239,7 @@ uint8_t avrcp_target_operation_not_implemented(uint16_t avrcp_cid, avrcp_operati
uint8_t avrcp_target_uids_changed(uint16_t avrcp_cid, uint16_t uid_counter);
uint8_t avrcp_target_send_response_for_play_item_cmd(uint16_t avrcp_cid, avrcp_status_code_t status);
uint8_t avrcp_target_send_response_for_add_to_now_playing_cmd(uint16_t avrcp_cid, avrcp_status_code_t status);
/**
* @brief De-Init AVRCP Browsing Target