avdtp: emit event for reconfigure with reconfigure field set to 1

This commit is contained in:
Matthias Ringwald 2021-01-15 14:56:37 +01:00
parent 1d79cae3b7
commit 6c5b303c0f
5 changed files with 57 additions and 67 deletions

View File

@ -207,6 +207,7 @@ static void a2dp_sink_packet_handler_internal(uint8_t packet_type, uint16_t chan
uint8_t status;
uint8_t local_seid;
uint8_t signal_identifier;
bool reconfigure;
if (packet_type != HCI_EVENT_PACKET) return;
if (hci_event_packet_get_type(packet) != HCI_EVENT_AVDTP_META) return;
@ -214,7 +215,7 @@ static void a2dp_sink_packet_handler_internal(uint8_t packet_type, uint16_t chan
switch (packet[2]){
case AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED:
if (stream_endpoint_configured) return;
status = avdtp_subevent_signaling_connection_established_get_status(packet);
if (status != ERROR_CODE_SUCCESS){
// only care for outgoing connections
@ -229,18 +230,33 @@ static void a2dp_sink_packet_handler_internal(uint8_t packet_type, uint16_t chan
log_info("A2DP sink signaling connection established avdtp_cid 0x%02x", avdtp_subevent_signaling_connection_established_get_avdtp_cid(packet));
break;
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CONFIGURATION:
if (stream_endpoint_configured) break;
stream_endpoint_configured = true;
a2dp_sink_cid = avdtp_subevent_signaling_media_codec_other_capability_get_avdtp_cid(packet);
a2dp_replace_subevent_id_and_emit_cmd(a2dp_sink_packet_handler_user, packet, size, A2DP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CONFIGURATION);
break;
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION:
if (stream_endpoint_configured) break;
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_MPEG_AUDIO_CONFIGURATION:
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_MPEG_AAC_CONFIGURATION:
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_ATRAC_CONFIGURATION:
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CONFIGURATION:
reconfigure = avdtp_subevent_signaling_media_codec_other_configuration_get_reconfigure(packet) != 0;
// accept configure if not configured and reconfigure if already configured
if (stream_endpoint_configured != reconfigure) break;
stream_endpoint_configured = true;
a2dp_sink_cid = avdtp_subevent_signaling_media_codec_other_capability_get_avdtp_cid(packet);
a2dp_replace_subevent_id_and_emit_cmd(a2dp_sink_packet_handler_user, packet, size, A2DP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION);
switch (packet[2]){
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION:
a2dp_replace_subevent_id_and_emit_cmd(a2dp_sink_packet_handler_user, packet, size, A2DP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION);
break;
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_MPEG_AUDIO_CONFIGURATION:
a2dp_replace_subevent_id_and_emit_cmd(a2dp_sink_packet_handler_user, packet, size, A2DP_SUBEVENT_SIGNALING_MEDIA_CODEC_MPEG_AUDIO_CONFIGURATION);
break;
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_MPEG_AAC_CONFIGURATION:
a2dp_replace_subevent_id_and_emit_cmd(a2dp_sink_packet_handler_user, packet, size, A2DP_SUBEVENT_SIGNALING_MEDIA_CODEC_MPEG_AAC_CONFIGURATION);
break;
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_ATRAC_CONFIGURATION:
a2dp_replace_subevent_id_and_emit_cmd(a2dp_sink_packet_handler_user, packet, size, A2DP_SUBEVENT_SIGNALING_MEDIA_CODEC_ATRAC_CONFIGURATION);
break;
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CONFIGURATION:
a2dp_replace_subevent_id_and_emit_cmd(a2dp_sink_packet_handler_user, packet, size, A2DP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CONFIGURATION);
break;
}
break;
case AVDTP_SUBEVENT_STREAMING_CONNECTION_ESTABLISHED:

View File

@ -137,7 +137,8 @@ avdtp_acceptor_handle_configuration_command(avdtp_connection_t *connection, int
if (stream_endpoint->media_codec_configuration_len == sep.configuration.media_codec.media_codec_information_len){
(void) memcpy(stream_endpoint->media_codec_configuration_info, sep.configuration.media_codec.media_codec_information, stream_endpoint->media_codec_configuration_len);
}
avdtp_signaling_emit_configuration(stream_endpoint, connection->avdtp_cid, &sep.configuration, sep.configured_service_categories);
avdtp_signaling_emit_configuration(stream_endpoint, connection->avdtp_cid, 0, &sep.configuration,
sep.configured_service_categories);
}
avdtp_signaling_emit_accept(connection->avdtp_cid, avdtp_local_seid(stream_endpoint),
@ -325,7 +326,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t
if (stream_endpoint->media_codec_configuration_len == sep.configuration.media_codec.media_codec_information_len){
(void) memcpy(stream_endpoint->media_codec_configuration_info, sep.configuration.media_codec.media_codec_information, stream_endpoint->media_codec_configuration_len);
}
avdtp_signaling_emit_configuration(stream_endpoint, connection->avdtp_cid, &sep.configuration, sep.configured_service_categories);
avdtp_signaling_emit_configuration(stream_endpoint, connection->avdtp_cid, 1, &sep.configuration, sep.configured_service_categories);
}
break;
}

View File

@ -154,6 +154,8 @@ void avdtp_initiator_stream_config_subsm(avdtp_connection_t *connection, uint8_t
btstack_assert(stream_endpoint->remote_configuration.media_codec.media_codec_information_len == stream_endpoint->media_codec_configuration_len);
(void)memcpy(stream_endpoint->media_codec_configuration_info, stream_endpoint->remote_configuration.media_codec.media_codec_information, stream_endpoint->media_codec_configuration_len);
}
avdtp_signaling_emit_configuration(stream_endpoint, connection->avdtp_cid, 1,
&sep.configuration, (1 << AVDTP_MEDIA_CODEC));
break;
case AVDTP_SI_SET_CONFIGURATION:
@ -175,29 +177,18 @@ void avdtp_initiator_stream_config_subsm(avdtp_connection_t *connection, uint8_t
log_info("configured remote seid %d", stream_endpoint->remote_sep.seid);
// copy media codec configuration if configured
if ((stream_endpoint->remote_configuration_bitmap & (1 << AVDTP_MEDIA_CODEC)) != 0) {
btstack_assert(stream_endpoint->remote_configuration.media_codec.media_codec_information_len ==
stream_endpoint->media_codec_configuration_len);
(void) memcpy(stream_endpoint->media_codec_configuration_info,
stream_endpoint->remote_configuration.media_codec.media_codec_information,
stream_endpoint->media_codec_configuration_len);
switch (stream_endpoint->media_codec_type) {
case AVDTP_CODEC_SBC:
avdtp_signaling_emit_media_codec_sbc_configuration(
stream_endpoint,
connection->avdtp_cid,
stream_endpoint->media_type,
stream_endpoint->media_codec_configuration_info);
break;
default:
// TODO: we don't have codec info to emit config
avdtp_signaling_emit_media_codec_other_configuration(stream_endpoint,
connection->avdtp_cid,
&sep.configuration.media_codec);
break;
}
// copy media codec configuration for known codecs
if (stream_endpoint->media_codec_type != AVDTP_CODEC_NON_A2DP) {
btstack_assert(
stream_endpoint->remote_configuration.media_codec.media_codec_information_len ==
stream_endpoint->media_codec_configuration_len);
(void) memcpy(stream_endpoint->media_codec_configuration_info,
stream_endpoint->remote_configuration.media_codec.media_codec_information,
stream_endpoint->media_codec_configuration_len);
}
avdtp_signaling_emit_configuration(stream_endpoint, connection->avdtp_cid, 0,
&sep.configuration, (1 << AVDTP_MEDIA_CODEC));
}
break;

View File

@ -1210,7 +1210,7 @@ avdtp_signaling_emit_media_codec_atrac_configuration(avdtp_stream_endpoint_t *st
(*packet_handler)(HCI_EVENT_PACKET, 0, event, pos);
}
static void avdtp_signaling_emit_media_codec_other(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
static void avdtp_signaling_emit_media_codec_other_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
uint8_t reconfigure, adtvp_media_codec_capabilities_t *media_codec) {
btstack_packet_handler_t packet_handler = avdtp_packet_handler_for_stream_endpoint(stream_endpoint);
@ -1253,50 +1253,37 @@ void avdtp_signaling_emit_delay(uint16_t avdtp_cid, uint8_t local_seid, uint16_t
avdtp_emit_source(event, sizeof(event));
}
void avdtp_signaling_emit_media_codec_sbc_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
avdtp_media_type_t media_type,
const uint8_t *media_codec_information) {
avdtp_signaling_emit_media_codec_sbc(stream_endpoint, avdtp_cid, 0, media_type,
media_codec_information);
}
void avdtp_signaling_emit_media_codec_other_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
adtvp_media_codec_capabilities_t * media_codec) {
avdtp_signaling_emit_media_codec_other(stream_endpoint, avdtp_cid, 0, media_codec);
}
void avdtp_signaling_emit_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
avdtp_capabilities_t *configuration, uint16_t configured_service_categories) {
void avdtp_signaling_emit_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid, uint8_t reconfigure,
avdtp_capabilities_t *configuration, uint16_t configured_service_categories) {
if (get_bit16(configured_service_categories, AVDTP_MEDIA_CODEC)){
switch (configuration->media_codec.media_codec_type){
case AVDTP_CODEC_SBC:
avdtp_signaling_emit_media_codec_sbc_configuration(
stream_endpoint, avdtp_cid,
configuration->media_codec.media_type,
configuration->media_codec.media_codec_information);
case AVDTP_CODEC_SBC: {
avdtp_signaling_emit_media_codec_sbc(stream_endpoint, avdtp_cid, reconfigure,
configuration->media_codec.media_type,
configuration->media_codec.media_codec_information);
}
break;
case AVDTP_CODEC_MPEG_1_2_AUDIO:
avdtp_signaling_emit_media_codec_mpeg_audio_configuration(
stream_endpoint, avdtp_cid, 0,
stream_endpoint, avdtp_cid, reconfigure,
configuration->media_codec.media_type,
configuration->media_codec.media_codec_information);
break;
case AVDTP_CODEC_MPEG_2_4_AAC:
avdtp_signaling_emit_media_codec_mpeg_aac_configuration(
stream_endpoint, avdtp_cid, 0,
stream_endpoint, avdtp_cid, reconfigure,
configuration->media_codec.media_type,
configuration->media_codec.media_codec_information);
break;
case AVDTP_CODEC_ATRAC_FAMILY:
avdtp_signaling_emit_media_codec_atrac_configuration(
stream_endpoint, avdtp_cid, 0,
stream_endpoint, avdtp_cid, reconfigure,
configuration->media_codec.media_type,
configuration->media_codec.media_codec_information);
break;
default:
avdtp_signaling_emit_media_codec_other_configuration(stream_endpoint, avdtp_cid,
&configuration->media_codec);
avdtp_signaling_emit_media_codec_other_configuration(stream_endpoint, avdtp_cid, reconfigure, &configuration->media_codec);
break;
}
}

View File

@ -92,14 +92,9 @@ void avdtp_signaling_emit_capabilities(uint16_t avdtp_cid, uint8_t remote_seid,
void avdtp_signaling_emit_delay(uint16_t avdtp_cid, uint8_t local_seid, uint16_t delay);
void avdtp_signaling_emit_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
avdtp_capabilities_t *configuration, uint16_t configured_service_categories);
void avdtp_signaling_emit_media_codec_sbc_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
avdtp_media_type_t media_type,
const uint8_t *media_codec_information);
void avdtp_signaling_emit_media_codec_other_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
adtvp_media_codec_capabilities_t * media_codec);
void
avdtp_signaling_emit_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid, uint8_t reconfigure,
avdtp_capabilities_t *configuration, uint16_t configured_service_categories);
void avdtp_streaming_emit_connection_established(avdtp_stream_endpoint_t *stream_endpoint, uint8_t status);