mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-16 08:42:28 +00:00
avdtp sink: fix reconfigure, pts tests green
This commit is contained in:
parent
b0d75c910f
commit
21b232ce00
@ -223,7 +223,7 @@ static inline void a2dp_signaling_emit_media_codec_sbc(btstack_packet_handler_t
|
||||
|
||||
static inline void avdtp_signaling_emit_media_codec_other(btstack_packet_handler_t callback, uint8_t * event, uint16_t event_size){
|
||||
if (!callback) return;
|
||||
if (event_size < 112) return;
|
||||
if (event_size < 113) return;
|
||||
event[0] = HCI_EVENT_A2DP_META;
|
||||
event[2] = A2DP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CONFIGURATION;
|
||||
}
|
||||
|
@ -215,11 +215,11 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t * connection, uint8_t
|
||||
|
||||
if (stream_endpoint->remote_sep_index != AVDTP_INVALID_SEP_INDEX){
|
||||
if (stream_endpoint->connection->remote_seps[stream_endpoint->remote_sep_index].in_use){
|
||||
if (stream_endpoint->state < AVDTP_STREAM_ENDPOINT_OPENED){
|
||||
stream_endpoint->connection->remote_seps[stream_endpoint->remote_sep_index] = sep;
|
||||
log_info(" ACP: update seid %d, to %p", stream_endpoint->connection->remote_seps[stream_endpoint->remote_sep_index].seid, stream_endpoint);
|
||||
break;
|
||||
}
|
||||
// if (stream_endpoint->state < AVDTP_STREAM_ENDPOINT_OPENED){
|
||||
// stream_endpoint->connection->remote_seps[stream_endpoint->remote_sep_index] = sep;
|
||||
// log_info(" ACP: update seid %d, to %p", stream_endpoint->connection->remote_seps[stream_endpoint->remote_sep_index].seid, stream_endpoint);
|
||||
// break;
|
||||
// }
|
||||
// reject if already configured
|
||||
connection->error_code = SEP_IN_USE;
|
||||
// find first registered category and fire the error
|
||||
@ -261,14 +261,11 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t * connection, uint8_t
|
||||
case AVDTP_SI_RECONFIGURE:{
|
||||
stream_endpoint->acceptor_config_state = AVDTP_ACCEPTOR_W2_ANSWER_RECONFIGURE;
|
||||
connection->reject_service_category = 0;
|
||||
|
||||
|
||||
avdtp_sep_t sep;
|
||||
sep.seid = connection->local_seid;
|
||||
log_info(" ACP: AVDTP_ACCEPTOR_W2_ANSWER_RECONFIGURE seid %d", sep.seid);
|
||||
// log_info_hexdump(connection->signaling_packet.command, packet_size);
|
||||
|
||||
sep.configured_service_categories = avdtp_unpack_service_capabilities(connection, &sep.configuration, connection->signaling_packet.command+offset, packet_size-offset);
|
||||
|
||||
if (connection->error_code){
|
||||
// fire configuration parsing errors
|
||||
connection->reject_signal_identifier = connection->signaling_packet.signal_identifier;
|
||||
@ -277,7 +274,6 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t * connection, uint8_t
|
||||
}
|
||||
|
||||
// find sep or raise error
|
||||
|
||||
stream_endpoint->remote_sep_index = avdtp_find_remote_sep(stream_endpoint->connection, sep.seid);
|
||||
if (stream_endpoint->remote_sep_index == AVDTP_INVALID_SEP_INDEX){
|
||||
log_info(" ACP: REJECT AVDTP_SI_RECONFIGURE, BAD_ACP_SEID");
|
||||
@ -292,10 +288,10 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t * connection, uint8_t
|
||||
if (get_bit16(sep.configured_service_categories, AVDTP_MEDIA_CODEC)){
|
||||
switch (sep.capabilities.media_codec.media_codec_type){
|
||||
case AVDTP_CODEC_SBC:
|
||||
avdtp_signaling_emit_media_codec_sbc_reconfiguration(context->avdtp_callback, connection->avdtp_cid, avdtp_local_seid(stream_endpoint), avdtp_remote_seid(stream_endpoint), sep.capabilities.media_codec);
|
||||
avdtp_signaling_emit_media_codec_sbc_reconfiguration(context->avdtp_callback, connection->avdtp_cid, avdtp_local_seid(stream_endpoint), avdtp_remote_seid(stream_endpoint), sep.configuration.media_codec);
|
||||
break;
|
||||
default:
|
||||
avdtp_signaling_emit_media_codec_other_reconfiguration(context->avdtp_callback, connection->avdtp_cid, avdtp_local_seid(stream_endpoint), avdtp_remote_seid(stream_endpoint), sep.capabilities.media_codec);
|
||||
avdtp_signaling_emit_media_codec_other_reconfiguration(context->avdtp_callback, connection->avdtp_cid, avdtp_local_seid(stream_endpoint), avdtp_remote_seid(stream_endpoint), sep.configuration.media_codec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -47,6 +47,8 @@
|
||||
#include "avdtp.h"
|
||||
#include "avdtp_util.h"
|
||||
|
||||
#define MAX_MEDIA_CODEC_INFORMATION_LENGTH 100
|
||||
|
||||
void avdtp_initialize_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint){
|
||||
stream_endpoint->connection = NULL;
|
||||
stream_endpoint->state = AVDTP_STREAM_ENDPOINT_IDLE;
|
||||
@ -752,7 +754,7 @@ void avdtp_signaling_emit_media_codec_sbc_reconfiguration(btstack_packet_handler
|
||||
}
|
||||
|
||||
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){
|
||||
uint8_t event[112];
|
||||
uint8_t event[MAX_MEDIA_CODEC_INFORMATION_LENGTH + 13];
|
||||
int pos = 0;
|
||||
event[pos++] = HCI_EVENT_AVDTP_META;
|
||||
event[pos++] = sizeof(event) - 2;
|
||||
@ -762,18 +764,15 @@ static inline void avdtp_signaling_emit_media_codec_other(btstack_packet_handler
|
||||
event[pos++] = local_seid;
|
||||
event[pos++] = remote_seid;
|
||||
event[pos++] = reconfigure;
|
||||
|
||||
event[pos++] = media_codec.media_type;
|
||||
little_endian_store_16(event, pos, media_codec.media_codec_type);
|
||||
pos += 2;
|
||||
little_endian_store_16(event, pos, media_codec.media_codec_information_len);
|
||||
pos += 2;
|
||||
|
||||
if (media_codec.media_codec_information_len < 100){
|
||||
memcpy(event+pos, media_codec.media_codec_information, media_codec.media_codec_information_len);
|
||||
} else {
|
||||
memcpy(event+pos, media_codec.media_codec_information, 100);
|
||||
}
|
||||
int media_codec_len = btstack_min(MAX_MEDIA_CODEC_INFORMATION_LENGTH, media_codec.media_codec_information_len);
|
||||
memcpy(event+pos, media_codec.media_codec_information, media_codec_len);
|
||||
|
||||
(*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
|
||||
}
|
||||
|
||||
|
2
test/pts/.gitignore
vendored
2
test/pts/.gitignore
vendored
@ -1,4 +1,6 @@
|
||||
ancs_client
|
||||
avdtp_sink.sbc
|
||||
avdtp_sink.wav
|
||||
avdtp_sink_test
|
||||
avdtp_source_test
|
||||
avrcp_test
|
||||
|
@ -142,29 +142,10 @@ static uint16_t remote_configuration_bitmap;
|
||||
static avdtp_capabilities_t remote_configuration;
|
||||
static avdtp_context_t a2dp_sink_context;
|
||||
|
||||
typedef enum {
|
||||
AVDTP_APPLICATION_IDLE,
|
||||
AVDTP_APPLICATION_W2_DISCOVER_SEPS,
|
||||
AVDTP_APPLICATION_W2_GET_CAPABILITIES,
|
||||
AVDTP_APPLICATION_W2_GET_ALL_CAPABILITIES,
|
||||
AVDTP_APPLICATION_W2_SET_CONFIGURATION,
|
||||
AVDTP_APPLICATION_W2_SUSPEND_STREAM_WITH_SEID,
|
||||
AVDTP_APPLICATION_W2_RECONFIGURE_WITH_SEID,
|
||||
AVDTP_APPLICATION_W2_OPEN_STREAM_WITH_SEID,
|
||||
AVDTP_APPLICATION_W2_START_STREAM_WITH_SEID,
|
||||
AVDTP_APPLICATION_W2_ABORT_STREAM_WITH_SEID,
|
||||
AVDTP_APPLICATION_W2_STOP_STREAM_WITH_SEID,
|
||||
AVDTP_APPLICATION_W2_GET_CONFIGURATION
|
||||
} avdtp_application_state_t;
|
||||
|
||||
avdtp_application_state_t app_state = AVDTP_APPLICATION_IDLE;
|
||||
|
||||
static btstack_packet_callback_registration_t hci_event_callback_registration;
|
||||
|
||||
static int media_initialized = 0;
|
||||
|
||||
|
||||
|
||||
#ifdef HAVE_PORTAUDIO
|
||||
static int patestCallback( const void *inputBuffer, void *outputBuffer,
|
||||
unsigned long framesPerBuffer,
|
||||
@ -411,95 +392,76 @@ static void dump_sbc_configuration(avdtp_media_codec_configuration_sbc_t configu
|
||||
|
||||
|
||||
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);
|
||||
|
||||
bd_addr_t event_addr;
|
||||
switch (packet_type) {
|
||||
|
||||
case HCI_EVENT_PACKET:
|
||||
switch (hci_event_packet_get_type(packet)) {
|
||||
case HCI_EVENT_PIN_CODE_REQUEST:
|
||||
// inform about pin code request
|
||||
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");
|
||||
break;
|
||||
case HCI_EVENT_DISCONNECTION_COMPLETE:
|
||||
// connection closed -> quit test app
|
||||
printf("\n --- avdtp_test: HCI_EVENT_DISCONNECTION_COMPLETE ---\n");
|
||||
close_media_processing();
|
||||
break;
|
||||
case HCI_EVENT_AVDTP_META:
|
||||
switch (packet[2]){
|
||||
case AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED:
|
||||
avdtp_cid = avdtp_subevent_signaling_connection_established_get_avdtp_cid(packet);
|
||||
printf("\n --- avdtp_test: AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED, cid 0x%02x ---\n", avdtp_cid);
|
||||
break;
|
||||
case AVDTP_SUBEVENT_SIGNALING_SEP_FOUND:
|
||||
if (app_state != AVDTP_APPLICATION_W2_DISCOVER_SEPS) return;
|
||||
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:
|
||||
app_state = AVDTP_APPLICATION_IDLE;
|
||||
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:{
|
||||
app_state = AVDTP_APPLICATION_IDLE;
|
||||
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);
|
||||
// // TODO: use actual config
|
||||
// btstack_sbc_encoder_init(&local_stream_endpoint->sbc_encoder_state, SBC_MODE_STANDARD, 16, 8, 2, 44100, 53);
|
||||
|
||||
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. not implemented\n");
|
||||
break;
|
||||
case AVDTP_SUBEVENT_SIGNALING_ACCEPT:
|
||||
app_state = AVDTP_APPLICATION_IDLE;
|
||||
break;
|
||||
default:
|
||||
printf(" not implemented\n");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
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:
|
||||
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("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;
|
||||
default:
|
||||
// other packet type
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -528,18 +490,18 @@ static void show_usage(void){
|
||||
gap_local_bd_addr(iut_address);
|
||||
printf("\n--- Bluetooth AVDTP SINK Test Console %s ---\n", bd_addr_to_str(iut_address));
|
||||
printf("c - create connection to addr %s\n", device_addr_string);
|
||||
printf("C - disconnect\n");
|
||||
printf("d - discover stream endpoints\n");
|
||||
printf("g - get capabilities\n");
|
||||
printf("a - get all capabilities\n");
|
||||
printf("s - set configuration\n");
|
||||
printf("f - get configuration\n");
|
||||
printf("R - reconfigure stream with %d\n", sep.seid);
|
||||
printf("o - open stream with seid %d\n", sep.seid);
|
||||
printf("o - establish stream with seid %d\n", sep.seid);
|
||||
printf("m - start stream with %d\n", sep.seid);
|
||||
printf("A - abort stream with %d\n", sep.seid);
|
||||
printf("S - stop stream with %d\n", sep.seid);
|
||||
printf("P - suspend stream with %d\n", sep.seid);
|
||||
printf("P - suspend (pause) stream with %d\n", sep.seid);
|
||||
printf("S - stop (release) stream with %d\n", sep.seid);
|
||||
printf("C - disconnect\n");
|
||||
printf("Ctrl-c - exit\n");
|
||||
printf("---\n");
|
||||
}
|
||||
@ -548,31 +510,31 @@ static void stdin_process(char cmd){
|
||||
sep.seid = 1;
|
||||
switch (cmd){
|
||||
case 'c':
|
||||
printf("Creating L2CAP Connection to %s, BLUETOOTH_PROTOCOL_AVDTP\n", device_addr_string);
|
||||
printf("Establish AVDTP Sink connection to %s\n", device_addr_string);
|
||||
avdtp_sink_connect(device_addr, &avdtp_cid);
|
||||
break;
|
||||
case 'C':
|
||||
printf("Disconnect not implemented\n");
|
||||
printf("Disconnect AVDTP Sink\n");
|
||||
avdtp_sink_disconnect(avdtp_cid);
|
||||
break;
|
||||
case 'd':
|
||||
app_state = AVDTP_APPLICATION_W2_DISCOVER_SEPS;
|
||||
printf("Discover stream endpoints of %s\n", device_addr_string);
|
||||
avdtp_sink_discover_stream_endpoints(avdtp_cid);
|
||||
break;
|
||||
case 'g':
|
||||
app_state = AVDTP_APPLICATION_W2_GET_CAPABILITIES;
|
||||
printf("Get capabilities of stream endpoint with seid %d\n", sep.seid);
|
||||
avdtp_sink_get_capabilities(avdtp_cid, sep.seid);
|
||||
break;
|
||||
case 'a':
|
||||
app_state = AVDTP_APPLICATION_W2_GET_ALL_CAPABILITIES;
|
||||
printf("Get all capabilities of stream endpoint with seid %d\n", sep.seid);
|
||||
avdtp_sink_get_all_capabilities(avdtp_cid, sep.seid);
|
||||
break;
|
||||
case 'f':
|
||||
app_state = AVDTP_APPLICATION_W2_GET_CONFIGURATION;
|
||||
printf("Get configuration of stream endpoint with seid %d\n", sep.seid);
|
||||
avdtp_sink_get_configuration(avdtp_cid, sep.seid);
|
||||
break;
|
||||
case 's':
|
||||
app_state = AVDTP_APPLICATION_W2_SET_CONFIGURATION;
|
||||
printf("Set configuration of stream endpoint with seid %d\n", sep.seid);
|
||||
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;
|
||||
@ -581,7 +543,7 @@ static void stdin_process(char cmd){
|
||||
avdtp_sink_set_configuration(avdtp_cid, local_stream_endpoint->sep.seid, sep.seid, remote_configuration_bitmap, remote_configuration);
|
||||
break;
|
||||
case 'R':
|
||||
app_state = AVDTP_APPLICATION_W2_RECONFIGURE_WITH_SEID;
|
||||
printf("Reconfigure stream endpoint with seid %d\n", sep.seid);
|
||||
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;
|
||||
@ -590,24 +552,23 @@ static void stdin_process(char cmd){
|
||||
avdtp_sink_reconfigure(avdtp_cid, local_stream_endpoint->sep.seid, sep.seid, remote_configuration_bitmap, remote_configuration);
|
||||
break;
|
||||
case 'o':
|
||||
app_state = AVDTP_APPLICATION_W2_OPEN_STREAM_WITH_SEID;
|
||||
printf("Establish stream between local %d and remote %d seid\n", avdtp_local_seid(local_stream_endpoint), sep.seid);
|
||||
avdtp_sink_open_stream(avdtp_cid, local_stream_endpoint->sep.seid, sep.seid);
|
||||
break;
|
||||
case 'm':
|
||||
printf("AVDTP_APPLICATION_W2_START_STREAM_WITH_SEID \n");
|
||||
app_state = AVDTP_APPLICATION_W2_START_STREAM_WITH_SEID;
|
||||
printf("Start stream between local %d and remote %d seid\n", avdtp_local_seid(local_stream_endpoint), avdtp_remote_seid(local_stream_endpoint));
|
||||
avdtp_sink_start_stream(avdtp_cid, avdtp_local_seid(local_stream_endpoint));
|
||||
break;
|
||||
case 'A':
|
||||
app_state = AVDTP_APPLICATION_W2_ABORT_STREAM_WITH_SEID;
|
||||
printf("Abort stream between local %d and remote %d seid\n", avdtp_local_seid(local_stream_endpoint), avdtp_remote_seid(local_stream_endpoint));
|
||||
avdtp_sink_abort_stream(avdtp_cid, avdtp_local_seid(local_stream_endpoint));
|
||||
break;
|
||||
case 'S':
|
||||
app_state = AVDTP_APPLICATION_W2_STOP_STREAM_WITH_SEID;
|
||||
printf("Release stream between local %d and remote %d seid\n", avdtp_local_seid(local_stream_endpoint), avdtp_remote_seid(local_stream_endpoint));
|
||||
avdtp_sink_stop_stream(avdtp_cid, avdtp_local_seid(local_stream_endpoint));
|
||||
break;
|
||||
case 'P':
|
||||
app_state = AVDTP_APPLICATION_W2_SUSPEND_STREAM_WITH_SEID;
|
||||
printf("Susspend stream between local %d and remote %d seid\n", avdtp_local_seid(local_stream_endpoint), avdtp_remote_seid(local_stream_endpoint));
|
||||
avdtp_sink_suspend(avdtp_cid, avdtp_local_seid(local_stream_endpoint));
|
||||
break;
|
||||
|
||||
@ -625,7 +586,6 @@ static void stdin_process(char cmd){
|
||||
|
||||
int btstack_main(int argc, const char * argv[]);
|
||||
int btstack_main(int argc, const char * argv[]){
|
||||
|
||||
UNUSED(argc);
|
||||
(void)argv;
|
||||
|
||||
@ -635,26 +595,21 @@ int btstack_main(int argc, const char * argv[]){
|
||||
|
||||
l2cap_init();
|
||||
// Initialize AVDTP Sink
|
||||
avdtp_source_init(&a2dp_sink_context);
|
||||
avdtp_sink_init(&a2dp_sink_context);
|
||||
avdtp_sink_register_packet_handler(&packet_handler);
|
||||
|
||||
//#ifndef SMG_BI
|
||||
local_stream_endpoint = avdtp_sink_create_stream_endpoint(AVDTP_SINK, AVDTP_AUDIO);
|
||||
avdtp_sink_register_media_transport_category(local_stream_endpoint->sep.seid);
|
||||
avdtp_sink_register_media_codec_category(local_stream_endpoint->sep.seid, AVDTP_AUDIO, AVDTP_CODEC_SBC, media_sbc_codec_capabilities, sizeof(media_sbc_codec_capabilities));
|
||||
//#endif
|
||||
// uint8_t cp_type_lsb, uint8_t cp_type_msb, const uint8_t * cp_type_value, uint8_t cp_type_value_len
|
||||
// avdtp_sink_register_content_protection_category(seid, 2, 2, NULL, 0);
|
||||
|
||||
avdtp_sink_register_media_handler(&handle_l2cap_media_data_packet);
|
||||
printf("reistered media handler\n");
|
||||
// Initialize SDP
|
||||
sdp_init();
|
||||
memset(sdp_avdtp_sink_service_buffer, 0, sizeof(sdp_avdtp_sink_service_buffer));
|
||||
a2dp_sink_create_sdp_record(sdp_avdtp_sink_service_buffer, 0x10001, 1, NULL, NULL);
|
||||
sdp_register_service(sdp_avdtp_sink_service_buffer);
|
||||
|
||||
gap_set_local_name("BTstack A2DP Sink Test");
|
||||
gap_set_local_name("BTstack A2DP Sink PTS Test");
|
||||
gap_discoverable_control(1);
|
||||
gap_set_class_of_device(0x200408);
|
||||
|
||||
|
@ -443,7 +443,7 @@ int btstack_main(int argc, const char * argv[]){
|
||||
a2dp_source_create_sdp_record(sdp_avdtp_source_service_buffer, 0x10002, 1, NULL, NULL);
|
||||
sdp_register_service(sdp_avdtp_source_service_buffer);
|
||||
|
||||
gap_set_local_name("BTstack A2DP Source Test");
|
||||
gap_set_local_name("BTstack AVDTP Source PTS Test");
|
||||
gap_discoverable_control(1);
|
||||
gap_set_class_of_device(0x200408);
|
||||
|
||||
|
@ -535,7 +535,7 @@ int btstack_main(int argc, const char * argv[]){
|
||||
avrcp_controller_create_sdp_record(sdp_avrcp_controller_service_buffer, 0x10001, AVRCP_BROWSING_ENABLED, 1, NULL, NULL);
|
||||
sdp_register_service(sdp_avrcp_controller_service_buffer);
|
||||
|
||||
gap_set_local_name("BTstack A2DP Sink Test");
|
||||
gap_set_local_name("BTstack AVRCP PTS Test");
|
||||
gap_discoverable_control(1);
|
||||
gap_set_class_of_device(0x200408);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user