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); uint8_t signal_identifier; uint8_t status; avdtp_sep_t sep; uint16_t avdtp_cid; 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; } media_tracker.avdtp_cid = avdtp_subevent_signaling_connection_established_get_avdtp_cid(packet); 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; 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:{ printf("CAPABILITY - MEDIA_CODEC_SBC: \n"); adtvp_media_codec_information_sbc_t 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_TRANSPORT_CAPABILITY: printf("CAPABILITY - MEDIA_TRANSPORT supported on remote.\n"); break; case AVDTP_SUBEVENT_SIGNALING_REPORTING_CAPABILITY: printf("CAPABILITY - REPORTING supported on remote.\n"); break; case AVDTP_SUBEVENT_SIGNALING_RECOVERY_CAPABILITY: printf("CAPABILITY - RECOVERY supported on remote: \n"); printf(" - recovery_type %d\n", avdtp_subevent_signaling_recovery_capability_get_recovery_type(packet)); printf(" - maximum_recovery_window_size %d\n", avdtp_subevent_signaling_recovery_capability_get_maximum_recovery_window_size(packet)); printf(" - maximum_number_media_packets %d\n", avdtp_subevent_signaling_recovery_capability_get_maximum_number_media_packets(packet)); break; case AVDTP_SUBEVENT_SIGNALING_CONTENT_PROTECTION_CAPABILITY: printf("CAPABILITY - CONTENT_PROTECTION supported on remote: \n"); printf(" - cp_type %d\n", avdtp_subevent_signaling_content_protection_capability_get_cp_type(packet)); printf(" - cp_type_value_len %d\n", avdtp_subevent_signaling_content_protection_capability_get_cp_type_value_len(packet)); printf(" - cp_type_value \'%s\'\n", avdtp_subevent_signaling_content_protection_capability_get_cp_type_value(packet)); break; case AVDTP_SUBEVENT_SIGNALING_MULTIPLEXING_CAPABILITY: printf("CAPABILITY - MULTIPLEXING supported on remote: \n"); printf(" - fragmentation %d\n", avdtp_subevent_signaling_multiplexing_capability_get_fragmentation(packet)); printf(" - transport_identifiers_num %d\n", avdtp_subevent_signaling_multiplexing_capability_get_transport_identifiers_num(packet)); printf(" - transport_session_identifier_1 %d\n", avdtp_subevent_signaling_multiplexing_capability_get_transport_session_identifier_1(packet)); printf(" - transport_session_identifier_2 %d\n", avdtp_subevent_signaling_multiplexing_capability_get_transport_session_identifier_2(packet)); printf(" - transport_session_identifier_3 %d\n", avdtp_subevent_signaling_multiplexing_capability_get_transport_session_identifier_3(packet)); printf(" - tcid_1 %d\n", avdtp_subevent_signaling_multiplexing_capability_get_tcid_1(packet)); printf(" - tcid_2 %d\n", avdtp_subevent_signaling_multiplexing_capability_get_tcid_2(packet)); printf(" - tcid_3 %d\n", avdtp_subevent_signaling_multiplexing_capability_get_tcid_3(packet)); break; case AVDTP_SUBEVENT_SIGNALING_DELAY_REPORTING_CAPABILITY: printf("CAPABILITY - DELAY_REPORTING supported on remote.\n"); break; case AVDTP_SUBEVENT_SIGNALING_HEADER_COMPRESSION_CAPABILITY: printf("CAPABILITY - HEADER_COMPRESSION supported on remote: \n"); printf(" - back_ch %d\n", avdtp_subevent_signaling_header_compression_capability_get_back_ch(packet)); printf(" - media %d\n", avdtp_subevent_signaling_header_compression_capability_get_media(packet)); printf(" - recovery %d\n", avdtp_subevent_signaling_header_compression_capability_get_recovery(packet)); break; case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION:{ avdtp_media_codec_configuration_sbc_t 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); sc.block_length = sbc_configuration.block_length; sc.subbands = sbc_configuration.subbands; sc.allocation_method = sbc_configuration.allocation_method - 1; sc.max_bitpool_value = sbc_configuration.max_bitpool_value; sc.sampling_frequency = sbc_configuration.sampling_frequency; sc.num_channels = 2; switch (sbc_configuration.channel_mode){ case AVDTP_SBC_JOINT_STEREO: sc.channel_mode = 3; break; case AVDTP_SBC_STEREO: sc.channel_mode = 2; break; case AVDTP_SBC_DUAL_CHANNEL: sc.channel_mode = 1; break; case AVDTP_SBC_MONO: sc.channel_mode = 0; sc.num_channels = 1; break; } break; } case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CAPABILITY: printf("Received non SBC codec: not parsed\n"); break; case AVDTP_SUBEVENT_STREAMING_CAN_SEND_MEDIA_PACKET_NOW: a2dp_demo_send_media_packet(); break; case AVDTP_SUBEVENT_SIGNALING_ACCEPT: // TODO check cid signal_identifier = avdtp_subevent_signaling_accept_get_signal_identifier(packet); if (is_cmd_triggered_localy){ is_cmd_triggered_localy = 0; printf("AVDTP Source command accepted\n"); } switch (signal_identifier){ case AVDTP_SI_OPEN: initialize_sbc_encoder(); break; case AVDTP_SI_SET_CONFIGURATION: break; case AVDTP_SI_START: printf("Stream started.\n"); a2dp_demo_timer_start(&media_tracker); break; case AVDTP_SI_SUSPEND: printf("Stream paused.\n"); a2dp_demo_timer_pause(&media_tracker); break; case AVDTP_SI_ABORT: case AVDTP_SI_CLOSE: printf("Stream released.\n"); a2dp_demo_timer_stop(&media_tracker); break; default: break; } break; 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; case AVDTP_SUBEVENT_STREAMING_CONNECTION_RELEASED: a2dp_demo_timer_stop(&media_tracker); printf("Streaming connection released.\n"); break; case AVDTP_SUBEVENT_SIGNALING_CONNECTION_RELEASED: a2dp_demo_timer_stop(&media_tracker); printf("Signaling connection released.\n"); break; default: printf("AVDTP Source PTS test: event not parsed 0x%02x\n", packet[2]); break; } }
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_PIN_CODE_REQUEST){ // inform about pin code request bd_addr_t event_addr; printf("Pin code request - using '0000'\n"); hci_event_pin_code_request_get_bd_addr(packet, event_addr); gap_pin_code_response(event_addr, "0000"); } if (hci_event_packet_get_type(packet) != HCI_EVENT_AVDTP_META) return; UNUSED(channel); UNUSED(size); uint8_t status; 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 != ERROR_CODE_SUCCESS){ printf("AVDTP connection failed with status 0x%02x.\n", status); break; } printf("AVDTP Sink connected: avdtp_cid 0x%02x.\n", avdtp_cid); break; case AVDTP_SUBEVENT_SIGNALING_CONNECTION_RELEASED: avdtp_cid = avdtp_subevent_signaling_connection_released_get_avdtp_cid(packet); printf("AVDTP connection released: avdtp_cid 0x%02x.\n", avdtp_cid); break; case AVDTP_SUBEVENT_SIGNALING_SEP_FOUND: remote_seid = avdtp_subevent_signaling_sep_found_get_remote_seid(packet); printf("Found sep: seid %u, in_use %d, media type %d, sep type %d (1-SNK)\n", remote_seid, avdtp_subevent_signaling_sep_found_get_in_use(packet), avdtp_subevent_signaling_sep_found_get_media_type(packet), avdtp_subevent_signaling_sep_found_get_sep_type(packet)); break; case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CAPABILITY: printf("Received SBC codec capabilities\n"); 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:{ printf("Received SBC codec configuration\n"); 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); avdtp_sink_delay_report(avdtp_cid, remote_seid, 100); media_processing_close(); media_processing_init(sbc_configuration); break; } case AVDTP_SUBEVENT_STREAMING_CONNECTION_ESTABLISHED: printf("Streaming connection opened.\n"); break; case AVDTP_SUBEVENT_STREAMING_CONNECTION_RELEASED: printf("Streaming connection released.\n"); is_cmd_triggered_localy = 0; is_media_header_reported_once = 0; media_processing_close(); break; case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CAPABILITY: printf("Received non SBC codec, event not parsed.\n"); break; case AVDTP_SUBEVENT_SIGNALING_ACCEPT:{ switch (avdtp_subevent_signaling_accept_get_signal_identifier(packet)){ case AVDTP_SI_START: printf("Stream started\n"); media_processing_init(sbc_configuration); break; case AVDTP_SI_SUSPEND: printf("Stream paused\n"); media_processing_close(); break; case AVDTP_SI_ABORT: case AVDTP_SI_CLOSE: printf("Stream stoped\n"); media_processing_close(); break; default: break; } if (is_cmd_triggered_localy){ is_cmd_triggered_localy = 0; printf("AVDTP Sink command accepted\n"); } break; } case AVDTP_SUBEVENT_SIGNALING_REJECT: case AVDTP_SUBEVENT_SIGNALING_GENERAL_REJECT: if (is_cmd_triggered_localy){ is_cmd_triggered_localy = 0; printf("AVDTP Sink command rejected\n"); } break; default: if (is_cmd_triggered_localy){ is_cmd_triggered_localy = 0; } printf("AVDTP Sink event 0x%02x not parsed\n", packet[2]); break; } }
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); uint8_t status; 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 != ERROR_CODE_SUCCESS){ printf("AVDTP connection establishment failed: status 0x%02x.\n", status); break; } printf("AVDTP connection established: avdtp_cid 0x%02x.\n", avdtp_cid); break; case AVDTP_SUBEVENT_SIGNALING_CONNECTION_RELEASED: avdtp_cid = avdtp_subevent_signaling_connection_released_get_avdtp_cid(packet); printf("AVDTP connection released: avdtp_cid 0x%02x.\n", avdtp_cid); break; case AVDTP_SUBEVENT_SIGNALING_SEP_FOUND: remote_seid = avdtp_subevent_signaling_sep_found_get_remote_seid(packet); printf("Found sep: seid %u, in_use %d, media type %d, sep type %d (1-SNK)\n", remote_seid, avdtp_subevent_signaling_sep_found_get_in_use(packet), avdtp_subevent_signaling_sep_found_get_media_type(packet), avdtp_subevent_signaling_sep_found_get_sep_type(packet)); break; case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CAPABILITY: printf("Received MEDIA_CODEC_SBC_CAPABILITY\n"); 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:{ printf("Received MEDIA_CODEC_SBC_CONFIGURATION\n"); 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){ close_media_processing(); init_media_processing(sbc_configuration); } else { init_media_processing(sbc_configuration); } break; } case AVDTP_SUBEVENT_STREAMING_CONNECTION_ESTABLISHED: break; case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CAPABILITY: printf("Received non SBC codec, event not parsed.\n"); break; case AVDTP_SUBEVENT_SIGNALING_ACCEPT: break; default: printf("AVDTP Sink event not parsed\n"); break; } }