Lines Matching +full:merge +full:- +full:status

4  * Copyright (c) 2021-2024 Nordic Semiconductor ASA
6 * SPDX-License-Identifier: Apache-2.0
70 * 0-n octets of codec specific configuration
72 * 0-n octets of metadata
77 * 0-n octets of codec specific configuration
88 old_state = ep->status.state; in broadcast_source_set_ep_state()
90 LOG_DBG("ep %p id 0x%02x %s -> %s", ep, ep->status.id, bt_bap_ep_state_str(old_state), in broadcast_source_set_ep_state()
124 ep->status.state = state; in broadcast_source_set_ep_state()
131 SYS_SLIST_FOR_EACH_CONTAINER(&source->subgroups, subgroup, _node) { in broadcast_source_set_state()
134 SYS_SLIST_FOR_EACH_CONTAINER(&subgroup->streams, stream, _node) { in broadcast_source_set_state()
135 broadcast_source_set_ep_state(stream->ep, state); in broadcast_source_set_state()
145 struct bt_bap_ep *ep = iso->tx.ep; in broadcast_source_iso_sent()
152 stream = ep->stream; in broadcast_source_iso_sent()
158 ops = stream->ops; in broadcast_source_iso_sent()
161 LOG_DBG("stream %p ep %p", stream, stream->ep); in broadcast_source_iso_sent()
164 if (ops != NULL && ops->sent != NULL) { in broadcast_source_iso_sent()
165 ops->sent(stream); in broadcast_source_iso_sent()
174 struct bt_bap_ep *ep = iso->tx.ep; in broadcast_source_iso_connected()
181 stream = ep->stream; in broadcast_source_iso_connected()
191 stream->_prev_seq_num = 0U; in broadcast_source_iso_connected()
194 ops = stream->ops; in broadcast_source_iso_connected()
195 if (ops != NULL && ops->connected != NULL) { in broadcast_source_iso_connected()
196 ops->connected(stream); in broadcast_source_iso_connected()
201 if (ops != NULL && ops->started != NULL) { in broadcast_source_iso_connected()
202 ops->started(stream); in broadcast_source_iso_connected()
213 struct bt_bap_ep *ep = iso->tx.ep; in broadcast_source_iso_disconnected()
220 stream = ep->stream; in broadcast_source_iso_disconnected()
226 LOG_DBG("stream %p ep %p reason 0x%02x", stream, stream->ep, reason); in broadcast_source_iso_disconnected()
228 ops = stream->ops; in broadcast_source_iso_disconnected()
229 if (ops != NULL && ops->disconnected != NULL) { in broadcast_source_iso_disconnected()
230 ops->disconnected(stream, reason); in broadcast_source_iso_disconnected()
235 if (ops != NULL && ops->stopped != NULL) { in broadcast_source_iso_disconnected()
236 ops->stopped(stream, reason); in broadcast_source_iso_disconnected()
264 ep->dir = BT_AUDIO_DIR_SOURCE; in broadcast_source_ep_init()
265 ep->iso = NULL; in broadcast_source_ep_init()
273 /* If ep->stream is NULL the endpoint is unallocated */ in broadcast_source_new_ep()
274 if (ep->stream == NULL) { in broadcast_source_new_ep()
288 if (sys_slist_is_empty(&subgroup->streams)) { in broadcast_source_new_subgroup()
307 return -ENOMEM; in broadcast_source_setup_stream()
313 return -ENOMEM; in broadcast_source_setup_stream()
319 bt_bap_qos_cfg_to_iso_qos(iso->chan.qos->tx, qos); in broadcast_source_setup_stream()
322 iso->chan.qos->num_subevents = qos->num_subevents; in broadcast_source_setup_stream()
328 stream->qos = qos; in broadcast_source_setup_stream()
329 ep->broadcast_source = source; in broadcast_source_setup_stream()
344 SYS_SLIST_FOR_EACH_CONTAINER(&subgroup->streams, stream, _node) { in encode_base_subgroup()
348 codec_cfg = subgroup->codec_cfg; in encode_base_subgroup()
351 net_buf_simple_add_u8(buf, codec_cfg->id); in encode_base_subgroup()
352 net_buf_simple_add_le16(buf, codec_cfg->cid); in encode_base_subgroup()
353 net_buf_simple_add_le16(buf, codec_cfg->vid); in encode_base_subgroup()
355 net_buf_simple_add_u8(buf, codec_cfg->data_len); in encode_base_subgroup()
357 if ((buf->size - buf->len) < codec_cfg->data_len) { in encode_base_subgroup()
358 LOG_DBG("No room for config data: %zu", codec_cfg->data_len); in encode_base_subgroup()
362 net_buf_simple_add_mem(buf, codec_cfg->data, codec_cfg->data_len); in encode_base_subgroup()
365 if ((buf->size - buf->len) < sizeof(len)) { in encode_base_subgroup()
371 net_buf_simple_add_u8(buf, codec_cfg->meta_len); in encode_base_subgroup()
374 if ((buf->size - buf->len) < codec_cfg->meta_len) { in encode_base_subgroup()
375 LOG_DBG("No room for metadata data: %zu", codec_cfg->meta_len); in encode_base_subgroup()
380 net_buf_simple_add_mem(buf, codec_cfg->meta, codec_cfg->meta_len); in encode_base_subgroup()
388 if ((buf->size - buf->len) < (sizeof(bis_index) + sizeof(uint8_t))) { in encode_base_subgroup()
396 if ((buf->size - buf->len) < sizeof(len)) { in encode_base_subgroup()
404 if ((buf->size - buf->len) < stream_data[i].data_len) { in encode_base_subgroup()
426 if ((buf->size - buf->len) < MINIMUM_BASE_SIZE) { in encode_base()
431 SYS_SLIST_FOR_EACH_CONTAINER(&source->subgroups, subgroup, _node) { in encode_base()
437 net_buf_simple_add_le24(buf, source->qos->pd); in encode_base()
444 SYS_SLIST_FOR_EACH_CONTAINER(&source->subgroups, subgroup, _node) { in encode_base()
445 if (!encode_base_subgroup(subgroup, &source->stream_data[streams_encoded], in encode_base()
458 SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&source->subgroups, subgroup, next_subgroup, _node) { in broadcast_source_cleanup()
461 SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&subgroup->streams, stream, next_stream, _node) { in broadcast_source_cleanup()
462 bt_bap_iso_unbind_ep(stream->ep->iso, stream->ep); in broadcast_source_cleanup()
463 stream->ep->stream = NULL; in broadcast_source_cleanup()
464 stream->ep = NULL; in broadcast_source_cleanup()
465 stream->codec_cfg = NULL; in broadcast_source_cleanup()
466 stream->qos = NULL; in broadcast_source_cleanup()
467 stream->group = NULL; in broadcast_source_cleanup()
469 sys_slist_remove(&subgroup->streams, NULL, &stream->_node); in broadcast_source_cleanup()
471 sys_slist_remove(&source->subgroups, NULL, &subgroup->_node); in broadcast_source_cleanup()
487 CHECKIF(!IN_RANGE(param->params_count, 1U, CONFIG_BT_BAP_BROADCAST_SRC_SUBGROUP_COUNT)) { in valid_broadcast_source_param()
488 LOG_DBG("param->params_count %zu is invalid", param->params_count); in valid_broadcast_source_param()
492 CHECKIF(param->packing != BT_ISO_PACKING_SEQUENTIAL && in valid_broadcast_source_param()
493 param->packing != BT_ISO_PACKING_INTERLEAVED) { in valid_broadcast_source_param()
494 LOG_DBG("param->packing %u is invalid", param->packing); in valid_broadcast_source_param()
498 qos = param->qos; in valid_broadcast_source_param()
500 LOG_DBG("param->qos is NULL"); in valid_broadcast_source_param()
505 LOG_DBG("param->qos is invalid"); in valid_broadcast_source_param()
509 CHECKIF(param->qos->rtn > BT_ISO_BROADCAST_RTN_MAX) { in valid_broadcast_source_param()
510 LOG_DBG("param->qos->rtn %u invalid", param->qos->rtn); in valid_broadcast_source_param()
514 CHECKIF(param->params == NULL) { in valid_broadcast_source_param()
515 LOG_DBG("param->params is NULL"); in valid_broadcast_source_param()
519 CHECKIF(param->params_count == 0) { in valid_broadcast_source_param()
520 LOG_DBG("param->params_count is 0"); in valid_broadcast_source_param()
524 for (size_t i = 0U; i < param->params_count; i++) { in valid_broadcast_source_param()
527 subgroup_param = &param->params[i]; in valid_broadcast_source_param()
529 CHECKIF(subgroup_param->params == NULL) { in valid_broadcast_source_param()
534 CHECKIF(!IN_RANGE(subgroup_param->params_count, 1U, in valid_broadcast_source_param()
537 subgroup_param->params_count); in valid_broadcast_source_param()
541 CHECKIF(!bt_audio_valid_codec_cfg(subgroup_param->codec_cfg)) { in valid_broadcast_source_param()
546 for (size_t j = 0U; j < subgroup_param->params_count; j++) { in valid_broadcast_source_param()
549 stream_param = &subgroup_param->params[j]; in valid_broadcast_source_param()
551 CHECKIF(stream_param->stream == NULL) { in valid_broadcast_source_param()
552 LOG_DBG("subgroup_params[%zu].stream_params[%zu]->stream is NULL", in valid_broadcast_source_param()
557 CHECKIF(stream_param->stream->group != NULL && in valid_broadcast_source_param()
558 stream_param->stream->group != source) { in valid_broadcast_source_param()
559 LOG_DBG("subgroup_params[%zu].stream_params[%zu]->stream is " in valid_broadcast_source_param()
561 i, j, stream_param->stream->group); in valid_broadcast_source_param()
566 CHECKIF(stream_param->data == NULL && stream_param->data_len != 0) { in valid_broadcast_source_param()
567 LOG_DBG("subgroup_params[%zu].stream_params[%zu]->data is " in valid_broadcast_source_param()
569 i, j, stream_param->data_len); in valid_broadcast_source_param()
573 CHECKIF(stream_param->data_len > CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE) { in valid_broadcast_source_param()
574 LOG_DBG("subgroup_params[%zu].stream_params[%zu]->data_len too " in valid_broadcast_source_param()
576 i, j, stream_param->data_len, in valid_broadcast_source_param()
581 CHECKIF(stream_param->data != NULL && in valid_broadcast_source_param()
582 subgroup_param->codec_cfg->id == BT_HCI_CODING_FORMAT_LC3 && in valid_broadcast_source_param()
583 !bt_audio_valid_ltv(stream_param->data, stream_param->data_len)) { in valid_broadcast_source_param()
584 LOG_DBG("subgroup_params[%zu].stream_params[%zu]->data not valid " in valid_broadcast_source_param()
607 if (sys_slist_is_empty(&source->subgroups)) { in broadcast_source_get_state()
612 SYS_SLIST_FOR_EACH_CONTAINER(&source->subgroups, subgroup, _node) { in broadcast_source_get_state()
615 SYS_SLIST_FOR_EACH_CONTAINER(&subgroup->streams, stream, _node) { in broadcast_source_get_state()
616 if (stream->ep != NULL) { in broadcast_source_get_state()
617 state = MAX(state, stream->ep->status.state); in broadcast_source_get_state()
630 err = bt_audio_codec_cfg_set_val(codec_cfg, data->type, data->data, data->data_len); in merge_bis_and_subgroup_data_cb()
632 LOG_DBG("Failed to set type %u with len %u in codec_cfg: %d", data->type, in merge_bis_and_subgroup_data_cb()
633 data->data_len, err); in merge_bis_and_subgroup_data_cb()
644 if (stream_param->data_len > 0) { in update_codec_cfg_data()
647 /* Merge subgroup codec configuration with the BIS configuration in update_codec_cfg_data()
651 if (codec_cfg->id == BT_HCI_CODING_FORMAT_LC3) { in update_codec_cfg_data()
652 err = bt_audio_data_parse(stream_param->data, stream_param->data_len, in update_codec_cfg_data()
655 LOG_DBG("Could not merge BIS and subgroup config in codec_cfg: %d", in update_codec_cfg_data()
658 return -EINVAL; in update_codec_cfg_data()
661 /* If it is not LC3, then we don't know how to merge the subgroup and BIS in update_codec_cfg_data()
664 if (codec_cfg->data_len + stream_param->data_len > in update_codec_cfg_data()
665 sizeof(codec_cfg->data)) { in update_codec_cfg_data()
668 codec_cfg->data_len + stream_param->data_len, in update_codec_cfg_data()
669 sizeof(codec_cfg->data)); in update_codec_cfg_data()
671 return -ENOMEM; in update_codec_cfg_data()
674 memcpy(&codec_cfg->data[codec_cfg->data_len], stream_param->data, in update_codec_cfg_data()
675 stream_param->data_len); in update_codec_cfg_data()
676 codec_cfg->data_len += stream_param->data_len; in update_codec_cfg_data()
695 return -EINVAL; in bt_bap_broadcast_source_create()
703 return -EINVAL; in bt_bap_broadcast_source_create()
716 return -ENOMEM; in bt_bap_broadcast_source_create()
721 qos = param->qos; in bt_bap_broadcast_source_create()
725 for (size_t i = 0U; i < param->params_count; i++) { in bt_bap_broadcast_source_create()
729 subgroup_param = &param->params[i]; in bt_bap_broadcast_source_create()
735 return -ENOMEM; in bt_bap_broadcast_source_create()
738 subgroup->codec_cfg = subgroup_param->codec_cfg; in bt_bap_broadcast_source_create()
739 sys_slist_append(&source->subgroups, &subgroup->_node); in bt_bap_broadcast_source_create()
742 if (subgroup_param->params_count + stream_count > BROADCAST_STREAM_CNT) { in bt_bap_broadcast_source_create()
746 return -ENOMEM; in bt_bap_broadcast_source_create()
749 for (size_t j = 0U; j < subgroup_param->params_count; j++) { in bt_bap_broadcast_source_create()
754 codec_cfg = subgroup_param->codec_cfg; in bt_bap_broadcast_source_create()
755 stream_param = &subgroup_param->params[j]; in bt_bap_broadcast_source_create()
756 stream = stream_param->stream; in bt_bap_broadcast_source_create()
761 return -ENOMEM; in bt_bap_broadcast_source_create()
764 codec_cfg = &source->codec_cfg[bis_count]; in bt_bap_broadcast_source_create()
765 memcpy(codec_cfg, subgroup_param->codec_cfg, in bt_bap_broadcast_source_create()
791 (void)memcpy(source->stream_data[stream_count].data, stream_param->data, in bt_bap_broadcast_source_create()
792 stream_param->data_len * sizeof(*stream_param->data)); in bt_bap_broadcast_source_create()
793 source->stream_data[stream_count].data_len = stream_param->data_len; in bt_bap_broadcast_source_create()
795 sys_slist_append(&subgroup->streams, &stream->_node); in bt_bap_broadcast_source_create()
802 source->qos = qos; in bt_bap_broadcast_source_create()
803 source->packing = param->packing; in bt_bap_broadcast_source_create()
805 source->irc = param->irc; in bt_bap_broadcast_source_create()
806 source->pto = param->pto; in bt_bap_broadcast_source_create()
807 source->iso_interval = param->iso_interval; in bt_bap_broadcast_source_create()
810 source->encryption = param->encryption; in bt_bap_broadcast_source_create()
811 if (source->encryption) { in bt_bap_broadcast_source_create()
812 (void)memcpy(source->broadcast_code, param->broadcast_code, in bt_bap_broadcast_source_create()
813 sizeof(source->broadcast_code)); in bt_bap_broadcast_source_create()
832 return -EINVAL; in bt_bap_broadcast_source_reconfig()
837 return -EINVAL; in bt_bap_broadcast_source_reconfig()
843 return -EBADMSG; in bt_bap_broadcast_source_reconfig()
848 SYS_SLIST_FOR_EACH_CONTAINER(&source->subgroups, subgroup, _node) { in bt_bap_broadcast_source_reconfig()
850 &param->params[subgroup_cnt]; in bt_bap_broadcast_source_reconfig()
851 const size_t subgroup_stream_param_cnt = subgroup_param->params_count; in bt_bap_broadcast_source_reconfig()
855 SYS_SLIST_FOR_EACH_CONTAINER(&subgroup->streams, stream, _node) { in bt_bap_broadcast_source_reconfig()
860 for (size_t i = 0U; i < subgroup_param->params_count; i++) { in bt_bap_broadcast_source_reconfig()
865 param_stream = subgroup_param->params[i].stream; in bt_bap_broadcast_source_reconfig()
867 SYS_SLIST_FOR_EACH_CONTAINER(&subgroup->streams, subgroup_stream, _node) { in bt_bap_broadcast_source_reconfig()
875 LOG_DBG("Invalid param->params[%zu]->param[%zu].stream " in bt_bap_broadcast_source_reconfig()
878 return -EINVAL; in bt_bap_broadcast_source_reconfig()
883 LOG_DBG("Invalid param->params[%zu]->params_count: %zu " in bt_bap_broadcast_source_reconfig()
886 return -EINVAL; in bt_bap_broadcast_source_reconfig()
892 if (subgroup_cnt < param->params_count) { in bt_bap_broadcast_source_reconfig()
893 LOG_DBG("Invalid param->params_count: %zu (only %zu subgroups in source)", in bt_bap_broadcast_source_reconfig()
894 param->params_count, subgroup_cnt); in bt_bap_broadcast_source_reconfig()
895 return -EINVAL; in bt_bap_broadcast_source_reconfig()
898 qos = param->qos; in bt_bap_broadcast_source_reconfig()
900 /* We update up to the first param->params_count subgroups */ in bt_bap_broadcast_source_reconfig()
901 for (size_t i = 0U; i < param->params_count; i++) { in bt_bap_broadcast_source_reconfig()
908 SYS_SLIST_PEEK_HEAD_CONTAINER(&source->subgroups, subgroup, _node); in bt_bap_broadcast_source_reconfig()
913 subgroup_param = &param->params[i]; in bt_bap_broadcast_source_reconfig()
914 codec_cfg = subgroup_param->codec_cfg; in bt_bap_broadcast_source_reconfig()
915 subgroup->codec_cfg = codec_cfg; in bt_bap_broadcast_source_reconfig()
917 for (size_t j = 0U; j < subgroup_param->params_count; j++) { in bt_bap_broadcast_source_reconfig()
923 stream_param = &subgroup_param->params[j]; in bt_bap_broadcast_source_reconfig()
924 stream = stream_param->stream; in bt_bap_broadcast_source_reconfig()
930 return -ENOMEM; in bt_bap_broadcast_source_reconfig()
933 codec_cfg = &source->codec_cfg[bis_count]; in bt_bap_broadcast_source_reconfig()
934 memcpy(codec_cfg, subgroup_param->codec_cfg, in bt_bap_broadcast_source_reconfig()
947 SYS_SLIST_FOR_EACH_CONTAINER(&subgroup->streams, subgroup_stream, _node) { in bt_bap_broadcast_source_reconfig()
960 stream_data = &source->stream_data[stream_idx]; in bt_bap_broadcast_source_reconfig()
961 (void)memcpy(stream_data->data, stream_param->data, stream_param->data_len); in bt_bap_broadcast_source_reconfig()
962 stream_data->data_len = stream_param->data_len; in bt_bap_broadcast_source_reconfig()
968 SYS_SLIST_FOR_EACH_CONTAINER(&subgroup->streams, stream, _node) { in bt_bap_broadcast_source_reconfig()
969 bt_bap_stream_attach(NULL, stream, stream->ep, codec_cfg); in bt_bap_broadcast_source_reconfig()
970 bt_bap_iso_configure_data_path(stream->ep, codec_cfg); in bt_bap_broadcast_source_reconfig()
975 SYS_SLIST_FOR_EACH_CONTAINER(&source->subgroups, subgroup, _node) { in bt_bap_broadcast_source_reconfig()
978 SYS_SLIST_FOR_EACH_CONTAINER(&subgroup->streams, stream, _node) { in bt_bap_broadcast_source_reconfig()
981 iso_qos = stream->ep->iso->chan.qos->tx; in bt_bap_broadcast_source_reconfig()
983 stream->qos = qos; in bt_bap_broadcast_source_reconfig()
987 source->qos = qos; in bt_bap_broadcast_source_reconfig()
1001 return -EINVAL; in bt_bap_broadcast_source_update_metadata()
1007 return -EINVAL; in bt_bap_broadcast_source_update_metadata()
1014 return -EINVAL; in bt_bap_broadcast_source_update_metadata()
1021 return -EBADMSG; in bt_bap_broadcast_source_update_metadata()
1027 SYS_SLIST_FOR_EACH_CONTAINER(&source->subgroups, subgroup, _node) { in bt_bap_broadcast_source_update_metadata()
1028 memset(subgroup->codec_cfg->meta, 0, sizeof(subgroup->codec_cfg->meta)); in bt_bap_broadcast_source_update_metadata()
1029 memcpy(subgroup->codec_cfg->meta, meta, meta_len); in bt_bap_broadcast_source_update_metadata()
1030 subgroup->codec_cfg->meta_len = meta_len; in bt_bap_broadcast_source_update_metadata()
1048 return -EINVAL; in bt_bap_broadcast_source_start()
1053 return -EINVAL; in bt_bap_broadcast_source_start()
1059 return -EBADMSG; in bt_bap_broadcast_source_start()
1063 SYS_SLIST_FOR_EACH_CONTAINER(&source->subgroups, subgroup, _node) { in bt_bap_broadcast_source_start()
1064 SYS_SLIST_FOR_EACH_CONTAINER(&subgroup->streams, stream, _node) { in bt_bap_broadcast_source_start()
1072 param.framing = source->qos->framing; in bt_bap_broadcast_source_start()
1073 param.packing = source->packing; in bt_bap_broadcast_source_start()
1074 param.interval = source->qos->interval; in bt_bap_broadcast_source_start()
1075 param.latency = source->qos->latency; in bt_bap_broadcast_source_start()
1076 param.encryption = source->encryption; in bt_bap_broadcast_source_start()
1078 (void)memcpy(param.bcode, source->broadcast_code, sizeof(param.bcode)); in bt_bap_broadcast_source_start()
1081 param.irc = source->irc; in bt_bap_broadcast_source_start()
1082 param.pto = source->pto; in bt_bap_broadcast_source_start()
1083 param.iso_interval = source->iso_interval; in bt_bap_broadcast_source_start()
1091 err = bt_iso_big_create(adv, &param, &source->big); in bt_bap_broadcast_source_start()
1109 return -EINVAL; in bt_bap_broadcast_source_stop()
1116 return -EBADMSG; in bt_bap_broadcast_source_stop()
1119 if (source->big == NULL) { in bt_bap_broadcast_source_stop()
1121 return -EALREADY; in bt_bap_broadcast_source_stop()
1124 err = bt_iso_big_terminate(source->big); in bt_bap_broadcast_source_stop()
1139 return -EINVAL; in bt_bap_broadcast_source_delete()
1145 return -EBADMSG; in bt_bap_broadcast_source_delete()
1163 return -EINVAL; in bt_bap_broadcast_source_get_base()
1168 return -EINVAL; in bt_bap_broadcast_source_get_base()
1174 return -EBADMSG; in bt_bap_broadcast_source_get_base()
1178 LOG_DBG("base_buf %p with size %u not large enough", base_buf, base_buf->size); in bt_bap_broadcast_source_get_base()
1180 return -EMSGSIZE; in bt_bap_broadcast_source_get_base()
1208 if (listener->started != NULL) { in big_started_cb()
1209 listener->started(source); in big_started_cb()
1224 source->big = NULL; in big_stopped_cb()
1227 if (listener->stopped != NULL) { in big_stopped_cb()
1228 listener->stopped(source, reason); in big_stopped_cb()
1240 return -EINVAL; in bt_bap_broadcast_source_register_cb()
1243 if (sys_slist_find(&bap_broadcast_source_cbs, &cb->_node, NULL)) { in bt_bap_broadcast_source_register_cb()
1246 return -EEXIST; in bt_bap_broadcast_source_register_cb()
1263 sys_slist_append(&bap_broadcast_source_cbs, &cb->_node); in bt_bap_broadcast_source_register_cb()
1273 return -EINVAL; in bt_bap_broadcast_source_unregister_cb()
1276 if (!sys_slist_find_and_remove(&bap_broadcast_source_cbs, &cb->_node)) { in bt_bap_broadcast_source_unregister_cb()
1279 return -ENOENT; in bt_bap_broadcast_source_unregister_cb()