[Sound-open-firmware] [PATCH 2/2] SRC: Bug fix for issuing xru and xro errors
Seppo Ingalsuo
seppo.ingalsuo at linux.intel.com
Mon Nov 20 18:56:15 CET 2017
This patch prevents SRC to stall due to too demanding criteria of
function comp_buffer_can_copy_bytes. Since the input and output rate and
period length of SRC are different for source and sink both buffers do
not need to meet both criteria.
Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo at linux.intel.com>
---
src/audio/src.c | 27 +++++++++++----------------
1 file changed, 11 insertions(+), 16 deletions(-)
diff --git a/src/audio/src.c b/src/audio/src.c
index 3378065..0103e2e 100644
--- a/src/audio/src.c
+++ b/src/audio/src.c
@@ -496,7 +496,6 @@ static int src_copy(struct comp_dev *dev)
int need_sink;
size_t consumed = 0;
size_t produced = 0;
- int res;
trace_src("SRC");
@@ -519,30 +518,26 @@ static int src_copy(struct comp_dev *dev)
/* make sure source component buffer has enough data available and that
* the sink component buffer has enough free bytes for copy. Also
* check for XRUNs */
- res = comp_buffer_can_copy_bytes(source, sink, need_source);
- if (res) {
+ if (source->avail < need_source) {
trace_src_error("xru");
return -EIO; /* xrun */
}
- res = comp_buffer_can_copy_bytes(source, sink, need_sink);
- if (res) {
+ if (sink->free < need_sink) {
trace_src_error("xro");
return -EIO; /* xrun */
}
- /* Run SRC function if buffers avail and free allow */
- if (((int) source->avail >= need_source) && ((int) sink->free >= need_sink)) {
- cd->src_func(dev, source, sink, &consumed, &produced);
+ cd->src_func(dev, source, sink, &consumed, &produced);
- /* Calc new free and available if data was processed. These
- * functions must not be called with 0 consumed/produced.
- */
- if (consumed > 0)
- comp_update_buffer_consume(source, consumed);
+ /* Calc new free and available if data was processed. These
+ * functions must not be called with 0 consumed/produced.
+ */
+ if (consumed > 0)
+ comp_update_buffer_consume(source, consumed);
+
+ if (produced > 0)
+ comp_update_buffer_produce(sink, produced);
- if (produced > 0)
- comp_update_buffer_produce(sink, produced);
- }
return 0;
}
--
2.11.0
More information about the Sound-open-firmware
mailing list