From f08f4934f31cf992e4c7df753556e2e10ca62d73 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Sat, 11 Jul 2020 18:20:10 +0200 Subject: [PATCH] avdtp: emit media codec other based on local stream endpoint --- src/classic/avdtp.c | 19 ++++++++++++++++- src/classic/avdtp.h | 3 +++ src/classic/avdtp_initiator.c | 6 +++++- src/classic/avdtp_util.c | 40 +++++++++++++---------------------- src/classic/avdtp_util.h | 7 ++++-- 5 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/classic/avdtp.c b/src/classic/avdtp.c index 5cb06e620..b4b67319b 100644 --- a/src/classic/avdtp.c +++ b/src/classic/avdtp.c @@ -162,7 +162,9 @@ void avdtp_emit_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t configuration->media_codec.media_codec_information); break; default: - avdtp_signaling_emit_media_codec_other_configuration(packet_handler, avdtp_cid, local_seid, remote_seid, configuration->media_codec); + avdtp_signaling_emit_media_codec_other_configuration(stream_endpoint, avdtp_cid, + local_seid, remote_seid, + configuration->media_codec); break; } } @@ -261,6 +263,21 @@ void avdtp_signaling_emit_media_codec_sbc_reconfiguration(avdtp_stream_endpoint_ media_codec_information, 1); } +void avdtp_signaling_emit_media_codec_other_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid, + uint8_t local_seid, uint8_t remote_seid, + adtvp_media_codec_capabilities_t media_codec) { + btstack_packet_handler_t packet_handler = avdtp_packet_handler_for_stream_endpoint(stream_endpoint); + avdtp_signaling_emit_media_codec_other(packet_handler, avdtp_cid, local_seid, remote_seid, media_codec, 0); +} + +void +avdtp_signaling_emit_media_codec_other_reconfiguration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid, + uint8_t local_seid, uint8_t remote_seid, + adtvp_media_codec_capabilities_t media_codec) { + btstack_packet_handler_t packet_handler = avdtp_packet_handler_for_stream_endpoint(stream_endpoint); + avdtp_signaling_emit_media_codec_other(packet_handler, avdtp_cid, local_seid, remote_seid, media_codec, 1); +} + btstack_linked_list_t * avdtp_get_stream_endpoints(void){ return &stream_endpoints; } diff --git a/src/classic/avdtp.h b/src/classic/avdtp.h index a206b58d4..96e9311ad 100644 --- a/src/classic/avdtp.h +++ b/src/classic/avdtp.h @@ -616,6 +616,9 @@ void avdtp_signaling_emit_media_codec_sbc_configuration(avdtp_stream_endpoint_t void avdtp_signaling_emit_media_codec_sbc_reconfiguration(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, + uint8_t local_seid, uint8_t remote_seid, + adtvp_media_codec_capabilities_t media_codec); uint8_t is_avdtp_remote_seid_registered(avdtp_stream_endpoint_t * stream_endpoint); diff --git a/src/classic/avdtp_initiator.c b/src/classic/avdtp_initiator.c index 273bc22a0..41c0ffcee 100644 --- a/src/classic/avdtp_initiator.c +++ b/src/classic/avdtp_initiator.c @@ -196,7 +196,11 @@ void avdtp_initiator_stream_config_subsm(avdtp_connection_t * connection, uint8_ break; default: // TODO: we don\t have codec info to emit config - avdtp_signaling_emit_media_codec_other_configuration(context->avdtp_callback, connection->avdtp_cid, connection->initiator_local_seid, connection->initiator_remote_seid, sep.configuration.media_codec); + avdtp_signaling_emit_media_codec_other_configuration(stream_endpoint, + connection->avdtp_cid, + connection->initiator_local_seid, + connection->initiator_remote_seid, + sep.configuration.media_codec); break; } break; diff --git a/src/classic/avdtp_util.c b/src/classic/avdtp_util.c index 39dc73017..0b41474dc 100644 --- a/src/classic/avdtp_util.c +++ b/src/classic/avdtp_util.c @@ -692,7 +692,21 @@ static void avdtp_signaling_emit_media_codec_other_capability(btstack_packet_han (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event)); } -static inline void avdtp_signaling_emit_media_codec_other(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, adtvp_media_codec_capabilities_t media_codec, uint8_t reconfigure){ +static void avdtp_signaling_emit_capability_done(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid){ + btstack_assert(callback != NULL); + uint8_t event[7]; + int pos = 0; + event[pos++] = HCI_EVENT_AVDTP_META; + event[pos++] = sizeof(event) - 2; + event[pos++] = AVDTP_SUBEVENT_SIGNALING_CAPABILITIES_DONE; + little_endian_store_16(event, pos, avdtp_cid); + pos += 2; + event[pos++] = local_seid; + event[pos++] = remote_seid; + (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event)); +} + +void avdtp_signaling_emit_media_codec_other(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, adtvp_media_codec_capabilities_t media_codec, uint8_t reconfigure){ btstack_assert(callback != NULL); uint8_t event[MAX_MEDIA_CODEC_INFORMATION_LENGTH + 13]; int pos = 0; @@ -717,30 +731,6 @@ static inline void avdtp_signaling_emit_media_codec_other(btstack_packet_handler (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event)); } -static void avdtp_signaling_emit_capability_done(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid){ - btstack_assert(callback != NULL); - uint8_t event[7]; - int pos = 0; - event[pos++] = HCI_EVENT_AVDTP_META; - event[pos++] = sizeof(event) - 2; - event[pos++] = AVDTP_SUBEVENT_SIGNALING_CAPABILITIES_DONE; - little_endian_store_16(event, pos, avdtp_cid); - pos += 2; - event[pos++] = local_seid; - event[pos++] = remote_seid; - (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event)); -} - -void avdtp_signaling_emit_media_codec_other_configuration(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, adtvp_media_codec_capabilities_t media_codec){ - btstack_assert(callback != NULL); - avdtp_signaling_emit_media_codec_other(callback, avdtp_cid, local_seid, remote_seid, media_codec, 0); -} - -void avdtp_signaling_emit_media_codec_other_reconfiguration(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, adtvp_media_codec_capabilities_t media_codec){ - btstack_assert(callback != NULL); - avdtp_signaling_emit_media_codec_other(callback, avdtp_cid, local_seid, remote_seid, media_codec, 1); -} - void avdtp_emit_capabilities(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, avdtp_capabilities_t * capabilities, uint16_t registered_service_categories){ if (get_bit16(registered_service_categories, AVDTP_MEDIA_CODEC)){ switch (capabilities->media_codec.media_codec_type){ diff --git a/src/classic/avdtp_util.h b/src/classic/avdtp_util.h index fd1693ca5..6a3bfd001 100644 --- a/src/classic/avdtp_util.h +++ b/src/classic/avdtp_util.h @@ -82,8 +82,11 @@ void avdtp_signaling_emit_reject(btstack_packet_handler_t callback, uint16_t avd void avdtp_emit_capabilities(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, avdtp_capabilities_t * configuration, uint16_t configured_service_categories); -void avdtp_signaling_emit_media_codec_other_configuration(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t int_seid, uint8_t acp_seid, adtvp_media_codec_capabilities_t media_codec); -void avdtp_signaling_emit_media_codec_other_reconfiguration(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t int_seid, uint8_t acp_seid, adtvp_media_codec_capabilities_t media_codec); +void +avdtp_signaling_emit_media_codec_other_reconfiguration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid, + uint8_t local_seid, uint8_t remote_seid, + adtvp_media_codec_capabilities_t media_codec); +void avdtp_signaling_emit_media_codec_other(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, adtvp_media_codec_capabilities_t media_codec, uint8_t reconfigure); uint8_t avdtp_request_can_send_now_acceptor(avdtp_connection_t * connection, uint16_t l2cap_cid); uint8_t avdtp_request_can_send_now_initiator(avdtp_connection_t * connection, uint16_t l2cap_cid);