mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-14 10:21:49 +00:00
le_audio: update utils
This commit is contained in:
parent
ba008c5f2d
commit
d21278d067
@ -104,7 +104,8 @@ extern "C" {
|
||||
#define LE_AUDIO_CONTEXT_MASK_NOTIFICATIONS 0x0100 // Notification and reminder sounds; attention-seeking audio, for example, in beeps signaling the arrival of a message
|
||||
#define LE_AUDIO_CONTEXT_MASK_RINGTONE 0x0200 // Alerts the user to an incoming call, for example, an incoming telephony or video call, including traditional cellular as well as VoIP and Push-to-Talk
|
||||
#define LE_AUDIO_CONTEXT_MASK_ALERTS 0x0400 // Alarms and timers; immediate alerts, for example, in a critical battery alarm, timer expiry or alarm clock, toaster, cooker, kettle, microwave, etc.
|
||||
#define LE_AUDIO_CONTEXT_MASK_EMERGENCY_ALARM 0x0800 //Emergency alarm Emergency sounds, for example, fire alarms or other urgent alerts
|
||||
#define LE_AUDIO_CONTEXT_MASK_EMERGENCY_ALARM 0x0800 // Emergency alarm Emergency sounds, for example, fire alarms or other urgent alerts
|
||||
#define LE_AUDIO_CONTEXT_MASK_ANY 0x0FFF // Combination of all above
|
||||
#define LE_AUDIO_CONTEXT_MASK_RFU 0xF000
|
||||
|
||||
#define LE_AUDIO_OTC_MIN_OBJECT_ID_VALUE 0x000000000100
|
||||
@ -321,6 +322,9 @@ typedef struct {
|
||||
uint16_t vendor_specific_company_id;
|
||||
uint8_t vendor_specific_metadata_length;
|
||||
uint8_t vendor_specific_metadata[LE_AUDIO_VENDOR_SPECIFIC_METADATA_MAX_LENGTH];
|
||||
|
||||
uint8_t unsupported_type;
|
||||
|
||||
} le_audio_metadata_t;
|
||||
|
||||
typedef struct {
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include "btstack_util.h"
|
||||
#include "btstack_debug.h"
|
||||
#include "le-audio/le_audio_util.h"
|
||||
#include "btstack_event.h"
|
||||
|
||||
|
||||
static const le_audio_codec_configuration_t codec_specific_config_settings[] = {
|
||||
@ -259,7 +260,7 @@ uint16_t le_audio_util_metadata_virtual_memcpy(const le_audio_metadata_t * metad
|
||||
return stored_bytes;
|
||||
}
|
||||
|
||||
|
||||
// parse metadata, first unsupported type is stored in metadata.unsupported_type
|
||||
uint16_t le_audio_util_metadata_parse(const uint8_t *buffer, uint8_t buffer_size, le_audio_metadata_t * metadata){
|
||||
|
||||
// reset capabilities
|
||||
@ -299,9 +300,11 @@ uint16_t le_audio_util_metadata_parse(const uint8_t *buffer, uint8_t buffer_size
|
||||
metadata->metadata_mask |= (1 << ltv_type);
|
||||
break;
|
||||
case LE_AUDIO_METADATA_TYPE_CCID_LIST:
|
||||
metadata->ccids_num = btstack_min(ltv_len, LE_CCIDS_MAX_NUM);
|
||||
memcpy(metadata->ccids, &buffer[offset+1], metadata->ccids_num);
|
||||
metadata->metadata_mask |= (1 << ltv_type);
|
||||
if (ltv_len > 1){
|
||||
metadata->ccids_num = btstack_min(ltv_len - 1, LE_CCIDS_MAX_NUM);
|
||||
memcpy(metadata->ccids, &buffer[offset+1], metadata->ccids_num);
|
||||
metadata->metadata_mask |= (1 << ltv_type);
|
||||
}
|
||||
break;
|
||||
case LE_AUDIO_METADATA_TYPE_PARENTAL_RATING:
|
||||
parental_rating = (le_audio_parental_rating_t)buffer[offset+1];
|
||||
@ -333,6 +336,7 @@ uint16_t le_audio_util_metadata_parse(const uint8_t *buffer, uint8_t buffer_size
|
||||
break;
|
||||
default:
|
||||
metadata->metadata_mask |= (1 << LE_AUDIO_METADATA_TYPE_RFU);
|
||||
metadata->unsupported_type = ltv_type;
|
||||
break;
|
||||
}
|
||||
offset += ltv_len;
|
||||
@ -578,4 +582,135 @@ le_audio_codec_sampling_frequency_index_t le_audio_get_sampling_frequency_index(
|
||||
}
|
||||
}
|
||||
|
||||
void le_audio_util_metadata_using_mask_from_metadata_event(const uint8_t * packet, uint16_t packet_size, le_audio_metadata_t * metadata_out){
|
||||
UNUSED(packet_size);
|
||||
btstack_assert(metadata_out != NULL);
|
||||
if (packet_size == 0){
|
||||
return;
|
||||
}
|
||||
|
||||
memset(metadata_out, 0, sizeof(le_audio_metadata_t));
|
||||
metadata_out->metadata_mask = leaudio_subevent_ascs_server_metadata_get_metadata_mask(packet);
|
||||
|
||||
uint16_t metadata_type;
|
||||
for (metadata_type = (uint16_t)LE_AUDIO_METADATA_TYPE_PREFERRED_AUDIO_CONTEXTS; metadata_type < (uint16_t) LE_AUDIO_METADATA_TYPE_RFU; metadata_type++){
|
||||
if ((metadata_out->metadata_mask & (1 << metadata_type) ) != 0 ){
|
||||
|
||||
switch ((le_audio_metadata_type_t)metadata_type){
|
||||
case LE_AUDIO_METADATA_TYPE_PREFERRED_AUDIO_CONTEXTS:
|
||||
metadata_out->preferred_audio_contexts_mask = leaudio_subevent_ascs_server_metadata_get_preferred_audio_contexts_mask(packet);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_STREAMING_AUDIO_CONTEXTS:
|
||||
metadata_out->streaming_audio_contexts_mask = leaudio_subevent_ascs_server_metadata_get_streaming_audio_contexts_mask(packet);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_PROGRAM_INFO:
|
||||
metadata_out->program_info_length = leaudio_subevent_ascs_server_metadata_get_program_info_length(packet);
|
||||
memcpy(metadata_out->program_info, leaudio_subevent_ascs_server_metadata_get_program_info(packet), metadata_out->program_info_length);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_LANGUAGE:
|
||||
metadata_out->language_code = leaudio_subevent_ascs_server_metadata_get_language_code(packet);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_CCID_LIST:
|
||||
metadata_out->ccids_num = leaudio_subevent_ascs_server_metadata_get_ccids_num(packet);
|
||||
memcpy(metadata_out->ccids, leaudio_subevent_ascs_server_metadata_get_ccids(packet), metadata_out->ccids_num);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_PARENTAL_RATING:
|
||||
metadata_out->parental_rating = (le_audio_parental_rating_t)leaudio_subevent_ascs_server_metadata_get_parental_rating(packet);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI:
|
||||
metadata_out->program_info_uri_length = leaudio_subevent_ascs_server_metadata_get_program_info_uri_length(packet);
|
||||
memcpy(metadata_out->program_info_uri, leaudio_subevent_ascs_server_metadata_get_program_info_uri(packet), metadata_out->program_info_uri_length);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_MAPPED_EXTENDED_METADATA_BIT_POSITION:
|
||||
metadata_out->extended_metadata_type = leaudio_subevent_ascs_server_metadata_get_extended_metadata_type(packet);
|
||||
metadata_out->extended_metadata_length = leaudio_subevent_ascs_server_metadata_get_extended_metadata_value_length(packet);
|
||||
memcpy(metadata_out->extended_metadata, leaudio_subevent_ascs_server_metadata_get_extended_metadata_value(packet), metadata_out->extended_metadata_length);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_MAPPED_VENDOR_SPECIFIC_METADATA_BIT_POSITION:
|
||||
metadata_out->vendor_specific_company_id = leaudio_subevent_ascs_server_metadata_get_vendor_specific_metadata_type(packet);
|
||||
metadata_out->vendor_specific_metadata_length = leaudio_subevent_ascs_server_metadata_get_vendor_specific_metadata_value_length(packet);
|
||||
memcpy(metadata_out->vendor_specific_metadata, leaudio_subevent_ascs_server_metadata_get_vendor_specific_metadata_value(packet), metadata_out->vendor_specific_metadata_length);
|
||||
break;
|
||||
|
||||
default:
|
||||
btstack_assert(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void le_audio_util_metadata_using_mask_from_enable_event(const uint8_t * packet, uint16_t packet_size, le_audio_metadata_t * metadata_out){
|
||||
UNUSED(packet_size);
|
||||
btstack_assert(metadata_out != NULL);
|
||||
if (packet_size == 0){
|
||||
return;
|
||||
}
|
||||
|
||||
memset(metadata_out, 0, sizeof(le_audio_metadata_t));
|
||||
metadata_out->metadata_mask = leaudio_subevent_ascs_server_metadata_get_metadata_mask(packet);
|
||||
|
||||
uint16_t metadata_type;
|
||||
for (metadata_type = (uint16_t)LE_AUDIO_METADATA_TYPE_PREFERRED_AUDIO_CONTEXTS; metadata_type < (uint16_t) LE_AUDIO_METADATA_TYPE_RFU; metadata_type++){
|
||||
if ((metadata_out->metadata_mask & (1 << metadata_type) ) != 0 ){
|
||||
|
||||
switch ((le_audio_metadata_type_t)metadata_type){
|
||||
case LE_AUDIO_METADATA_TYPE_PREFERRED_AUDIO_CONTEXTS:
|
||||
metadata_out->preferred_audio_contexts_mask = leaudio_subevent_ascs_server_enable_get_preferred_audio_contexts_mask(packet);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_STREAMING_AUDIO_CONTEXTS:
|
||||
metadata_out->streaming_audio_contexts_mask = leaudio_subevent_ascs_server_enable_get_streaming_audio_contexts_mask(packet);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_PROGRAM_INFO:
|
||||
metadata_out->program_info_length = leaudio_subevent_ascs_server_enable_get_program_info_length(packet);
|
||||
memcpy(metadata_out->program_info, leaudio_subevent_ascs_server_enable_get_program_info(packet), metadata_out->program_info_length);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_LANGUAGE:
|
||||
metadata_out->language_code = leaudio_subevent_ascs_server_enable_get_language_code(packet);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_CCID_LIST:
|
||||
metadata_out->ccids_num = leaudio_subevent_ascs_server_enable_get_ccids_num(packet);
|
||||
memcpy(metadata_out->ccids, leaudio_subevent_ascs_server_enable_get_ccids(packet), metadata_out->ccids_num);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_PARENTAL_RATING:
|
||||
metadata_out->parental_rating = (le_audio_parental_rating_t)leaudio_subevent_ascs_server_enable_get_parental_rating(packet);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI:
|
||||
metadata_out->program_info_uri_length = leaudio_subevent_ascs_server_enable_get_program_info_uri_length(packet);
|
||||
memcpy(metadata_out->program_info_uri, leaudio_subevent_ascs_server_enable_get_program_info_uri(packet), metadata_out->program_info_uri_length);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_MAPPED_EXTENDED_METADATA_BIT_POSITION:
|
||||
metadata_out->extended_metadata_type = leaudio_subevent_ascs_server_enable_get_extended_metadata_type(packet);
|
||||
metadata_out->extended_metadata_length = leaudio_subevent_ascs_server_enable_get_extended_metadata_value_length(packet);
|
||||
memcpy(metadata_out->extended_metadata, leaudio_subevent_ascs_server_enable_get_extended_metadata_value(packet), metadata_out->extended_metadata_length);
|
||||
break;
|
||||
|
||||
case LE_AUDIO_METADATA_TYPE_MAPPED_VENDOR_SPECIFIC_METADATA_BIT_POSITION:
|
||||
metadata_out->vendor_specific_company_id = leaudio_subevent_ascs_server_enable_get_vendor_specific_metadata_type(packet);
|
||||
metadata_out->vendor_specific_metadata_length = leaudio_subevent_ascs_server_enable_get_vendor_specific_metadata_value_length(packet);
|
||||
memcpy(metadata_out->vendor_specific_metadata, leaudio_subevent_ascs_server_enable_get_vendor_specific_metadata_value(packet), metadata_out->vendor_specific_metadata_length);
|
||||
break;
|
||||
|
||||
default:
|
||||
btstack_assert(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -63,6 +63,8 @@ uint16_t le_audio_util_metadata_serialize(const le_audio_metadata_t *metadata, u
|
||||
|
||||
uint16_t le_audio_util_metadata_serialize_using_mask(const le_audio_metadata_t *metadata, uint8_t * tlv_buffer, uint16_t tlv_buffer_size);
|
||||
|
||||
void le_audio_util_metadata_using_mask_from_metadata_event(const uint8_t * packet, uint16_t packet_size, le_audio_metadata_t * metadata);
|
||||
void le_audio_util_metadata_using_mask_from_enable_event(const uint8_t * packet, uint16_t packet_size, le_audio_metadata_t * metadata);
|
||||
|
||||
btstack_lc3_frame_duration_t le_audio_util_get_btstack_lc3_frame_duration(le_audio_codec_frame_duration_index_t frame_duration_index);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user