diff --git a/test/pts/avdtp_source_test.c b/test/pts/avdtp_source_test.c index 229fba9c1..440d412ce 100644 --- a/test/pts/avdtp_source_test.c +++ b/test/pts/avdtp_source_test.c @@ -81,9 +81,7 @@ static const char * device_addr_string = "00:21:3C:AC:F7:38"; #endif static bd_addr_t device_addr; - static uint16_t avdtp_cid = 0; -static uint16_t avdtp_media_cid = 0; static uint8_t sdp_avdtp_source_service_buffer[150]; static uint8_t remote_seid; @@ -95,48 +93,8 @@ static uint16_t remote_configuration_bitmap; static avdtp_capabilities_t remote_configuration; static avdtp_context_t a2dp_source_context; -static const char * avdtp_si_name[] = { - "ERROR", - "AVDTP_SI_DISCOVER", - "AVDTP_SI_GET_CAPABILITIES", - "AVDTP_SI_SET_CONFIGURATION", - "AVDTP_SI_GET_CONFIGURATION", - "AVDTP_SI_RECONFIGURE", - "AVDTP_SI_OPEN", - "AVDTP_SI_START", - "AVDTP_SI_CLOSE", - "AVDTP_SI_SUSPEND", - "AVDTP_SI_ABORT", - "AVDTP_SI_SECURITY_CONTROL", - "AVDTP_SI_GET_ALL_CAPABILITIES", - "AVDTP_SI_DELAY_REPORT" -}; - -typedef enum { - AVDTP_APPLICATION_IDLE, - AVDTP_APPLICATION_W2_DISCOVER_SEPS, - AVDTP_APPLICATION_W2_GET_CAPABILITIES, - AVDTP_APPLICATION_W2_GET_ALL_CAPABILITIES, - AVDTP_APPLICATION_W2_SET_CONFIGURATION, - AVDTP_APPLICATION_W2_SUSPEND_STREAM_WITH_SEID, - AVDTP_APPLICATION_W2_RECONFIGURE_WITH_SEID, - AVDTP_APPLICATION_W2_OPEN_STREAM_WITH_SEID, - AVDTP_APPLICATION_W2_START_STREAM_WITH_SEID, - AVDTP_APPLICATION_W2_ABORT_STREAM_WITH_SEID, - AVDTP_APPLICATION_W2_STOP_STREAM_WITH_SEID, - AVDTP_APPLICATION_W2_GET_CONFIGURATION, - AVDTP_APPLICATION_STREAMING_OPENED -} avdtp_application_state_t; - -avdtp_application_state_t app_state = AVDTP_APPLICATION_IDLE; - static btstack_packet_callback_registration_t hci_event_callback_registration; -static const char * avdtp_si2str(uint16_t index){ - if (index <= 0 || index > sizeof(avdtp_si_name)) return avdtp_si_name[0]; - return avdtp_si_name[index]; -} - static void dump_sbc_capability(adtvp_media_codec_information_sbc_t media_codec_sbc){ printf(" --- avdtp source --- Received media codec capability:\n"); printf(" - sampling_frequency: 0x%02x\n", media_codec_sbc.sampling_frequency_bitmap); @@ -161,128 +119,98 @@ static void dump_sbc_configuration(avdtp_media_codec_configuration_sbc_t configu } static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ + if (packet_type != HCI_EVENT_PACKET) return; + if (hci_event_packet_get_type(packet) != HCI_EVENT_AVDTP_META) return; UNUSED(channel); UNUSED(size); - - bd_addr_t event_addr; uint8_t signal_identifier; uint8_t status; avdtp_sep_t sep; - switch (packet_type) { - - case HCI_EVENT_PACKET: - switch (hci_event_packet_get_type(packet)) { - case HCI_EVENT_PIN_CODE_REQUEST: - // inform about pin code request - printf("Pin code request - using '0000'\n"); - hci_event_pin_code_request_get_bd_addr(packet, event_addr); - hci_send_cmd(&hci_pin_code_request_reply, &event_addr, 4, "0000"); - break; - case HCI_EVENT_DISCONNECTION_COMPLETE: - // connection closed -> quit test app - printf("\n --- avdtp source --- HCI_EVENT_DISCONNECTION_COMPLETE ---\n"); - break; - case HCI_EVENT_AVDTP_META: - switch (packet[2]){ - case AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED: - avdtp_cid = avdtp_subevent_signaling_connection_established_get_avdtp_cid(packet); - status = avdtp_subevent_signaling_connection_established_get_status(packet); - if (status != 0){ - printf(" --- avdtp source --- AVDTP_SUBEVENT_SIGNALING_CONNECTION cpould not be established, status %d ---\n", status); - break; - } - printf(" --- avdtp source --- AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED, con handle 0x%02x ---\n", avdtp_cid); - break; - case AVDTP_SUBEVENT_STREAMING_CONNECTION_ESTABLISHED: - avdtp_media_cid = avdtp_subevent_streaming_connection_established_get_avdtp_cid(packet); - status = avdtp_subevent_streaming_connection_established_get_status(packet); - if (status != 0){ - printf(" --- avdtp source --- AVDTP_SUBEVENT_STREAMING_CONNECTION could not be established, status %d ---\n", status); - break; - } - app_state = AVDTP_APPLICATION_STREAMING_OPENED; - printf(" --- avdtp source --- AVDTP_SUBEVENT_STREAMING_CONNECTION_ESTABLISHED, con handle 0x%02x ---\n", avdtp_media_cid); - break; - case AVDTP_SUBEVENT_SIGNALING_SEP_FOUND: - if (app_state != AVDTP_APPLICATION_W2_DISCOVER_SEPS) return; - sep.seid = avdtp_subevent_signaling_sep_found_get_remote_seid(packet); - sep.in_use = avdtp_subevent_signaling_sep_found_get_in_use(packet); - sep.media_type = avdtp_subevent_signaling_sep_found_get_media_type(packet); - sep.type = avdtp_subevent_signaling_sep_found_get_sep_type(packet); - printf(" --- avdtp source --- Found sep: seid %u, in_use %d, media type %d, sep type %d (1-SNK)\n", sep.seid, sep.in_use, sep.media_type, sep.type); - break; - case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CAPABILITY: - app_state = AVDTP_APPLICATION_IDLE; - sbc_capability.sampling_frequency_bitmap = avdtp_subevent_signaling_media_codec_sbc_capability_get_sampling_frequency_bitmap(packet); - sbc_capability.channel_mode_bitmap = avdtp_subevent_signaling_media_codec_sbc_capability_get_channel_mode_bitmap(packet); - sbc_capability.block_length_bitmap = avdtp_subevent_signaling_media_codec_sbc_capability_get_block_length_bitmap(packet); - sbc_capability.subbands_bitmap = avdtp_subevent_signaling_media_codec_sbc_capability_get_subbands_bitmap(packet); - sbc_capability.allocation_method_bitmap = avdtp_subevent_signaling_media_codec_sbc_capability_get_allocation_method_bitmap(packet); - sbc_capability.min_bitpool_value = avdtp_subevent_signaling_media_codec_sbc_capability_get_min_bitpool_value(packet); - sbc_capability.max_bitpool_value = avdtp_subevent_signaling_media_codec_sbc_capability_get_max_bitpool_value(packet); - dump_sbc_capability(sbc_capability); - break; - case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION:{ - app_state = AVDTP_APPLICATION_IDLE; - sbc_configuration.reconfigure = avdtp_subevent_signaling_media_codec_sbc_configuration_get_reconfigure(packet); - sbc_configuration.num_channels = avdtp_subevent_signaling_media_codec_sbc_configuration_get_num_channels(packet); - sbc_configuration.sampling_frequency = avdtp_subevent_signaling_media_codec_sbc_configuration_get_sampling_frequency(packet); - sbc_configuration.channel_mode = avdtp_subevent_signaling_media_codec_sbc_configuration_get_channel_mode(packet); - sbc_configuration.block_length = avdtp_subevent_signaling_media_codec_sbc_configuration_get_block_length(packet); - sbc_configuration.subbands = avdtp_subevent_signaling_media_codec_sbc_configuration_get_subbands(packet); - sbc_configuration.allocation_method = avdtp_subevent_signaling_media_codec_sbc_configuration_get_allocation_method(packet); - sbc_configuration.min_bitpool_value = avdtp_subevent_signaling_media_codec_sbc_configuration_get_min_bitpool_value(packet); - sbc_configuration.max_bitpool_value = avdtp_subevent_signaling_media_codec_sbc_configuration_get_max_bitpool_value(packet); - sbc_configuration.frames_per_buffer = sbc_configuration.subbands * sbc_configuration.block_length; - dump_sbc_configuration(sbc_configuration); - - // if (sbc_configuration.reconfigure){} - break; - } - case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CAPABILITY: - printf(" --- avdtp source --- received non SBC codec. not implemented\n"); - break; - - case AVDTP_SUBEVENT_SIGNALING_ACCEPT: - app_state = AVDTP_APPLICATION_IDLE; - signal_identifier = avdtp_subevent_signaling_accept_get_signal_identifier(packet); - printf(" --- avdtp source --- Accepted %s\n", avdtp_si2str(signal_identifier)); - if (app_state != AVDTP_APPLICATION_STREAMING_OPENED) return; + switch (packet[2]){ + case AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED: + avdtp_cid = avdtp_subevent_signaling_connection_established_get_avdtp_cid(packet); + status = avdtp_subevent_signaling_connection_established_get_status(packet); + if (status != 0){ + printf("AVDTP source signaling connection failed: status %d\n", status); + break; + } + printf("AVDTP source signaling connection established: avdtp_cid 0x%02x\n", avdtp_cid); + break; + + case AVDTP_SUBEVENT_STREAMING_CONNECTION_ESTABLISHED: + status = avdtp_subevent_streaming_connection_established_get_status(packet); + if (status != 0){ + printf("Streaming connection failed: status %d\n", status); + break; + } + avdtp_cid = avdtp_subevent_streaming_connection_established_get_avdtp_cid(packet); + printf("Streaming connection established, avdtp_cid 0x%02x\n", avdtp_cid); + break; - switch (signal_identifier){ - case AVDTP_SI_START: - break; - case AVDTP_SI_CLOSE: - break; - case AVDTP_SI_SUSPEND: - break; - case AVDTP_SI_ABORT: - break; - default: - break; - } - break; - case AVDTP_SUBEVENT_SIGNALING_REJECT: - signal_identifier = avdtp_subevent_signaling_reject_get_signal_identifier(packet); - printf(" --- avdtp source --- Rejected %s\n", avdtp_si2str(signal_identifier)); - break; - case AVDTP_SUBEVENT_SIGNALING_GENERAL_REJECT: - signal_identifier = avdtp_subevent_signaling_general_reject_get_signal_identifier(packet); - printf(" --- avdtp source --- Rejected %s\n", avdtp_si2str(signal_identifier)); - break; - default: - printf(" --- avdtp source --- not implemented\n"); - break; - } - break; + case AVDTP_SUBEVENT_SIGNALING_SEP_FOUND: + sep.seid = avdtp_subevent_signaling_sep_found_get_remote_seid(packet);; + sep.in_use = avdtp_subevent_signaling_sep_found_get_in_use(packet); + sep.media_type = avdtp_subevent_signaling_sep_found_get_media_type(packet); + sep.type = avdtp_subevent_signaling_sep_found_get_sep_type(packet); + printf("Found sep: seid %u, in_use %d, media type %d, sep type %d (1-SNK)\n", sep.seid, sep.in_use, sep.media_type, sep.type); + break; + case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CAPABILITY: + sbc_capability.sampling_frequency_bitmap = avdtp_subevent_signaling_media_codec_sbc_capability_get_sampling_frequency_bitmap(packet); + sbc_capability.channel_mode_bitmap = avdtp_subevent_signaling_media_codec_sbc_capability_get_channel_mode_bitmap(packet); + sbc_capability.block_length_bitmap = avdtp_subevent_signaling_media_codec_sbc_capability_get_block_length_bitmap(packet); + sbc_capability.subbands_bitmap = avdtp_subevent_signaling_media_codec_sbc_capability_get_subbands_bitmap(packet); + sbc_capability.allocation_method_bitmap = avdtp_subevent_signaling_media_codec_sbc_capability_get_allocation_method_bitmap(packet); + sbc_capability.min_bitpool_value = avdtp_subevent_signaling_media_codec_sbc_capability_get_min_bitpool_value(packet); + sbc_capability.max_bitpool_value = avdtp_subevent_signaling_media_codec_sbc_capability_get_max_bitpool_value(packet); + dump_sbc_capability(sbc_capability); + break; + case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION:{ + sbc_configuration.reconfigure = avdtp_subevent_signaling_media_codec_sbc_configuration_get_reconfigure(packet); + sbc_configuration.num_channels = avdtp_subevent_signaling_media_codec_sbc_configuration_get_num_channels(packet); + sbc_configuration.sampling_frequency = avdtp_subevent_signaling_media_codec_sbc_configuration_get_sampling_frequency(packet); + sbc_configuration.channel_mode = avdtp_subevent_signaling_media_codec_sbc_configuration_get_channel_mode(packet); + sbc_configuration.block_length = avdtp_subevent_signaling_media_codec_sbc_configuration_get_block_length(packet); + sbc_configuration.subbands = avdtp_subevent_signaling_media_codec_sbc_configuration_get_subbands(packet); + sbc_configuration.allocation_method = avdtp_subevent_signaling_media_codec_sbc_configuration_get_allocation_method(packet); + sbc_configuration.min_bitpool_value = avdtp_subevent_signaling_media_codec_sbc_configuration_get_min_bitpool_value(packet); + sbc_configuration.max_bitpool_value = avdtp_subevent_signaling_media_codec_sbc_configuration_get_max_bitpool_value(packet); + sbc_configuration.frames_per_buffer = sbc_configuration.subbands * sbc_configuration.block_length; + dump_sbc_configuration(sbc_configuration); + break; + } + case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CAPABILITY: + printf("Received non SBC codec: not parsed\n"); + break; + + case AVDTP_SUBEVENT_SIGNALING_ACCEPT: + signal_identifier = avdtp_subevent_signaling_accept_get_signal_identifier(packet); + printf("Accepted %s\n", avdtp_si2str(signal_identifier)); + + switch (signal_identifier){ + case AVDTP_SI_START: + break; + case AVDTP_SI_CLOSE: + break; + case AVDTP_SI_SUSPEND: + break; + case AVDTP_SI_ABORT: + break; default: break; } break; - default: - // other packet type + case AVDTP_SUBEVENT_SIGNALING_REJECT: + signal_identifier = avdtp_subevent_signaling_reject_get_signal_identifier(packet); + printf("Rejected %s\n", avdtp_si2str(signal_identifier)); break; + case AVDTP_SUBEVENT_SIGNALING_GENERAL_REJECT: + signal_identifier = avdtp_subevent_signaling_general_reject_get_signal_identifier(packet); + printf("Rejected %s\n", avdtp_si2str(signal_identifier)); + break; + default: + printf("AVDTP Source PTS test: event not parsed\n"); + break; } } @@ -326,6 +254,8 @@ static void show_usage(void){ printf("A - abort stream with %d\n", remote_seid); printf("S - stop stream with %d\n", remote_seid); printf("P - suspend stream with %d\n", remote_seid); + printf("x - start streaming sine\n"); + printf("X - stop streaming sine\n"); printf("Ctrl-c - exit\n"); printf("---\n"); } @@ -334,31 +264,31 @@ static void stdin_process(char cmd){ remote_seid = 1; switch (cmd){ case 'c': - printf("Creating L2CAP Connection to %s, BLUETOOTH_PROTOCOL_AVDTP\n", device_addr_string); + printf("Establish AVDTP Source connection to %s\n", device_addr_string); avdtp_source_connect(device_addr, &avdtp_cid); break; case 'C': - printf("Disconnect not implemented\n"); + printf("Disconnect AVDTP Source\n"); avdtp_source_disconnect(avdtp_cid); break; case 'd': - app_state = AVDTP_APPLICATION_W2_DISCOVER_SEPS; + printf("Discover stream endpoints of %s\n", device_addr_string); avdtp_source_discover_stream_endpoints(avdtp_cid); break; case 'g': - app_state = AVDTP_APPLICATION_W2_GET_CAPABILITIES; + printf("Get capabilities of stream endpoint with seid %d\n", remote_seid); avdtp_source_get_capabilities(avdtp_cid, remote_seid); break; case 'a': - app_state = AVDTP_APPLICATION_W2_GET_ALL_CAPABILITIES; + printf("Get all capabilities of stream endpoint with seid %d\n", remote_seid); avdtp_source_get_all_capabilities(avdtp_cid, remote_seid); break; case 'f': - app_state = AVDTP_APPLICATION_W2_GET_CONFIGURATION; + printf("Get configuration of stream endpoint with seid %d\n", remote_seid); avdtp_source_get_configuration(avdtp_cid, remote_seid); break; case 's': - app_state = AVDTP_APPLICATION_W2_SET_CONFIGURATION; + printf("Set configuration of stream endpoint with seid %d\n", remote_seid); remote_configuration_bitmap = store_bit16(remote_configuration_bitmap, AVDTP_MEDIA_CODEC, 1); remote_configuration.media_codec.media_type = AVDTP_AUDIO; remote_configuration.media_codec.media_codec_type = AVDTP_CODEC_SBC; @@ -367,7 +297,7 @@ static void stdin_process(char cmd){ avdtp_source_set_configuration(avdtp_cid, avdtp_local_seid(local_stream_endpoint), remote_seid, remote_configuration_bitmap, remote_configuration); break; case 'R': - app_state = AVDTP_APPLICATION_W2_RECONFIGURE_WITH_SEID; + printf("Reconfigure stream endpoint with seid %d\n", remote_seid); remote_configuration_bitmap = store_bit16(remote_configuration_bitmap, AVDTP_MEDIA_CODEC, 1); remote_configuration.media_codec.media_type = AVDTP_AUDIO; remote_configuration.media_codec.media_codec_type = AVDTP_CODEC_SBC; @@ -376,31 +306,31 @@ static void stdin_process(char cmd){ avdtp_source_reconfigure(avdtp_cid, avdtp_local_seid(local_stream_endpoint), remote_seid, remote_configuration_bitmap, remote_configuration); break; case 'o': - app_state = AVDTP_APPLICATION_W2_OPEN_STREAM_WITH_SEID; + printf("Establish stream between local %d and remote %d seid\n", avdtp_local_seid(local_stream_endpoint), remote_seid); avdtp_source_open_stream(avdtp_cid, avdtp_local_seid(local_stream_endpoint), remote_seid); break; case 'm': - app_state = AVDTP_APPLICATION_W2_START_STREAM_WITH_SEID; + printf("Start stream between local %d and remote %d seid\n", avdtp_local_seid(local_stream_endpoint), avdtp_remote_seid(local_stream_endpoint)); avdtp_source_start_stream(avdtp_cid, avdtp_local_seid(local_stream_endpoint)); break; case 'A': - app_state = AVDTP_APPLICATION_W2_ABORT_STREAM_WITH_SEID; + printf("Abort stream between local %d and remote %d seid\n", avdtp_local_seid(local_stream_endpoint), avdtp_remote_seid(local_stream_endpoint)); avdtp_source_abort_stream(avdtp_cid, avdtp_local_seid(local_stream_endpoint)); break; case 'S': - app_state = AVDTP_APPLICATION_W2_STOP_STREAM_WITH_SEID; + printf("Release stream between local %d and remote %d seid\n", avdtp_local_seid(local_stream_endpoint), avdtp_remote_seid(local_stream_endpoint)); avdtp_source_stop_stream(avdtp_cid, avdtp_local_seid(local_stream_endpoint)); break; case 'P': - app_state = AVDTP_APPLICATION_W2_SUSPEND_STREAM_WITH_SEID; + printf("Susspend stream between local %d and remote %d seid\n", avdtp_local_seid(local_stream_endpoint), avdtp_remote_seid(local_stream_endpoint)); avdtp_source_suspend(avdtp_cid, avdtp_local_seid(local_stream_endpoint)); break; case 'x': - printf("start streaming sine\n"); + printf("Start streaming sine\n"); avdtp_source_start_stream(avdtp_cid, avdtp_local_seid(local_stream_endpoint)); break; case 'X': - printf("stop streaming sine\n"); + printf("Stop streaming sine\n"); avdtp_source_stop_stream(avdtp_cid, avdtp_local_seid(local_stream_endpoint)); break; @@ -428,14 +358,9 @@ int btstack_main(int argc, const char * argv[]){ // Initialize AVDTP Sink avdtp_source_init(&a2dp_source_context); avdtp_source_register_packet_handler(&packet_handler); - -//#ifndef SMG_BI local_stream_endpoint = avdtp_source_create_stream_endpoint(AVDTP_SOURCE, AVDTP_AUDIO); avdtp_source_register_media_transport_category(avdtp_local_seid(local_stream_endpoint)); avdtp_source_register_media_codec_category(avdtp_local_seid(local_stream_endpoint), AVDTP_AUDIO, AVDTP_CODEC_SBC, (uint8_t *)media_sbc_codec_capabilities, sizeof(media_sbc_codec_capabilities)); -//#endif - // uint8_t cp_type_lsb, uint8_t cp_type_msb, const uint8_t * cp_type_value, uint8_t cp_type_value_len - // avdtp_source_register_content_protection_category(seid, 2, 2, NULL, 0); // Initialize SDP sdp_init();