diff --git a/src/shared/bap.c b/src/shared/bap.c
index 13bbcf7..d8a3add 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
if (type == BT_BAP_BCAST_SINK)
ep->dir = BT_BAP_BCAST_SOURCE;
else
- ep->dir = BT_BAP_BCAST_SINK;
+ ep->dir = 0;
return ep;
}
return;
if (bt_bap_stream_get_type(stream) == BT_BAP_STREAM_TYPE_BCAST) {
- if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SINK)
+ if (!bt_bap_stream_io_dir(stream))
stream_set_state_broadcast(stream,
- BT_BAP_STREAM_STATE_QOS);
+ BT_BAP_STREAM_STATE_QOS);
else if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SOURCE)
stream_set_state_broadcast(stream,
- BT_BAP_STREAM_STATE_CONFIG);
+ BT_BAP_STREAM_STATE_CONFIG);
return;
}
struct iovec *metadata)
{
struct bt_bap_db *bdb;
- struct bt_bap_pac *pac, *pac_broadcast_sink;
+ struct bt_bap_pac *pac;
struct bt_bap_codec codec;
if (!db)
break;
case BT_BAP_BCAST_SOURCE:
bap_add_broadcast_source(pac);
- if (queue_isempty(bdb->broadcast_sinks)) {
- /* When adding a local broadcast source, add also a
- * local broadcast sink
- */
- pac_broadcast_sink = bap_pac_new(bdb, name,
- BT_BAP_BCAST_SINK, &codec, qos,
- data, metadata);
- bap_add_broadcast_sink(pac_broadcast_sink);
- }
break;
case BT_BAP_BCAST_SINK:
bap_add_broadcast_sink(pac);
func, user_data);
case BT_BAP_SOURCE:
return bap_foreach_pac(bap->ldb->sinks, bap->rdb->sources,
- func, user_data);
+ func, user_data);
case BT_BAP_BCAST_SOURCE:
- if (queue_isempty(bap->rdb->broadcast_sources)
- && queue_isempty(bap->rdb->broadcast_sinks))
- return bap_foreach_pac(bap->ldb->broadcast_sources,
- bap->ldb->broadcast_sinks,
- func, user_data);
-
- return bap_foreach_pac(bap->ldb->broadcast_sinks,
- bap->rdb->broadcast_sources,
- func, user_data);
case BT_BAP_BCAST_SINK:
return bap_foreach_pac(bap->ldb->broadcast_sinks,
- bap->rdb->broadcast_sources,
- func, user_data);
+ bap->rdb->broadcast_sources,
+ func, user_data);
}
}
return pac->user_data;
}
+bool bt_bap_pac_bcast_is_local(struct bt_bap *bap, struct bt_bap_pac *pac)
+{
+ if (!bap->ldb)
+ return false;
+
+ if (queue_find(bap->ldb->broadcast_sinks, NULL, pac))
+ return true;
+
+ if (queue_find(bap->ldb->broadcast_sources, NULL, pac))
+ return true;
+
+ return false;
+}
+
static bool find_ep_unused(const void *data, const void *user_data)
{
const struct bt_bap_endpoint *ep = data;
if (ep->stream)
return false;
- return ep->dir == match->rpac->type;
+ if (match->rpac)
+ return ep->dir == match->rpac->type;
+ else
+ return true;
}
static bool find_ep_pacs(const void *data, const void *user_data)
struct bt_bap_endpoint *ep;
struct match_pac match;
- if (!bap || !bap->rdb || queue_isempty(bap->remote_eps))
+ if (!bap)
+ return NULL;
+
+ if (!rpac && (lpac->type != BT_BAP_BCAST_SOURCE)
+ && queue_isempty(bap->remote_eps))
return NULL;
if (lpac && rpac) {
return NULL;
bt_bap_foreach_pac(bap, type, match_pac, &match);
- if (!match.lpac || !match.rpac)
+ if (!match.lpac)
+ return NULL;
+ if (!match.rpac && (lpac->type != BT_BAP_BCAST_SOURCE))
return NULL;
lpac = match.lpac;
queue_foreach(stream->links, bap_stream_enable_link, metadata);
break;
case BT_BAP_STREAM_TYPE_BCAST:
- if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SINK)
+ if (!bt_bap_stream_io_dir(stream))
stream_set_state_broadcast(stream,
- BT_BAP_STREAM_STATE_CONFIG);
+ BT_BAP_STREAM_STATE_CONFIG);
else if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SOURCE)
stream_set_state_broadcast(stream,
- BT_BAP_STREAM_STATE_STREAMING);
+ BT_BAP_STREAM_STATE_STREAMING);
return 1;
}
if (queue_isempty(bap->ldb->broadcast_sinks))
return false;
- /* Add the remote source only if a local sink endpoint was registered */
- if (queue_isempty(bap->ldb->broadcast_sinks))
- return false;
-
/* Add remote source endpoint */
if (!bap->rdb->broadcast_sources)
bap->rdb->broadcast_sources = queue_new();
diff --git a/src/shared/bap.h b/src/shared/bap.h
index 23edbf4..2c8f920 100644
--- a/src/shared/bap.h
+++ b/src/shared/bap.h
struct bt_bap_codec *codec,
struct iovec *data,
struct iovec *metadata);
+
+bool bt_bap_pac_bcast_is_local(struct bt_bap *bap, struct bt_bap_pac *pac);
+