avdtp: fix reconfigure and transfer control

This commit is contained in:
Milanka Ringwald 2018-04-24 22:56:16 +02:00
parent af45e36ab8
commit 2bb3471f99
5 changed files with 12 additions and 7 deletions

View File

@ -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); cid = avdtp_subevent_signaling_accept_get_avdtp_cid(packet);
loc_seid = avdtp_subevent_signaling_accept_get_local_seid(packet); loc_seid = avdtp_subevent_signaling_accept_get_local_seid(packet);
a2dp_emit_cmd_rejected(a2dp_sink_context.a2dp_callback, packet, size); a2dp_emit_cmd_rejected(a2dp_sink_context.a2dp_callback, packet, size);
app_state = A2DP_IDLE;
break; break;
case AVDTP_SUBEVENT_STREAMING_CONNECTION_RELEASED: case AVDTP_SUBEVENT_STREAMING_CONNECTION_RELEASED:
cid = avdtp_subevent_streaming_connection_released_get_avdtp_cid(packet); cid = avdtp_subevent_streaming_connection_released_get_avdtp_cid(packet);

View File

@ -307,7 +307,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t * connection, uint8_t
break; break;
case AVDTP_SI_START: case AVDTP_SI_START:
if (stream_endpoint->state != AVDTP_STREAM_ENDPOINT_OPENED){ 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; stream_endpoint->acceptor_config_state = AVDTP_ACCEPTOR_W2_REJECT_CATEGORY_WITH_ERROR_CODE;
connection->error_code = BAD_STATE; connection->error_code = BAD_STATE;
connection->reject_signal_identifier = connection->signaling_packet.signal_identifier; connection->reject_signal_identifier = connection->signaling_packet.signal_identifier;

View File

@ -155,9 +155,9 @@ void avdtp_initiator_stream_config_subsm(avdtp_connection_t * connection, uint8_
if (!is_avdtp_remote_seid_registered(stream_endpoint)){ if (!is_avdtp_remote_seid_registered(stream_endpoint)){
stream_endpoint->remote_sep = sep; 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); log_info("INT: update seid %d, to %p", stream_endpoint->remote_sep.seid, stream_endpoint);
} }
stream_endpoint->state = AVDTP_STREAM_ENDPOINT_OPENED;
break; break;
case AVDTP_SI_SET_CONFIGURATION:{ case AVDTP_SI_SET_CONFIGURATION:{

View File

@ -490,7 +490,7 @@ void avdtp_prepare_capabilities(avdtp_signaling_packet_t * signaling_packet, uin
for (i = 1; i < 9; i++){ for (i = 1; i < 9; i++){
int registered_category = get_bit16(registered_service_categories, 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 // TODO: introduce bitmap of mandatory categories
if (i == 1){ if (i == 1){
registered_category = 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->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->signal_identifier = (avdtp_signal_identifier_t)identifier;
signaling_packet->transaction_label = transaction_label; signaling_packet->transaction_label = transaction_label;
} }

View File

@ -609,6 +609,7 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
break; break;
case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CAPABILITY: case AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CAPABILITY:
printf("Received SBC codec capabilities\n"); 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.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.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.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[] = { static uint8_t media_sbc_codec_reconfiguration[] = {
(AVDTP_SBC_44100 << 4) | AVDTP_SBC_STEREO, // (AVDTP_SBC_44100 << 4) | AVDTP_SBC_STEREO,
(AVDTP_SBC_BLOCK_LENGTH_16 << 4) | (AVDTP_SBC_SUBBANDS_8 << 2) | AVDTP_SBC_ALLOCATION_METHOD_SNR, // (AVDTP_SBC_BLOCK_LENGTH_16 << 4) | (AVDTP_SBC_SUBBANDS_8 << 2) | AVDTP_SBC_ALLOCATION_METHOD_SNR,
2, 53 // 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 #ifdef HAVE_BTSTACK_STDIN
@ -773,6 +777,7 @@ static void stdin_process(char cmd){
break; break;
case 'R': case 'R':
printf("Reconfigure stream endpoint with seid %d\n", remote_seid); 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_bitmap = store_bit16(remote_configuration_bitmap, AVDTP_MEDIA_CODEC, 1);
remote_configuration.media_codec.media_type = AVDTP_AUDIO; remote_configuration.media_codec.media_type = AVDTP_AUDIO;
remote_configuration.media_codec.media_codec_type = AVDTP_CODEC_SBC; remote_configuration.media_codec.media_codec_type = AVDTP_CODEC_SBC;