Skip to content

Commit 51b9de4

Browse files
committed
Added bap_thread for feedback
Added bap_thread in broadcast_snk.c for feedback while working on it. Draft to be deleted once feedback is incorperated in the add_bass_to_hap_ha branch.
1 parent 9747c26 commit 51b9de4

File tree

1 file changed

+225
-0
lines changed

1 file changed

+225
-0
lines changed

samples/bluetooth/hap_ha/src/bap_broadcast_snk.c

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include "bap_unicast_sr.h"
1919

2020
#define SEM_TIMEOUT K_SECONDS(60)
21+
#define BROADCAST_ASSISTANT_TIMEOUT K_SECONDS(120)
22+
#define ADV_TIMEOUT K_FOREVER
2123
#define PA_SYNC_INTERVAL_TO_TIMEOUT_RATIO 10 /* Set the timeout relative to interval */
2224
#define PA_SYNC_SKIP 10
2325

@@ -47,6 +49,7 @@ static struct bt_le_per_adv_sync *pa_sync;
4749
static uint32_t broadcaster_broadcast_id;
4850
static volatile bool big_synced;
4951
static volatile bool base_received;
52+
static struct bt_bap_stream *bap_streams_p[CONFIG_BT_BAP_BROADCAST_SNK_STREAM_COUNT];
5053

5154

5255
/**
@@ -735,6 +738,228 @@ static uint8_t get_stream_count(uint32_t bitfield)
735738
return count;
736739
}
737740

741+
static int bap_sink_reset(void)
742+
743+
{
744+
int err;
745+
req_recv_state = NULL;
746+
big_synced = false;
747+
base_received = false;
748+
749+
(void)memset(&base_recv_data, 0, sizeof(base_recv_data));
750+
(void)memset(&requested_bis_sync, 0, sizeof(requested_bis_sync));
751+
(void)memset(sink_broadcast_code, 0, sizeof(sink_broadcast_code));
752+
(void)memset(&broadcaster_info, 0, sizeof(broadcaster_info));
753+
(void)memset(&broadcaster_addr, 0, sizeof(broadcaster_addr));
754+
755+
broadcaster_broadcast_id = BT_BAP_INVALID_BROADCAST_ID;
756+
757+
if (broadcast_sink != NULL) {
758+
err = bt_bap_broadcast_sink_delete(broadcast_sink);
759+
if (err) {
760+
printk("Deleting broadcast sink failed (err %d)\n", err);
761+
return err;
762+
}
763+
broadcast_sink = NULL;
764+
}
765+
766+
if (pa_sync != NULL) {
767+
bt_le_per_adv_sync_delete(pa_sync);
768+
if (err) {
769+
printk("Deleting PA sync failed (err %d)\n", err);
770+
return err;
771+
}
772+
pa_sync = NULL;
773+
}
774+
775+
k_sem_reset(&sem_broadcaster_found);
776+
k_sem_reset(&sem_pa_synced);
777+
k_sem_reset(&sem_base_received);
778+
k_sem_reset(&sem_syncable);
779+
k_sem_reset(&sem_pa_sync_lost);
780+
k_sem_reset(&sem_broadcast_code_received);
781+
k_sem_reset(&sem_bis_sync_requested);
782+
k_sem_reset(&sem_stream_connected);
783+
k_sem_reset(&sem_stream_started);
784+
k_sem_reset(&sem_broadcast_sink_stopped);
785+
return 0;
786+
787+
}
788+
789+
790+
791+
void bap_thread(void *p1, void *p2, void *p3)
792+
{
793+
printk("BAP_thread started\n");
794+
enum {
795+
BAP_STATE_RESET,
796+
BAP_STATE_WAIT_BA,
797+
BAP_STATE_PA_SYNC,
798+
BAP_STATE_CREATE_SINK,
799+
BAP_STATE_WAIT_BASE,
800+
BAP_STATE_WAIT_SYNCABLE,
801+
BAP_STATE_WAIT_CODE,
802+
BAP_STATE_WAIT_BIS_REQ,
803+
BAP_STATE_SYNC_BIS,
804+
BAP_STATE_WAIT_STREAM,
805+
BAP_STATE_WAIT_DISCONNECT,
806+
BAP_STATE_WAIT_STOP
807+
} state = BAP_STATE_RESET;
808+
809+
int err;
810+
uint8_t stream_count;
811+
uint32_t sync_bitfield;
812+
813+
while (true) {
814+
switch (state) {
815+
case BAP_STATE_RESET:
816+
817+
err = bap_sink_reset();
818+
if (err) {
819+
printk("BAP Sink RESET STATE: Reset failed (%d)\n", err);
820+
k_sleep(K_SECONDS(1));
821+
continue;
822+
}
823+
state = BAP_STATE_WAIT_BA;
824+
break;
825+
826+
827+
case BAP_STATE_WAIT_BA:
828+
829+
if (!bap_unicast_sr_has_connection()) {
830+
if (k_sem_take(&sem_connected, ADV_TIMEOUT) != 0) {
831+
printk("No Broadcast Assistant found \n");
832+
state = BAP_STATE_WAIT_BA;
833+
break;
834+
}
835+
}
836+
837+
k_sem_reset(&sem_pa_request);
838+
k_sem_reset(&sem_past_request);
839+
k_sem_reset(&sem_disconnected);
840+
841+
printk("Waiting for PA sync request\n");
842+
err = k_sem_take(&sem_pa_request,
843+
BROADCAST_ASSISTANT_TIMEOUT);
844+
if (err != 0) {
845+
printk("sem_pa_request timed out, resetting\n");
846+
state = BAP_STATE_RESET;
847+
break;
848+
}
849+
850+
if (k_sem_take(&sem_past_request, K_NO_WAIT) == 0) {
851+
state = BAP_STATE_PA_SYNC;
852+
break;
853+
}
854+
855+
printk("NEXT STATE: BAP_STATE_PA_SYNC\n");
856+
state = BAP_STATE_PA_SYNC;
857+
break;
858+
859+
case BAP_STATE_PA_SYNC:
860+
if (k_sem_take(&sem_pa_synced, SEM_TIMEOUT) != 0) {
861+
printk("sem_pa_synced timed out, resetting\n");
862+
state = BAP_STATE_RESET;
863+
break;
864+
}
865+
state = BAP_STATE_CREATE_SINK;
866+
break;
867+
868+
case BAP_STATE_CREATE_SINK:
869+
err = bt_bap_broadcast_sink_create(pa_sync, broadcaster_broadcast_id, &broadcast_sink);
870+
if (err != 0) {
871+
printk("Failed to create broadcast sink: %d\n", err);
872+
state = BAP_STATE_RESET;
873+
break;
874+
}
875+
printk("Broadcast Sink created, waiting for BASE\n");
876+
state = BAP_STATE_WAIT_BASE;
877+
break;
878+
879+
case BAP_STATE_WAIT_BASE:
880+
if (k_sem_take(&sem_base_received, SEM_TIMEOUT) != 0) {
881+
printk("sem_base_received timed out, resetting\n");
882+
state = BAP_STATE_RESET;
883+
break;
884+
}
885+
printk("BASE received, waiting for syncable\n");
886+
state = BAP_STATE_WAIT_SYNCABLE;
887+
break;
888+
889+
case BAP_STATE_WAIT_SYNCABLE:
890+
if (k_sem_take(&sem_syncable, SEM_TIMEOUT) != 0) {
891+
printk("sem_syncable timed out, resetting\n");
892+
state = BAP_STATE_RESET;
893+
break;
894+
}
895+
state = BAP_STATE_WAIT_CODE;
896+
break;
897+
898+
case BAP_STATE_WAIT_CODE:
899+
if (k_sem_take(&sem_broadcast_code_received, SEM_TIMEOUT) != 0) {
900+
printk("sem_broadcast_code_received timed out, resetting\n");
901+
state = BAP_STATE_RESET;
902+
break;
903+
}
904+
state = BAP_STATE_WAIT_BIS_REQ;
905+
break;
906+
907+
case BAP_STATE_WAIT_BIS_REQ:
908+
if (k_sem_take(&sem_bis_sync_requested, SEM_TIMEOUT) != 0) {
909+
printk("sem_bis_sync_requested timed out, resetting\n");
910+
state = BAP_STATE_RESET;
911+
break;
912+
}
913+
sync_bitfield = select_bis_sync_bitfield(&base_recv_data, requested_bis_sync);
914+
if (sync_bitfield == 0U) {
915+
printk("No valid BIS sync found, resetting\n");
916+
state = BAP_STATE_RESET;
917+
break;
918+
}
919+
stream_count = get_stream_count(sync_bitfield);
920+
printk("Syncing to broadcast with bitfield: 0x%08x, stream_count = %u\n", sync_bitfield, stream_count);
921+
state = BAP_STATE_SYNC_BIS;
922+
break;
923+
924+
case BAP_STATE_SYNC_BIS:
925+
err = bt_bap_broadcast_sink_sync(broadcast_sink, sync_bitfield, bap_streams_p, sink_broadcast_code);
926+
if (err != 0) {
927+
printk("Unable to sync to broadcast source: %d\n", err);
928+
state = BAP_STATE_RESET;
929+
break;
930+
}
931+
printk("Waiting for stream(s) started\n");
932+
state = BAP_STATE_WAIT_STREAM;
933+
break;
934+
935+
case BAP_STATE_WAIT_STREAM:
936+
if (k_sem_take(&sem_big_synced, SEM_TIMEOUT) != 0) {
937+
printk("sem_big_synced timed out, resetting\n");
938+
state = BAP_STATE_RESET;
939+
break;
940+
}
941+
state = BAP_STATE_WAIT_DISCONNECT;
942+
break;
943+
944+
case BAP_STATE_WAIT_DISCONNECT:
945+
k_sem_take(&sem_pa_sync_lost, K_FOREVER);
946+
state = BAP_STATE_WAIT_STOP;
947+
break;
948+
949+
case BAP_STATE_WAIT_STOP:
950+
if (k_sem_take(&sem_broadcast_sink_stopped, SEM_TIMEOUT) != 0) {
951+
printk("sem_broadcast_sink_stopped timed out, resetting\n");
952+
state = BAP_STATE_RESET;
953+
break;
954+
}
955+
printk("BAP Sink: Broadcast session ended\n");
956+
state = BAP_STATE_RESET;
957+
break;
958+
}
959+
960+
k_sleep(K_MSEC(10));
961+
}
962+
}
738963

739964
int init_bap_sink(void)
740965
{

0 commit comments

Comments
 (0)