diff --git a/nimble/host/services/auracast/pkg.yml b/nimble/host/services/auracast/pkg.yml new file mode 100644 index 0000000000..a4d0013f93 --- /dev/null +++ b/nimble/host/services/auracast/pkg.yml @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +pkg.name: nimble/host/services/auracast +pkg.description: Implements Auracast service +pkg.author: "Apache Mynewt " +pkg.homepage: "http://mynewt.apache.org/" +pkg.keywords: + - ble + - bluetooth + - auracast + - nimble + +pkg.deps: + - nimble/host diff --git a/nimble/host/services/auracast/src/ble_svc_auracast.c b/nimble/host/services/auracast/src/ble_svc_auracast.c new file mode 100644 index 0000000000..2536b917d2 --- /dev/null +++ b/nimble/host/services/auracast/src/ble_svc_auracast.c @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include "syscfg/syscfg.h" + +#include "host/ble_gap.h" +#include "host/ble_hs.h" +#include "host/ble_audio_broadcast.h" +#include "services/auracast/ble_svc_auracast.h" + +#define AURACAST_ADV_INSTANCE \ + MYNEWT_VAL(BLE_SVC_AURACAST_ADV_INSTANCE) < 0 ? \ + (MYNEWT_VAL(BLE_MESH) ? MYNEWT_VAL(BLE_MULTI_ADV_INSTANCES) - 1 : \ + MYNEWT_VAL(BLE_MULTI_ADV_INSTANCES)) : \ + MYNEWT_VAL(BLE_SVC_AURACAST_ADV_INSTANCE) + +int +ble_svc_auracast_create(const struct ble_svc_auracast_create_params *params, + ble_audio_broadcast_destroy_fn *destroy_cb, + void *args, ble_gap_event_fn *gap_cb) +{ + struct ble_broadcast_create_params create_params; + struct ble_gap_periodic_adv_params periodic_params = { 0 }; + struct ble_gap_ext_adv_params extended_params = { + .scannable = 0, + .connectable = 0, + .primary_phy = BLE_HCI_LE_PHY_1M, + }; + uint8_t own_addr_type; + int rc; + + rc = ble_hs_id_infer_auto(0, &own_addr_type); + if (rc != 0) { + return rc; + } + + extended_params.own_addr_type = own_addr_type; + extended_params.sid = AURACAST_ADV_INSTANCE; + extended_params.secondary_phy = MYNEWT_VAL(BLE_PHY_2M) ? + BLE_HCI_LE_PHY_2M : BLE_HCI_LE_PHY_1M; + + create_params.base = params->base; + create_params.extended_params = &extended_params; + create_params.periodic_params = &periodic_params; + create_params.name = params->name; + create_params.adv_instance = MYNEWT_VAL(BLE_SVC_AURACAST_ADV_INSTANCE); + create_params.big_params = params->big_params; + create_params.svc_data = params->svc_data; + create_params.svc_data_len = params->svc_data_len; + + return ble_audio_broadcast_create(&create_params, + destroy_cb, args, gap_cb); +} + +int +ble_svc_auracast_terminate(void) +{ + return ble_audio_broadcast_destroy(AURACAST_ADV_INSTANCE); +} + +int +ble_svc_auracast_start(void) +{ + + return ble_audio_broadcast_start(AURACAST_ADV_INSTANCE, NULL, NULL); +} + +int +ble_svc_auracast_stop(void) +{ + return ble_audio_broadcast_stop(AURACAST_ADV_INSTANCE); +} diff --git a/nimble/host/services/auracast/syscfg.yml b/nimble/host/services/auracast/syscfg.yml new file mode 100644 index 0000000000..87d7a8c8da --- /dev/null +++ b/nimble/host/services/auracast/syscfg.yml @@ -0,0 +1,29 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +syscfg.defs: + BLE_SVC_AURACAST_ADV_INSTANCE: + description: > + Defines which advertising instance is used for Auracast. + If set to -1 last advertising instance is used, and if MESH is enabled, one before that. + Must be set to value in range 0 .. BLE_MULTI_ADV_INSTANCES. + value: -1 + +syscfg.restrictions: + - BLE_PERIODIC_ADV: 1