[Sound-open-firmware] [PATCH] component: don't report xrun in comp_copy().

Keyon Jie yang.jie at linux.intel.com
Tue Jan 16 15:05:28 CET 2018


We don't need to report xrun every time it can't do real
copy(buffer avail/free not enough), e.g. we actually don't
need copy if sink buffer is full, we should do empty copy
and return success to let pipeline schedule continue.

The xrun will be checked in scheduling component (usually
is dai) only and reported there.

Todo: remove xrun check in other components also, e.g.
mixer, src, etc.

Signed-off-by: Keyon Jie <yang.jie at linux.intel.com>
---
Sanity test passed on minnow turbot with rt5651.
SOF #master: commit 83fec1559716d5a06137b43848abc18c244bc9e6
SOF Tool #master: commit a6bb8de907acd642302a227f403bb9fb2c18d075
Kernel: git at github.com:plbossart/sound.git #topic/sof-v4.14:
        commit 772ab0da7a8298d08edd42ab9a4f4177ec37aec6

 src/audio/host.c   |  6 +++---
 src/audio/volume.c | 12 ++++++------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/audio/host.c b/src/audio/host.c
index 7cba6df..0a047b3 100644
--- a/src/audio/host.c
+++ b/src/audio/host.c
@@ -622,9 +622,9 @@ static int host_copy(struct comp_dev *dev)
 
 		if (dma_buffer->free < local_elem->size) {
 			/* make sure there is free bytes for next period */
-			trace_host_error("xro");
-			comp_overrun(dev, dma_buffer, local_elem->size, 0);
-			return -EIO;
+			/* dont be too nervous, just warning and return */
+			trace_host("xo?");
+			return 0;
 		}
 	} else {
 
diff --git a/src/audio/volume.c b/src/audio/volume.c
index 05459b8..9ea3c92 100644
--- a/src/audio/volume.c
+++ b/src/audio/volume.c
@@ -577,14 +577,14 @@ static int volume_copy(struct comp_dev *dev)
 	 * the sink component buffer has enough free bytes for copy. Also
 	 * check for XRUNs */
 	if (source->avail < cd->source_period_bytes) {
-		trace_volume_error("xru");
-		comp_underrun(dev, source, cd->source_period_bytes, 0);
-		return -EIO;	/* xrun */
+		/* dont be too nervous, just warning if can't copy this time */
+		trace_volume("xu?");
+		return 0; /* don't break the pipeline */
 	}
 	if (sink->free < cd->sink_period_bytes) {
-		trace_volume_error("xro");
-		comp_overrun(dev, sink, cd->sink_period_bytes, 0);
-		return -EIO;	/* xrun */
+		/* dont be too nervous, just warning if can't copy this time */
+		trace_volume_error("xo?");
+		return 0; /* don't break the pipeline */
 	}
 
 	/* copy and scale volume */
-- 
2.11.0



More information about the Sound-open-firmware mailing list