diff --git a/src/classic/avrcp_browsing_controller.c b/src/classic/avrcp_browsing_controller.c index d23966fd6..64bc49140 100644 --- a/src/classic/avrcp_browsing_controller.c +++ b/src/classic/avrcp_browsing_controller.c @@ -251,6 +251,15 @@ static void avrcp_browser_packet_handler(uint8_t packet_type, uint16_t channel, static int avrcp_browsing_controller_send_get_folder_items_cmd(uint16_t cid, avrcp_browsing_connection_t * connection){ uint8_t command[100]; int pos = 0; + + // // if (connection->cmd_operands[3] == AVRCP_PDU_ID_GET_CAPABILITIES){ + // printf("cheet\n"); + // uint8_t buffer[] = {0xB0, 0x11, 0x0E, 0xFF, 0x00, 0x02, 0xFF, 0xFF}; + // memcpy(command, buffer, sizeof(buffer)); + // pos = sizeof(buffer); + // return l2cap_send(cid, command, pos); + // // } + // transport header // Transaction label | Packet_type | C/R | IPID (1 == invalid profile identifier) command[pos++] = (connection->transaction_label << 4) | (AVRCP_SINGLE_PACKET << 2) | (AVRCP_COMMAND_FRAME << 1) | 0; @@ -294,6 +303,7 @@ static int avrcp_browsing_controller_send_get_folder_items_cmd(uint16_t cid, avr bit_position++; } + return l2cap_send(cid, command, pos); } @@ -578,10 +588,12 @@ static void avrcp_browsing_controller_packet_handler(uint8_t packet_type, uint16 case L2CAP_DATA_PACKET:{ browsing_connection = get_avrcp_browsing_connection_for_l2cap_cid(channel, &avrcp_controller_context); if (!browsing_connection) break; + printf("received \n"); + printf_hexdump(packet,size); int pos = 0; uint8_t transport_header = packet[pos++]; // Transaction label | Packet_type | C/R | IPID (1 == invalid profile identifier) - // uint8_t transaction_label = transport_header >> 4; + browsing_connection->transaction_label = transport_header >> 4; avrcp_packet_type_t avctp_packet_type = (transport_header & 0x0F) >> 2; // printf("L2CAP_DATA_PACKET, packet type %d\n", avctp_packet_type); switch (avctp_packet_type){ diff --git a/src/classic/avrcp_browsing_target.c b/src/classic/avrcp_browsing_target.c index 3f1dd3995..36a732dd6 100644 --- a/src/classic/avrcp_browsing_target.c +++ b/src/classic/avrcp_browsing_target.c @@ -57,43 +57,27 @@ static void avrcp_browsing_target_request_can_send_now(avrcp_browsing_connection } static int avrcp_browsing_target_handle_can_send_now(avrcp_browsing_connection_t * connection){ - int pos = 0; - l2cap_reserve_packet_buffer(); - uint8_t * packet = l2cap_get_outgoing_buffer(); - - // transport header - // Transaction label | Packet_type | C/R | IPID (1 == invalid profile identifier) - - // TODO: check for fragmentation + // l2cap_reserve_packet_buffer(); + // uint8_t * packet = l2cap_get_outgoing_buffer(); + uint8_t packet[100]; connection->packet_type = AVRCP_SINGLE_PACKET; - printf("ttransaction %d \n", connection->transaction_label); + packet[pos++] = (connection->transaction_label << 4) | (connection->packet_type << 2) | (AVRCP_RESPONSE_FRAME << 1) | 0; // Profile IDentifier (PID) packet[pos++] = BLUETOOTH_SERVICE_CLASS_AV_REMOTE_CONTROL >> 8; packet[pos++] = BLUETOOTH_SERVICE_CLASS_AV_REMOTE_CONTROL & 0x00FF; - // command_type - // packet[pos++] = connection->command_type; - // // subunit_type | subunit ID - // packet[pos++] = (connection->subunit_type << 3) | connection->subunit_id; - // // opcode - // packet[pos++] = (uint8_t)connection->command_opcode; - // operands - // company id is 3 bytes long - // big_endian_store_24(packet, pos, BT_SIG_COMPANY_ID); - // pos += 3; memcpy(packet+pos, connection->cmd_operands, connection->cmd_operands_length); // printf_hexdump(packet+pos, connection->cmd_operands_length); pos += connection->cmd_operands_length; connection->wait_to_send = 0; - printf(" send reject \n"); - printf_hexdump(packet, pos); - return l2cap_send_prepared(connection->l2cap_browsing_cid, pos); + // return l2cap_send_prepared(connection->l2cap_browsing_cid, pos); + return l2cap_send(connection->l2cap_browsing_cid, packet, pos); } -static uint8_t avrcp_browsing_target_response_reject(avrcp_browsing_connection_t * connection, avrcp_status_code_t status){ +static uint8_t avrcp_browsing_target_response_general_reject(avrcp_browsing_connection_t * connection, avrcp_status_code_t status){ // AVRCP_CTYPE_RESPONSE_REJECTED int pos = 0; connection->cmd_operands[pos++] = AVRCP_PDU_ID_GENERAL_REJECT; @@ -386,9 +370,9 @@ static void avrcp_browsing_target_packet_handler(uint8_t packet_type, uint16_t c switch (avctp_packet_type){ case AVRCP_SINGLE_PACKET: case AVRCP_END_PACKET: - printf("send avrcp_browsing_target_response_reject\n"); + printf("send avrcp_browsing_target_response_general_reject\n"); browsing_connection->state = AVCTP_CONNECTION_OPENED; - avrcp_browsing_target_response_reject(browsing_connection, AVRCP_STATUS_INVALID_COMMAND); + avrcp_browsing_target_response_general_reject(browsing_connection, AVRCP_STATUS_INVALID_COMMAND); // avrcp_browsing_target_emit_done_with_uid_counter(avrcp_target_context.browsing_avrcp_callback, channel, browsing_connection->uid_counter, browsing_connection->browsing_status, ERROR_CODE_SUCCESS); break; default: