diff options
author | Wim Taymans <wtaymans@redhat.com> | 2019-07-12 09:55:55 +0200 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2019-07-12 09:55:55 +0200 |
commit | 356f1242becce80afffef80cda6b90f9c35ad997 (patch) | |
tree | 82e7cb8b1826bbe4ac7990e802df12f1e044cbc5 | |
parent | 01e56c45ac1e3e1ce1a992683a63adf416f16583 (diff) |
a2dp: pull more data when needed
When we still have a buffer but it does not have enough data to encode a
frame, ask for more buffers.
-rw-r--r-- | spa/plugins/bluez5/a2dp-sink.c | 11 | ||||
-rw-r--r-- | spa/plugins/bluez5/a2dp-source.c | 2 |
2 files changed, 10 insertions, 3 deletions
diff --git a/spa/plugins/bluez5/a2dp-sink.c b/spa/plugins/bluez5/a2dp-sink.c index 69e3d7a1..3db513a5 100644 --- a/spa/plugins/bluez5/a2dp-sink.c +++ b/spa/plugins/bluez5/a2dp-sink.c @@ -84,6 +84,7 @@ struct port { struct spa_list ready; size_t ready_offset; + unsigned int need_data:1; }; struct impl { @@ -556,8 +557,10 @@ static int flush_data(struct impl *this, uint64_t now_time) n_bytes = add_data(this, src + offs, l0); if (n_bytes > 0 && l1 > 0) n_bytes += add_data(this, src, l1); - if (n_bytes <= 0) + if (n_bytes <= 0) { + port->need_data = true; break; + } n_frames = n_bytes / port->frame_size; @@ -689,7 +692,7 @@ static void a2dp_on_timeout(struct spa_source *source) this->start_time = now_time; } - if (spa_list_is_empty(&port->ready)) { + if (spa_list_is_empty(&port->ready) || port->need_data) { spa_log_trace(this->log, NAME " %p: %d", this, io->status); io->status = SPA_STATUS_NEED_BUFFER; @@ -1331,6 +1334,7 @@ static int impl_node_process(void *object) spa_list_append(&port->ready, &b->link); b->outstanding = false; + port->need_data = false; this->threshold = SPA_MIN(b->buf->datas[0].chunk->size / port->frame_size, this->props.max_latency); @@ -1339,7 +1343,6 @@ static int impl_node_process(void *object) io->status = SPA_STATUS_OK; } - return SPA_STATUS_HAVE_BUFFER; } @@ -1459,6 +1462,8 @@ impl_init(const struct spa_handle_factory *factory, SPA_NODE_CHANGE_MASK_PARAMS | SPA_NODE_CHANGE_MASK_PROPS; this->info = SPA_NODE_INFO_INIT(); + this->info.max_input_ports = 1; + this->info.max_output_ports = 0; this->info.flags = SPA_NODE_FLAG_RT; this->params[0] = SPA_PARAM_INFO(SPA_PARAM_PropInfo, SPA_PARAM_INFO_READ); this->params[1] = SPA_PARAM_INFO(SPA_PARAM_Props, SPA_PARAM_INFO_READWRITE); diff --git a/spa/plugins/bluez5/a2dp-source.c b/spa/plugins/bluez5/a2dp-source.c index ebdc0b3f..5ac8861a 100644 --- a/spa/plugins/bluez5/a2dp-source.c +++ b/spa/plugins/bluez5/a2dp-source.c @@ -1149,6 +1149,8 @@ impl_init(const struct spa_handle_factory *factory, SPA_NODE_CHANGE_MASK_PROPS | SPA_NODE_CHANGE_MASK_PARAMS; this->info = SPA_NODE_INFO_INIT(); + this->info.max_input_ports = 0; + this->info.max_output_ports = 1; this->info.flags = SPA_NODE_FLAG_RT; this->params[0] = SPA_PARAM_INFO(SPA_PARAM_PropInfo, SPA_PARAM_INFO_READ); this->params[1] = SPA_PARAM_INFO(SPA_PARAM_Props, SPA_PARAM_INFO_READWRITE); |