@@ -226,6 +226,7 @@ struct bt_bap_stream_io {
struct bt_bap_stream_ops {
uint8_t type;
void (*set_state)(struct bt_bap_stream *stream, uint8_t state);
+ unsigned int (*get_state)(struct bt_bap_stream *stream);
unsigned int (*config)(struct bt_bap_stream *stream,
struct bt_bap_qos *qos, struct iovec *data,
bt_bap_stream_func_t func, void *user_data);
@@ -245,6 +246,8 @@ struct bt_bap_stream_ops {
unsigned int (*metadata)(struct bt_bap_stream *stream,
struct iovec *data, bt_bap_stream_func_t func,
void *user_data);
+ unsigned int (*get_dir)(struct bt_bap_stream *stream);
+ unsigned int (*get_loc)(struct bt_bap_stream *stream);
unsigned int (*release)(struct bt_bap_stream *stream,
bt_bap_stream_func_t func, void *user_data);
};
@@ -1578,6 +1581,11 @@ done:
bap_stream_state_changed(stream);
}
+static unsigned int bap_ucast_get_state(struct bt_bap_stream *stream)
+{
+ return stream->ep->state;
+}
+
static unsigned int bap_ucast_config(struct bt_bap_stream *stream,
struct bt_bap_qos *qos,
struct iovec *data,
@@ -1923,6 +1931,27 @@ static bool bap_stream_valid(struct bt_bap_stream *stream)
return queue_find(stream->bap->streams, NULL, stream);
}
+static unsigned int bap_ucast_get_dir(struct bt_bap_stream *stream)
+{
+ return stream->ep->dir;
+}
+
+static unsigned int bap_ucast_get_location(struct bt_bap_stream *stream)
+{
+ struct bt_pacs *pacs;
+
+ if (!stream)
+ return 0x00000000;
+
+ pacs = stream->client ? stream->bap->rdb->pacs : stream->bap->ldb->pacs;
+
+ if (stream->ep->dir == BT_BAP_SOURCE)
+ return pacs->source_loc_value;
+ else if (stream->ep->dir == BT_BAP_SINK)
+ return pacs->sink_loc_value;
+ return 0x00000000;
+}
+
static unsigned int bap_ucast_release(struct bt_bap_stream *stream,
bt_bap_stream_func_t func,
void *user_data)
@@ -2000,6 +2029,11 @@ static void bap_bcast_set_state(struct bt_bap_stream *stream, uint8_t state)
}
}
+static unsigned int bap_bcast_get_state(struct bt_bap_stream *stream)
+{
+ return stream->state;
+}
+
static unsigned int bap_bcast_enable(struct bt_bap_stream *stream,
bool enable_links, struct iovec *data,
bt_bap_stream_func_t func,
@@ -2019,6 +2053,17 @@ static unsigned int bap_bcast_start(struct bt_bap_stream *stream,
return 1;
}
+static unsigned int bap_bcast_sink_disable(struct bt_bap_stream *stream,
+ bool disable_links,
+ bt_bap_stream_func_t func,
+ void *user_data)
+{
+ bap_stream_io_detach(stream);
+ stream_set_state(stream, BT_BAP_STREAM_STATE_CONFIG);
+
+ return 1;
+}
+
static unsigned int bap_bcast_disable(struct bt_bap_stream *stream,
bool disable_links,
bt_bap_stream_func_t func,
@@ -2040,6 +2085,43 @@ static unsigned int bap_bcast_metadata(struct bt_bap_stream *stream,
return 1;
}
+static unsigned int bap_bcast_src_get_dir(struct bt_bap_stream *stream)
+{
+ return BT_BAP_BCAST_SINK;
+}
+
+static unsigned int bap_bcast_sink_get_dir(struct bt_bap_stream *stream)
+{
+ return BT_BAP_BCAST_SOURCE;
+}
+
+static void bap_sink_get_allocation(size_t i, uint8_t l, uint8_t t,
+ uint8_t *v, void *user_data)
+{
+ uint32_t location32;
+
+ if (!v)
+ return;
+
+ memcpy(&location32, v, l);
+ *((uint32_t *)user_data) = le32_to_cpu(location32);
+}
+
+static unsigned int bap_bcast_get_location(struct bt_bap_stream *stream)
+{
+ uint8_t type = BAP_CHANNEL_ALLOCATION_LTV_TYPE;
+ uint32_t allocation = 0;
+ struct iovec *caps;
+
+ caps = bt_bap_stream_get_config(stream);
+
+ /* Get stream allocation from capabilities */
+ util_ltv_foreach(caps->iov_base, caps->iov_len, &type,
+ bap_sink_get_allocation, &allocation);
+
+ return allocation;
+}
+
static unsigned int bap_bcast_release(struct bt_bap_stream *stream,
bt_bap_stream_func_t func,
void *user_data)
@@ -2049,11 +2131,12 @@ static unsigned int bap_bcast_release(struct bt_bap_stream *stream,
return 1;
}
-#define STREAM_OPS(_type, _set_state, _config, _qos, _enable, _start, \
- _disable, _stop, _metadata, _release) \
+#define STREAM_OPS(_type, _set_state, _get_state, _config, _qos, _enable, \
+ _start, _disable, _stop, _metadata, _get_dir, _get_loc, _release) \
{ \
.type = _type, \
.set_state = _set_state, \
+ .get_state = _get_state, \
.config = _config, \
.qos = _qos, \
.enable = _enable, \
@@ -2061,26 +2144,40 @@ static unsigned int bap_bcast_release(struct bt_bap_stream *stream,
.disable = _disable, \
.stop = _stop, \
.metadata = _metadata, \
+ .get_dir = _get_dir,\
+ .get_loc = _get_loc, \
.release = _release, \
}
static const struct bt_bap_stream_ops stream_ops[] = {
STREAM_OPS(BT_BAP_SINK, bap_ucast_set_state,
+ bap_ucast_get_state,
bap_ucast_config, bap_ucast_qos, bap_ucast_enable,
bap_ucast_start, bap_ucast_disable, bap_ucast_stop,
- bap_ucast_metadata, bap_ucast_release),
+ bap_ucast_metadata, bap_ucast_get_dir,
+ bap_ucast_get_location,
+ bap_ucast_release),
STREAM_OPS(BT_BAP_SOURCE, bap_ucast_set_state,
+ bap_ucast_get_state,
bap_ucast_config, bap_ucast_qos, bap_ucast_enable,
bap_ucast_start, bap_ucast_disable, bap_ucast_stop,
- bap_ucast_metadata, bap_ucast_release),
+ bap_ucast_metadata, bap_ucast_get_dir,
+ bap_ucast_get_location,
+ bap_ucast_release),
STREAM_OPS(BT_BAP_BCAST_SINK, bap_bcast_set_state,
+ bap_bcast_get_state,
bap_bcast_config, NULL, bap_bcast_enable,
- bap_bcast_start, bap_bcast_disable, NULL,
- bap_bcast_metadata, bap_bcast_release),
+ bap_bcast_start, bap_bcast_sink_disable, NULL,
+ bap_bcast_metadata, bap_bcast_sink_get_dir,
+ bap_bcast_get_location,
+ bap_bcast_release),
STREAM_OPS(BT_BAP_BCAST_SOURCE, bap_bcast_set_state,
+ bap_bcast_get_state,
bap_bcast_config, NULL, bap_bcast_enable,
bap_bcast_start, bap_bcast_disable, NULL,
- bap_bcast_metadata, bap_bcast_release),
+ bap_bcast_metadata, bap_bcast_src_get_dir,
+ bap_bcast_get_location,
+ bap_bcast_release),
};
static const struct bt_bap_stream_ops *
@@ -5380,11 +5477,7 @@ uint8_t bt_bap_stream_get_state(struct bt_bap_stream *stream)
if (!stream)
return BT_BAP_STREAM_STATE_IDLE;
- if (stream->lpac->type != BT_BAP_BCAST_SOURCE &&
- stream->lpac->type != BT_BAP_BCAST_SINK)
- return stream->ep->state;
- else
- return stream->state;
+ return stream->ops->get_state(stream);
}
bool bt_bap_stream_set_user_data(struct bt_bap_stream *stream, void *user_data)
@@ -5568,53 +5661,15 @@ uint8_t bt_bap_stream_get_dir(struct bt_bap_stream *stream)
if (!stream)
return 0x00;
- if (stream->ep)
- return stream->ep->dir;
-
- if (bt_bap_pac_get_type(stream->lpac) == BT_BAP_BCAST_SINK)
- return BT_BAP_BCAST_SOURCE;
- else
- return BT_BAP_BCAST_SINK;
-}
-
-static void bap_sink_get_allocation(size_t i, uint8_t l, uint8_t t,
- uint8_t *v, void *user_data)
-{
- uint32_t location32;
-
- if (!v)
- return;
-
- memcpy(&location32, v, l);
- *((uint32_t *)user_data) = le32_to_cpu(location32);
+ return stream->ops->get_dir(stream);
}
uint32_t bt_bap_stream_get_location(struct bt_bap_stream *stream)
{
- struct bt_pacs *pacs;
- uint8_t type = BAP_CHANNEL_ALLOCATION_LTV_TYPE;
- uint32_t allocation = 0;
- struct iovec *caps;
-
if (!stream)
return 0x00000000;
- pacs = stream->client ? stream->bap->rdb->pacs : stream->bap->ldb->pacs;
-
- if (stream->ep) {
- if (stream->ep->dir == BT_BAP_SOURCE)
- return pacs->source_loc_value;
- else if (stream->ep->dir == BT_BAP_SINK)
- return pacs->sink_loc_value;
- }
-
- caps = bt_bap_stream_get_config(stream);
-
- /* Get stream allocation from capabilities */
- util_ltv_foreach(caps->iov_base, caps->iov_len, &type,
- bap_sink_get_allocation, &allocation);
-
- return allocation;
+ return stream->ops->get_loc(stream);
}
struct iovec *bt_bap_stream_get_config(struct bt_bap_stream *stream)