a2dp_sink.c (98137b165c29e62b49279861496d926acc2e3f9d) a2dp_sink.c (a95794cee1b77dd0c805e8606c008222803b81c5)
1/*
2 * Copyright (C) 2016 BlueKitchen GmbH
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright

--- 43 unchanged lines hidden (view full) ---

52static const char * default_a2dp_sink_service_name = "BTstack A2DP Sink Service";
53static const char * default_a2dp_sink_service_provider_name = "BTstack A2DP Sink Service Provider";
54
55static bool outgoing_active = false;
56static uint16_t a2dp_sink_cid;
57static bool stream_endpoint_configured = false;
58
59static btstack_packet_handler_t a2dp_sink_packet_handler_user;
1/*
2 * Copyright (C) 2016 BlueKitchen GmbH
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright

--- 43 unchanged lines hidden (view full) ---

52static const char * default_a2dp_sink_service_name = "BTstack A2DP Sink Service";
53static const char * default_a2dp_sink_service_provider_name = "BTstack A2DP Sink Service Provider";
54
55static bool outgoing_active = false;
56static uint16_t a2dp_sink_cid;
57static bool stream_endpoint_configured = false;
58
59static btstack_packet_handler_t a2dp_sink_packet_handler_user;
60static uint8_t (*a2dp_sink_media_config_validator)(const avdtp_stream_endpoint_t * stream_endpoint, const uint8_t * event, uint16_t size);
60
61static void a2dp_sink_packet_handler_internal(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
62
63void a2dp_sink_create_sdp_record(uint8_t * service, uint32_t service_record_handle, uint16_t supported_features, const char * service_name, const char * service_provider_name){
64 uint8_t* attribute;
65 de_create_sequence(service);
66
67 // 0x0000 "Service Record Handle"

--- 260 unchanged lines hidden (view full) ---

328 a2dp_replace_subevent_id_and_emit_cmd(a2dp_sink_packet_handler_user, packet, size, A2DP_SUBEVENT_SIGNALING_CONNECTION_RELEASED);
329 break;
330 default:
331 break;
332 }
333
334}
335
61
62static void a2dp_sink_packet_handler_internal(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
63
64void a2dp_sink_create_sdp_record(uint8_t * service, uint32_t service_record_handle, uint16_t supported_features, const char * service_name, const char * service_provider_name){
65 uint8_t* attribute;
66 de_create_sequence(service);
67
68 // 0x0000 "Service Record Handle"

--- 260 unchanged lines hidden (view full) ---

329 a2dp_replace_subevent_id_and_emit_cmd(a2dp_sink_packet_handler_user, packet, size, A2DP_SUBEVENT_SIGNALING_CONNECTION_RELEASED);
330 break;
331 default:
332 break;
333 }
334
335}
336
337static uint8_t a2dp_sink_media_config_validator_callback(const avdtp_stream_endpoint_t * stream_endpoint, const uint8_t * event, uint16_t size){
338 uint8_t error = 0;
339 if (a2dp_sink_media_config_validator == NULL) {
340 // update subevent id and call validator
341 uint8_t avdtp_subevent_id = event[2];
342 uint8_t a2dp_subevent_id = a2dp_subevent_id_for_avdtp_subevent_id(avdtp_subevent_id);
343 uint8_t * subevent_field = (uint8_t *) &event[2];
344 *subevent_field = a2dp_subevent_id;
345 error = (*a2dp_sink_media_config_validator)(stream_endpoint, event, size);
346 *subevent_field = avdtp_subevent_id;
347 }
348 return error;
349}
350
351void a2dp_sink_register_media_config_validator(uint8_t (*callback)(const avdtp_stream_endpoint_t * stream_endpoint, const uint8_t * event, uint16_t size)){
352 a2dp_sink_media_config_validator = callback;
353 avdtp_sink_register_media_config_validator(&a2dp_sink_media_config_validator_callback);
354}