From 2bb3471f99e3b46b9fc9cc77b48863838e15ce57 Mon Sep 17 00:00:00 2001 From: Milanka Ringwald Date: Tue, 24 Apr 2018 22:56:16 +0200 Subject: [PATCH] avdtp: fix reconfigure and transfer control --- src/classic/a2dp_sink.c | 1 + src/classic/avdtp_acceptor.c | 2 +- src/classic/avdtp_initiator.c | 2 +- src/classic/avdtp_util.c | 3 +-- test/pts/avdtp_sink_test.c | 11 ++++++++--- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/classic/a2dp_sink.c b/src/classic/a2dp_sink.c index c02b111c2..871a8eb89 100644 --- a/src/classic/a2dp_sink.c +++ b/src/classic/a2dp_sink.c @@ -327,6 +327,7 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe cid = avdtp_subevent_signaling_accept_get_avdtp_cid(packet); loc_seid = avdtp_subevent_signaling_accept_get_local_seid(packet); a2dp_emit_cmd_rejected(a2dp_sink_context.a2dp_callback, packet, size); + app_state = A2DP_IDLE; break; case AVDTP_SUBEVENT_STREAMING_CONNECTION_RELEASED: cid = avdtp_subevent_streaming_connection_released_get_avdtp_cid(packet); diff --git a/src/classic/avdtp_acceptor.c b/src/classic/avdtp_acceptor.c index a6d16bfa7..99a0c0f46 100644 --- a/src/classic/avdtp_acceptor.c +++ b/src/classic/avdtp_acceptor.c @@ -307,7 +307,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t * connection, uint8_t break; case AVDTP_SI_START: if (stream_endpoint->state != AVDTP_STREAM_ENDPOINT_OPENED){ - log_info("ACP: REJECT AVDTP_SI_START, BAD_STATE"); + log_info("ACP: REJECT AVDTP_SI_START, BAD_STATE, state %d", stream_endpoint->state); stream_endpoint->acceptor_config_state = AVDTP_ACCEPTOR_W2_REJECT_CATEGORY_WITH_ERROR_CODE; connection->error_code = BAD_STATE; connection->reject_signal_identifier = connection->signaling_packet.signal_identifier; diff --git a/src/classic/avdtp_initiator.c b/src/classic/avdtp_initiator.c index ebecb8116..852062a44 100644 --- a/src/classic/avdtp_initiator.c +++ b/src/classic/avdtp_initiator.c @@ -155,9 +155,9 @@ void avdtp_initiator_stream_config_subsm(avdtp_connection_t * connection, uint8_ if (!is_avdtp_remote_seid_registered(stream_endpoint)){ stream_endpoint->remote_sep = sep; - stream_endpoint->state = AVDTP_STREAM_ENDPOINT_CONFIGURED; log_info("INT: update seid %d, to %p", stream_endpoint->remote_sep.seid, stream_endpoint); } + stream_endpoint->state = AVDTP_STREAM_ENDPOINT_OPENED; break; case AVDTP_SI_SET_CONFIGURATION:{ diff --git a/src/classic/avdtp_util.c b/src/classic/avdtp_util.c index a9fa5d773..b412dab38 100644 --- a/src/classic/avdtp_util.c +++ b/src/classic/avdtp_util.c @@ -490,7 +490,7 @@ void avdtp_prepare_capabilities(avdtp_signaling_packet_t * signaling_packet, uin for (i = 1; i < 9; i++){ int registered_category = get_bit16(registered_service_categories, i); - if (!registered_category && (identifier == AVDTP_SI_SET_CONFIGURATION || identifier == AVDTP_SI_RECONFIGURE)){ + if (!registered_category && (identifier == AVDTP_SI_SET_CONFIGURATION)){ // TODO: introduce bitmap of mandatory categories if (i == 1){ registered_category = 1; @@ -502,7 +502,6 @@ void avdtp_prepare_capabilities(avdtp_signaling_packet_t * signaling_packet, uin signaling_packet->size += avdtp_pack_service_capabilities(signaling_packet->command+signaling_packet->size, sizeof(signaling_packet->command)-signaling_packet->size, capabilities, (avdtp_service_category_t)i, pack_all_capabilities); } } - signaling_packet->signal_identifier = (avdtp_signal_identifier_t)identifier; signaling_packet->transaction_label = transaction_label; } diff --git a/test/pts/avdtp_sink_test.c b/test/pts/avdtp_sink_test.c index ff55cda82..eac5a7fc8 100644 --- a/test/pts/avdtp_sink_test.c +++ b/test/pts/avdtp_sink_test.c @@ -609,6 +609,7 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe 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); @@ -705,9 +706,12 @@ static uint8_t media_sbc_codec_configuration[] = { }; static uint8_t media_sbc_codec_reconfiguration[] = { - (AVDTP_SBC_44100 << 4) | AVDTP_SBC_STEREO, - (AVDTP_SBC_BLOCK_LENGTH_16 << 4) | (AVDTP_SBC_SUBBANDS_8 << 2) | AVDTP_SBC_ALLOCATION_METHOD_SNR, - 2, 53 + // (AVDTP_SBC_44100 << 4) | AVDTP_SBC_STEREO, + // (AVDTP_SBC_BLOCK_LENGTH_16 << 4) | (AVDTP_SBC_SUBBANDS_8 << 2) | AVDTP_SBC_ALLOCATION_METHOD_SNR, + // 32, 32 + (AVDTP_SBC_44100 << 4) | AVDTP_SBC_MONO, + (AVDTP_SBC_BLOCK_LENGTH_8 << 4) | (AVDTP_SBC_SUBBANDS_8 << 2) | AVDTP_SBC_ALLOCATION_METHOD_LOUDNESS, + 32, 32 }; #ifdef HAVE_BTSTACK_STDIN @@ -773,6 +777,7 @@ static void stdin_process(char cmd){ break; case 'R': printf("Reconfigure stream endpoint with seid %d\n", remote_seid); + remote_configuration_bitmap = 0; 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;