diff --git a/src/classic/avrcp.c b/src/classic/avrcp.c index 6d0f5a9ca..c27c645dd 100644 --- a/src/classic/avrcp.c +++ b/src/classic/avrcp.c @@ -433,7 +433,7 @@ static void avrcp_press_and_hold_timer_stop(avrcp_connection_t * connection){ btstack_run_loop_remove_timer(&connection->press_and_hold_cmd_timer); } -static void request_pass_through_release_control_cmd(avrcp_connection_t * connection){ +static uint8_t request_pass_through_release_control_cmd(avrcp_connection_t * connection){ connection->state = AVCTP_W2_SEND_RELEASE_COMMAND; switch (connection->cmd_operands[0]){ case AVRCP_OPERATION_ID_REWIND: @@ -446,15 +446,16 @@ static void request_pass_through_release_control_cmd(avrcp_connection_t * connec connection->cmd_operands[0] = 0x80 | connection->cmd_operands[0]; connection->transaction_label++; avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } -static void request_pass_through_press_control_cmd(uint16_t avrcp_cid, avrcp_operation_id_t opid, uint16_t playback_speed){ +static uint8_t request_pass_through_press_control_cmd(uint16_t avrcp_cid, avrcp_operation_id_t opid, uint16_t playback_speed){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_CONNECTION_OPENED) return; + if (connection->state != AVCTP_CONNECTION_OPENED) return ERROR_CODE_COMMAND_DISALLOWED; connection->state = AVCTP_W2_SEND_PRESS_COMMAND; connection->command_opcode = AVRCP_CMD_OPCODE_PASS_THROUGH; connection->command_type = AVRCP_CTYPE_CONTROL; @@ -480,6 +481,7 @@ static void request_pass_through_press_control_cmd(uint16_t avrcp_cid, avrcp_ope } connection->transaction_label++; avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } @@ -1149,13 +1151,13 @@ uint8_t avrcp_connect(bd_addr_t bd_addr, uint16_t * avrcp_cid){ return ERROR_CODE_SUCCESS; } -void avrcp_unit_info(uint16_t avrcp_cid){ +uint8_t avrcp_unit_info(uint16_t avrcp_cid){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_unit_info: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_CONNECTION_OPENED) return; + if (connection->state != AVCTP_CONNECTION_OPENED) return ERROR_CODE_COMMAND_DISALLOWED; connection->state = AVCTP_W2_SEND_COMMAND; connection->transaction_label++; @@ -1166,15 +1168,16 @@ void avrcp_unit_info(uint16_t avrcp_cid){ memset(connection->cmd_operands, 0xFF, connection->cmd_operands_length); connection->cmd_operands_length = 5; avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } -static void avrcp_get_capabilities(uint16_t avrcp_cid, uint8_t capability_id){ +static uint8_t avrcp_get_capabilities(uint16_t avrcp_cid, uint8_t capability_id){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_get_capabilities: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_CONNECTION_OPENED) return; + if (connection->state != AVCTP_CONNECTION_OPENED) return ERROR_CODE_COMMAND_DISALLOWED; connection->state = AVCTP_W2_SEND_COMMAND; connection->transaction_label++; @@ -1189,88 +1192,89 @@ static void avrcp_get_capabilities(uint16_t avrcp_cid, uint8_t capability_id){ connection->cmd_operands[7] = capability_id; // capability ID connection->cmd_operands_length = 8; avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } -void avrcp_get_supported_company_ids(uint16_t avrcp_cid){ - avrcp_get_capabilities(avrcp_cid, AVRCP_CAPABILITY_ID_COMPANY); +uint8_t avrcp_get_supported_company_ids(uint16_t avrcp_cid){ + return avrcp_get_capabilities(avrcp_cid, AVRCP_CAPABILITY_ID_COMPANY); } -void avrcp_get_supported_events(uint16_t avrcp_cid){ - avrcp_get_capabilities(avrcp_cid, AVRCP_CAPABILITY_ID_EVENT); +uint8_t avrcp_get_supported_events(uint16_t avrcp_cid){ + return avrcp_get_capabilities(avrcp_cid, AVRCP_CAPABILITY_ID_EVENT); } -void avrcp_play(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_PLAY, 0); +uint8_t avrcp_play(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_PLAY, 0); } -void avrcp_stop(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_STOP, 0); +uint8_t avrcp_stop(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_STOP, 0); } -void avrcp_pause(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_PAUSE, 0); +uint8_t avrcp_pause(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_PAUSE, 0); } -void avrcp_forward(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_FORWARD, 0); +uint8_t avrcp_forward(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_FORWARD, 0); } -void avrcp_backward(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_BACKWARD, 0); +uint8_t avrcp_backward(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_BACKWARD, 0); } -void avrcp_start_rewind(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_REWIND, 0); +uint8_t avrcp_start_rewind(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_REWIND, 0); } -void avrcp_volume_up(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_VOLUME_UP, 0); +uint8_t avrcp_volume_up(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_VOLUME_UP, 0); } -void avrcp_volume_down(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_VOLUME_DOWN, 0); +uint8_t avrcp_volume_down(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_VOLUME_DOWN, 0); } -void avrcp_mute(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_MUTE, 0); +uint8_t avrcp_mute(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_MUTE, 0); } -void avrcp_skip(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_SKIP, 0); +uint8_t avrcp_skip(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_SKIP, 0); } -void avrcp_stop_rewind(uint16_t avrcp_cid){ +uint8_t avrcp_stop_rewind(uint16_t avrcp_cid){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_stop_rewind: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_W4_STOP) return; - request_pass_through_release_control_cmd(connection); + if (connection->state != AVCTP_W4_STOP) return ERROR_CODE_COMMAND_DISALLOWED; + return request_pass_through_release_control_cmd(connection); } -void avrcp_start_fast_forward(uint16_t avrcp_cid){ - request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_FAST_FORWARD, 0); +uint8_t avrcp_start_fast_forward(uint16_t avrcp_cid){ + return request_pass_through_press_control_cmd(avrcp_cid, AVRCP_OPERATION_ID_FAST_FORWARD, 0); } -void avrcp_stop_fast_forward(uint16_t avrcp_cid){ +uint8_t avrcp_stop_fast_forward(uint16_t avrcp_cid){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_stop_fast_forward: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_W4_STOP) return; - request_pass_through_release_control_cmd(connection); + if (connection->state != AVCTP_W4_STOP) return ERROR_CODE_COMMAND_DISALLOWED; + return request_pass_through_release_control_cmd(connection); } -void avrcp_get_play_status(uint16_t avrcp_cid){ +uint8_t avrcp_get_play_status(uint16_t avrcp_cid){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_get_play_status: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_CONNECTION_OPENED) return; + if (connection->state != AVCTP_CONNECTION_OPENED) return ERROR_CODE_COMMAND_DISALLOWED; connection->state = AVCTP_W2_SEND_COMMAND; connection->transaction_label++; @@ -1284,33 +1288,37 @@ void avrcp_get_play_status(uint16_t avrcp_cid){ big_endian_store_16(connection->cmd_operands, 5, 0); // parameter length connection->cmd_operands_length = 7; avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + + return ERROR_CODE_SUCCESS; } -void avrcp_enable_notification(uint16_t avrcp_cid, avrcp_notification_event_id_t event_id){ +uint8_t avrcp_enable_notification(uint16_t avrcp_cid, avrcp_notification_event_id_t event_id){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_get_play_status: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } avrcp_register_notification(connection, event_id); + return ERROR_CODE_SUCCESS; } -void avrcp_disable_notification(uint16_t avrcp_cid, avrcp_notification_event_id_t event_id){ +uint8_t avrcp_disable_notification(uint16_t avrcp_cid, avrcp_notification_event_id_t event_id){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_get_play_status: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } connection->notifications_to_deregister |= (1 << event_id); + return ERROR_CODE_SUCCESS; } -void avrcp_get_now_playing_info(uint16_t avrcp_cid){ +uint8_t avrcp_get_now_playing_info(uint16_t avrcp_cid){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_get_capabilities: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_CONNECTION_OPENED) return; + if (connection->state != AVCTP_CONNECTION_OPENED) return ERROR_CODE_COMMAND_DISALLOWED; connection->state = AVCTP_W2_SEND_COMMAND; connection->transaction_label++; @@ -1337,16 +1345,16 @@ void avrcp_get_now_playing_info(uint16_t avrcp_cid){ connection->cmd_operands_length = pos; avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); - + return ERROR_CODE_SUCCESS; } -void avrcp_set_absolute_volume(uint16_t avrcp_cid, uint8_t volume){ +uint8_t avrcp_set_absolute_volume(uint16_t avrcp_cid, uint8_t volume){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_get_capabilities: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_CONNECTION_OPENED) return; + if (connection->state != AVCTP_CONNECTION_OPENED) return ERROR_CODE_COMMAND_DISALLOWED; connection->state = AVCTP_W2_SEND_COMMAND; connection->transaction_label++; @@ -1367,15 +1375,16 @@ void avrcp_set_absolute_volume(uint16_t avrcp_cid, uint8_t volume){ connection->cmd_operands_length = pos; avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } -void avrcp_query_shuffle_and_repeat_modes(uint16_t avrcp_cid){ +uint8_t avrcp_query_shuffle_and_repeat_modes(uint16_t avrcp_cid){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_get_capabilities: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_CONNECTION_OPENED) return; + if (connection->state != AVCTP_CONNECTION_OPENED) return ERROR_CODE_COMMAND_DISALLOWED; connection->state = AVCTP_W2_SEND_COMMAND; connection->transaction_label++; @@ -1395,16 +1404,16 @@ void avrcp_query_shuffle_and_repeat_modes(uint16_t avrcp_cid){ connection->cmd_operands[11] = 0x04; // scan (1-off, 2-all tracks, 3-group scan) connection->cmd_operands_length = 12; avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } - -static void avrcp_set_current_player_application_setting_value(uint16_t avrcp_cid, uint8_t attribute_id, uint8_t attribute_value){ +static uint8_t avrcp_set_current_player_application_setting_value(uint16_t avrcp_cid, uint8_t attribute_id, uint8_t attribute_value){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_get_capabilities: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_CONNECTION_OPENED) return; + if (connection->state != AVCTP_CONNECTION_OPENED) return ERROR_CODE_COMMAND_DISALLOWED; connection->state = AVCTP_W2_SEND_COMMAND; connection->transaction_label++; @@ -1426,24 +1435,26 @@ static void avrcp_set_current_player_application_setting_value(uint16_t avrcp_ci connection->cmd_operands[pos++] = attribute_value; connection->cmd_operands_length = pos; avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } -void avrcp_set_shuffle_mode(uint16_t avrcp_cid, avrcp_shuffle_mode_t mode){ - if (mode < AVRCP_SHUFFLE_MODE_OFF || mode > AVRCP_SHUFFLE_MODE_GROUP) return; - avrcp_set_current_player_application_setting_value(avrcp_cid, 0x03, mode); +uint8_t avrcp_set_shuffle_mode(uint16_t avrcp_cid, avrcp_shuffle_mode_t mode){ + if (mode < AVRCP_SHUFFLE_MODE_OFF || mode > AVRCP_SHUFFLE_MODE_GROUP) return ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE; + return avrcp_set_current_player_application_setting_value(avrcp_cid, 0x03, mode); } -void avrcp_set_repeat_mode(uint16_t avrcp_cid, avrcp_repeat_mode_t mode){ - if (mode < AVRCP_REPEAT_MODE_OFF || mode > AVRCP_REPEAT_MODE_GROUP) return; - avrcp_set_current_player_application_setting_value(avrcp_cid, 0x02, mode); +uint8_t avrcp_set_repeat_mode(uint16_t avrcp_cid, avrcp_repeat_mode_t mode){ + if (mode < AVRCP_REPEAT_MODE_OFF || mode > AVRCP_REPEAT_MODE_GROUP) return ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE; + return avrcp_set_current_player_application_setting_value(avrcp_cid, 0x02, mode); } -void avrcp_disconnect(uint16_t avrcp_cid){ +uint8_t avrcp_disconnect(uint16_t avrcp_cid){ avrcp_connection_t * connection = get_avrcp_connection_for_l2cap_signaling_cid(avrcp_cid); if (!connection){ log_error("avrcp_get_capabilities: could not find a connection."); - return; + return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; } - if (connection->state != AVCTP_CONNECTION_OPENED) return; + if (connection->state != AVCTP_CONNECTION_OPENED) return ERROR_CODE_COMMAND_DISALLOWED; l2cap_disconnect(connection->l2cap_signaling_cid, 0); + return ERROR_CODE_SUCCESS; } \ No newline at end of file diff --git a/src/classic/avrcp.h b/src/classic/avrcp.h index bc7b5eae9..45c72cf90 100644 --- a/src/classic/avrcp.h +++ b/src/classic/avrcp.h @@ -46,6 +46,8 @@ #define __AVRCP_H #include +#include "btstack_run_loop.h" +#include "btstack_linked_list.h" #if defined __cplusplus extern "C" { @@ -258,146 +260,197 @@ void avrcp_target_create_sdp_record(uint8_t * service, uint32_t service_record_h void avrcp_init(void); /** - * @brief Register callback for the AVDTP Sink client. + * @brief Register callback for the AVRCP Sink client. * @param callback */ void avrcp_register_packet_handler(btstack_packet_handler_t callback); /** - * @brief Connect to device with a bluetooth address. + * @brief Connect to device with a Bluetooth address. * @param bd_addr * @param avrcp_cid + * @returns status */ uint8_t avrcp_connect(bd_addr_t bd_addr, uint16_t * avrcp_cid); -void avrcp_disconnect(uint16_t avrcp_cid); +/** + * @brief Disconnect from AVRCP target + * @param avrcp_cid + * @returns status + */ +uint8_t avrcp_disconnect(uint16_t avrcp_cid); + /** * @brief Unit info. * @param avrcp_cid + * @returns status */ -void avrcp_unit_info(uint16_t avrcp_cid); +uint8_t avrcp_unit_info(uint16_t avrcp_cid); /** * @brief Get capabilities. * @param avrcp_cid + * @returns status */ -void avrcp_get_supported_company_ids(uint16_t avrcp_cid); -void avrcp_get_supported_events(uint16_t avrcp_cid); +uint8_t avrcp_get_supported_company_ids(uint16_t avrcp_cid); +/** + * @brief Get supported Events. + * @param avrcp_cid + * @returns status + */ +uint8_t avrcp_get_supported_events(uint16_t avrcp_cid); /** * @brief Play. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_play(uint16_t avrcp_cid); +uint8_t avrcp_play(uint16_t avrcp_cid); /** * @brief Stop. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_stop(uint16_t avrcp_cid); +uint8_t avrcp_stop(uint16_t avrcp_cid); /** * @brief Pause. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_pause(uint16_t avrcp_cid); +uint8_t avrcp_pause(uint16_t avrcp_cid); /** - * @brief Fast forward. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. + * @brief Start Fast Forward. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_start_fast_forward(uint16_t avrcp_cid); -void avrcp_stop_fast_forward(uint16_t avrcp_cid); +uint8_t avrcp_start_fast_forward(uint16_t avrcp_cid); /** - * @brief Rewind. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. + * @brief Stop Fast Forward. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_start_rewind(uint16_t avrcp_cid); -void avrcp_stop_rewind(uint16_t avrcp_cid); +uint8_t avrcp_stop_fast_forward(uint16_t avrcp_cid); + +/** + * @brief Stop Rewind. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. + * @param avrcp_cid + * @returns status + */ +uint8_t avrcp_start_rewind(uint16_t avrcp_cid); + +/** + * @brief Stop Rewind. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. + * @param avrcp_cid + * @returns status + */ +uint8_t avrcp_stop_rewind(uint16_t avrcp_cid); /** * @brief Forward. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_forward(uint16_t avrcp_cid); +uint8_t avrcp_forward(uint16_t avrcp_cid); /** * @brief Backward. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_backward(uint16_t avrcp_cid); +uint8_t avrcp_backward(uint16_t avrcp_cid); /** * @brief Get play status. Returns event of type AVRCP_SUBEVENT_PLAY_STATUS (length, position, play_status). * If TG does not support SongLength And SongPosition on TG, then TG shall return 0xFFFFFFFF. * @param avrcp_cid + * @returns status */ -void avrcp_get_play_status(uint16_t avrcp_cid); +uint8_t avrcp_get_play_status(uint16_t avrcp_cid); /** - * @brief Register notification. Response via AVRCP_SUBEVENT_ENABLE_NOTIFICATION_COMPLETE. + * @brief Enable notification. Response via AVRCP_SUBEVENT_ENABLE_NOTIFICATION_COMPLETE. * @param avrcp_cid * @param event_id + * @returns status */ -void avrcp_enable_notification(uint16_t avrcp_cid, avrcp_notification_event_id_t event_id); -void avrcp_disable_notification(uint16_t avrcp_cid, avrcp_notification_event_id_t event_id); +uint8_t avrcp_enable_notification(uint16_t avrcp_cid, avrcp_notification_event_id_t event_id); + +/** + * @brief Disable notification. Response via AVRCP_SUBEVENT_ENABLE_NOTIFICATION_COMPLETE. + * @param avrcp_cid + * @param event_id + * @returns status + */ +uint8_t avrcp_disable_notification(uint16_t avrcp_cid, avrcp_notification_event_id_t event_id); /** * @brief Get info on now playing media. * @param avrcp_cid + * @returns status */ -void avrcp_get_now_playing_info(uint16_t avrcp_cid); +uint8_t avrcp_get_now_playing_info(uint16_t avrcp_cid); /** * @brief Set absolute volume 0-127 (corresponds to 0-100%). Response via AVRCP_SUBEVENT_SET_ABSOLUTE_VOLUME_RESPONSE * @param avrcp_cid + * @returns status */ -void avrcp_set_absolute_volume(uint16_t avrcp_cid, uint8_t volume); +uint8_t avrcp_set_absolute_volume(uint16_t avrcp_cid, uint8_t volume); /** * @brief Turns the volume to high. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_volume_up(uint16_t avrcp_cid); +uint8_t avrcp_volume_up(uint16_t avrcp_cid); /** * @brief Turns the volume to low. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_volume_down(uint16_t avrcp_cid); +uint8_t avrcp_volume_down(uint16_t avrcp_cid); /** * @brief Puts the sound out. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_mute(uint16_t avrcp_cid); +uint8_t avrcp_mute(uint16_t avrcp_cid); /** * @brief Skip to next playing media. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_skip(uint16_t avrcp_cid); +uint8_t avrcp_skip(uint16_t avrcp_cid); /** * @brief Query repeat and shuffle mode. Response via AVRCP_SUBEVENT_SHUFFLE_AND_REPEAT_MODE. * @param avrcp_cid + * @returns status */ -void avrcp_query_shuffle_and_repeat_modes(uint16_t avrcp_cid); +uint8_t avrcp_query_shuffle_and_repeat_modes(uint16_t avrcp_cid); /** * @brief Set shuffle mode. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_set_shuffle_mode(uint16_t avrcp_cid, avrcp_shuffle_mode_t mode); +uint8_t avrcp_set_shuffle_mode(uint16_t avrcp_cid, avrcp_shuffle_mode_t mode); /** * @brief Set repeat mode. Event AVRCP_SUBEVENT_OPERATION_COMPLETE returns operation id and status. * @param avrcp_cid + * @returns status */ -void avrcp_set_repeat_mode(uint16_t avrcp_cid, avrcp_repeat_mode_t mode); +uint8_t avrcp_set_repeat_mode(uint16_t avrcp_cid, avrcp_repeat_mode_t mode); const char * avrcp_subunit2str(uint16_t index); const char * avrcp_event2str(uint16_t index);