mailman.alsa-project.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

Sound-open-firmware

Thread Start a new thread
Download
Threads by month
  • ----- 2025 -----
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
sound-open-firmware@alsa-project.org

September 2017

  • 8 participants
  • 63 discussions
[Sound-open-firmware] [PATCH] core: make sure we emit trace errors for when returning error values.
by Liam Girdwood 08 Sep '17

08 Sep '17
Makes debug easier. Signed-off-by: Liam Girdwood <liam.r.girdwood(a)linux.intel.com> --- src/audio/component.c | 1 + src/audio/pipeline.c | 21 ++++++++++++++------- src/ipc/intel-ipc.c | 1 + 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/audio/component.c b/src/audio/component.c index 232ef02..2a397d7 100644 --- a/src/audio/component.c +++ b/src/audio/component.c @@ -148,6 +148,7 @@ int comp_set_state(struct comp_dev *dev, int cmd) break; default: trace_comp_error("CEd"); + trace_value(cmd); ret = -EINVAL; break; } diff --git a/src/audio/pipeline.c b/src/audio/pipeline.c index 9aedc21..687efe9 100644 --- a/src/audio/pipeline.c +++ b/src/audio/pipeline.c @@ -465,7 +465,7 @@ static int preload_downstream(struct comp_dev *start, struct comp_dev *current) struct list_item *clist; int i, total = 0, count = 0; - trace_pipe("PR-"); + tracev_pipe("PR-"); tracev_value(current->comp.id); /* reached endpoint ? */ @@ -574,8 +574,11 @@ int pipeline_cmd(struct pipeline *p, struct comp_dev *host, int cmd, ret = component_op_upstream(&op_data, host, host, NULL); } - if (ret < 0) - trace_ipc_error("pae"); + if (ret < 0) { + trace_ipc_error("pc0"); + trace_value(host->comp.id); + trace_value(cmd); + } spin_unlock(&p->lock); return ret; @@ -617,8 +620,10 @@ int pipeline_params(struct pipeline *p, struct comp_dev *host, ret = component_op_upstream(&op_data, host, host, NULL); } - if (ret < 0) - trace_ipc_error("pae"); + if (ret < 0) { + trace_ipc_error("pp0"); + trace_value(host->comp.id); + } spin_unlock(&p->lock); return ret; @@ -645,8 +650,10 @@ int pipeline_reset(struct pipeline *p, struct comp_dev *host) ret = component_op_upstream(&op_data, host, host, NULL); } - if (ret < 0) - trace_ipc_error("pae"); + if (ret < 0) { + trace_ipc_error("pr0"); + trace_value(host->comp.id); + } spin_unlock(&p->lock); return ret; diff --git a/src/ipc/intel-ipc.c b/src/ipc/intel-ipc.c index 3912174..18d8732 100644 --- a/src/ipc/intel-ipc.c +++ b/src/ipc/intel-ipc.c @@ -567,6 +567,7 @@ static int ipc_comp_value(uint32_t header, uint32_t cmd) stream_dev = ipc_get_comp(_ipc, data->comp_id); if (stream_dev == NULL){ trace_ipc_error("eVg"); + trace_value(data->comp_id); return -ENODEV; } -- 2.11.0
1 2
0 0
[Sound-open-firmware] [PATCH] topology: Add support for 32bit data to playback and capture PCMs
by Liam Girdwood 08 Sep '17

08 Sep '17
Add S32_LE data support to the PCMs Signed-off-by: Liam Girdwood <liam.r.girdwood(a)linux.intel.com> --- topology/sof/pipe-low-latency-capture.m4 | 2 +- topology/sof/pipe-low-latency-playback.m4 | 2 +- topology/sof/pipe-passthrough-playback.m4 | 2 +- topology/sof/pipe-passthrough-vol-playback.m4 | 2 +- topology/sof/pipe-pcm-media.m4 | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/topology/sof/pipe-low-latency-capture.m4 b/topology/sof/pipe-low-latency-capture.m4 index 111aa86..d041dca 100644 --- a/topology/sof/pipe-low-latency-capture.m4 +++ b/topology/sof/pipe-low-latency-capture.m4 @@ -89,7 +89,7 @@ W_PIPELINE(N_PGA(0), SCHEDULE_DEADLINE, SCHEDULE_PRIORITY, SCHEDULE_FRAMES, SCHE SectionPCMCapabilities.STR(Low Latency Capture PCM_ID) { - formats "S24_LE,S16_LE" + formats "S32_LE,S24_LE,S16_LE" rate_min "48000" rate_max "48000" channels_min "2" diff --git a/topology/sof/pipe-low-latency-playback.m4 b/topology/sof/pipe-low-latency-playback.m4 index a860c82..3db55cf 100644 --- a/topology/sof/pipe-low-latency-playback.m4 +++ b/topology/sof/pipe-low-latency-playback.m4 @@ -155,7 +155,7 @@ W_PIPELINE(N_PGA(1), SCHEDULE_DEADLINE, SCHEDULE_PRIORITY, SCHEDULE_FRAMES, SCHE # PCM capabilities supported by FW SectionPCMCapabilities.STR(Low Latency Playback PCM_ID) { - formats "S24_LE,S16_LE" + formats "S32_LE,S24_LE,S16_LE" rate_min "48000" rate_max "48000" channels_min "2" diff --git a/topology/sof/pipe-passthrough-playback.m4 b/topology/sof/pipe-passthrough-playback.m4 index a6ecb32..732e173 100644 --- a/topology/sof/pipe-passthrough-playback.m4 +++ b/topology/sof/pipe-passthrough-playback.m4 @@ -52,7 +52,7 @@ SectionGraph."pipe-pass-playback-PIPELINE_ID" { SectionPCMCapabilities.STR(Passthrough Playback PCM_ID) { - formats "S24_LE,S16_LE" + formats "S32_LE,S24_LE,S16_LE" rate_min "48000" rate_max "48000" channels_min "2" diff --git a/topology/sof/pipe-passthrough-vol-playback.m4 b/topology/sof/pipe-passthrough-vol-playback.m4 index bf131c3..be3f9ec 100644 --- a/topology/sof/pipe-passthrough-vol-playback.m4 +++ b/topology/sof/pipe-passthrough-vol-playback.m4 @@ -91,7 +91,7 @@ SectionGraph."pipe-pass-vol-playback-PIPELINE_ID" { SectionPCMCapabilities.STR(Passthrough Playback PCM_ID) { - formats "S24_LE,S16_LE" + formats "S32_LE,S24_LE,S16_LE" rate_min "48000" rate_max "48000" channels_min "2" diff --git a/topology/sof/pipe-pcm-media.m4 b/topology/sof/pipe-pcm-media.m4 index 97958cd..b766e23 100644 --- a/topology/sof/pipe-pcm-media.m4 +++ b/topology/sof/pipe-pcm-media.m4 @@ -120,7 +120,7 @@ W_PIPELINE(N_SRC(0), SCHEDULE_DEADLINE, SCHEDULE_PRIORITY, SCHEDULE_FRAMES, SCHE # PCM capabilities supported by FW SectionPCMCapabilities.STR(Media Playback PCM_ID) { - formats "S24_LE,S16_LE" + formats "S32_LE,S24_LE,S16_LE" rate_min "8000" rate_max "192000" channels_min "2" -- 2.11.0
1 0
0 0
[Sound-open-firmware] [PATCH v4 1/5] Makefile and configure changes to add testbench
by Ranjani Sridharan 07 Sep '17

07 Sep '17
This patch adds the changes to configure.ac and Makefile to add the testbench directories Signed-off-by: Ranjani Sridharan <ranjani.sridharan(a)linux.intel.com> --- Makefile.am | 2 +- configure.ac | 5 +++++ tune/Makefile.am | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 tune/Makefile.am diff --git a/Makefile.am b/Makefile.am index ea01286..4f359ea 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1 +1 @@ -SUBDIRS = rimage rmbox topology +SUBDIRS = rimage rmbox topology tune diff --git a/configure.ac b/configure.ac index 87c7519..d5e4f48 100644 --- a/configure.ac +++ b/configure.ac @@ -17,6 +17,11 @@ AC_OUTPUT([ rimage/Makefile rmbox/Makefile topology/Makefile + tune/Makefile + tune/src/Makefile + tune/mux/Makefile + tune/passthrough/Makefile + tune/eq/Makefile ]) echo " diff --git a/tune/Makefile.am b/tune/Makefile.am new file mode 100644 index 0000000..b2dc2d9 --- /dev/null +++ b/tune/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src eq mux passthrough -- 2.9.3
1 4
0 0
[Sound-open-firmware] [PATCH 1/2] comp: buffer: reject buffer size 0 requests.
by Liam Girdwood 07 Sep '17

07 Sep '17
Signed-off-by: Liam Girdwood <liam.r.girdwood(a)linux.intel.com> --- src/include/reef/audio/buffer.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/include/reef/audio/buffer.h b/src/include/reef/audio/buffer.h index e708ee2..ea9bd9c 100644 --- a/src/include/reef/audio/buffer.h +++ b/src/include/reef/audio/buffer.h @@ -183,6 +183,8 @@ static inline int buffer_set_size(struct comp_buffer *buffer, uint32_t size) { if (size > buffer->alloc_size) return -ENOMEM; + if (size == 0) + return -EINVAL; buffer->end_addr = buffer->addr + size; buffer->size = size; -- 2.11.0
1 1
0 0
[Sound-open-firmware] [PATCH v4 1/3] comp: default function to set comp state
by Ranjani Sridharan 07 Sep '17

07 Sep '17
This patch adds a the comp_set_state() used for the mandatory pipeline commands, START, STOP, PAUSE and RELEASE. It also updates the cmd method in existing components to use comp_set_state(). Signed-off-by: Ranjani Sridharan <ranjani.sridharan(a)linux.intel.com> --- src/audio/component.c | 38 ++++++++++++++++++++++++++++++++++++++ src/audio/eq_fir.c | 23 +---------------------- src/audio/host.c | 16 ++++------------ src/audio/src.c | 25 +++---------------------- src/audio/tone.c | 28 +++++----------------------- src/audio/volume.c | 19 +++---------------- src/include/reef/audio/component.h | 3 +++ 7 files changed, 57 insertions(+), 95 deletions(-) diff --git a/src/audio/component.c b/src/audio/component.c index 6369e2e..232ef02 100644 --- a/src/audio/component.c +++ b/src/audio/component.c @@ -117,6 +117,44 @@ void comp_unregister(struct comp_driver *drv) spin_unlock(&cd->lock); } +int comp_set_state(struct comp_dev *dev, int cmd) +{ + int ret = 0; + + switch (cmd) { + case COMP_CMD_START: + case COMP_CMD_RELEASE: + dev->state = COMP_STATE_RUNNING; + break; + case COMP_CMD_STOP: + if (dev->state == COMP_STATE_RUNNING || + dev->state == COMP_STATE_DRAINING || + dev->state == COMP_STATE_PAUSED) { + comp_buffer_reset(dev); + dev->state = COMP_STATE_SETUP; + } else { + trace_comp_error("CEs"); + ret = -EINVAL; + } + break; + case COMP_CMD_PAUSE: + /* only support pausing for running */ + if (dev->state == COMP_STATE_RUNNING) + dev->state = COMP_STATE_PAUSED; + else { + trace_comp_error("CEp"); + ret = -EINVAL; + } + break; + default: + trace_comp_error("CEd"); + ret = -EINVAL; + break; + } + + return ret; +} + void sys_comp_init(void) { cd = rzalloc(RZONE_SYS, RFLAGS_NONE, sizeof(*cd)); diff --git a/src/audio/eq_fir.c b/src/audio/eq_fir.c index 540c68f..98cd43e 100644 --- a/src/audio/eq_fir.c +++ b/src/audio/eq_fir.c @@ -382,32 +382,11 @@ static int eq_fir_cmd(struct comp_dev *dev, int cmd, void *data) ret = fir_cmd(dev, cdata); break; case COMP_CMD_START: - trace_src("EFs"); - dev->state = COMP_STATE_RUNNING; - break; case COMP_CMD_STOP: - trace_src("ESp"); - if (dev->state == COMP_STATE_RUNNING || - dev->state == COMP_STATE_DRAINING || - dev->state == COMP_STATE_PAUSED) { - comp_buffer_reset(dev); - dev->state = COMP_STATE_SETUP; - } - break; case COMP_CMD_PAUSE: - trace_src("EPe"); - /* only support pausing for running */ - if (dev->state == COMP_STATE_RUNNING) - dev->state = COMP_STATE_PAUSED; - - break; case COMP_CMD_RELEASE: - trace_src("ERl"); - dev->state = COMP_STATE_RUNNING; - break; default: - trace_src("EDf"); - ret = -EINVAL; + ret = comp_set_state(dev, cmd); break; } diff --git a/src/audio/host.c b/src/audio/host.c index e71e95f..f81fd66 100644 --- a/src/audio/host.c +++ b/src/audio/host.c @@ -553,28 +553,20 @@ static int host_cmd(struct comp_dev *dev, int cmd, void *data) // TODO: align cmd macros. switch (cmd) { - case COMP_CMD_PAUSE: - /* only support pausing for running, channel is paused by DAI */ - if (dev->state == COMP_STATE_RUNNING) - dev->state = COMP_STATE_PAUSED; - break; case COMP_CMD_STOP: if (dev->state == COMP_STATE_RUNNING || dev->state == COMP_STATE_DRAINING || dev->state == COMP_STATE_PAUSED) ret = host_stop(dev); break; - case COMP_CMD_RELEASE: - /* channel is released by DAI */ - dev->state = COMP_STATE_RUNNING; - break; - case COMP_CMD_START: - dev->state = COMP_STATE_RUNNING; - break; case COMP_CMD_SUSPEND: case COMP_CMD_RESUME: break; + case COMP_CMD_START: + case COMP_CMD_PAUSE: + case COMP_CMD_RELEASE: default: + ret = comp_set_state(dev, cmd); break; } diff --git a/src/audio/src.c b/src/audio/src.c index c11ef3f..34cab7a 100644 --- a/src/audio/src.c +++ b/src/audio/src.c @@ -431,6 +431,7 @@ static int src_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata) static int src_cmd(struct comp_dev *dev, int cmd, void *data) { struct sof_ipc_ctrl_data *cdata = data; + int ret = 0; trace_src("SCm"); @@ -438,35 +439,15 @@ static int src_cmd(struct comp_dev *dev, int cmd, void *data) case COMP_CMD_SET_VALUE: return src_ctrl_cmd(dev, cdata); case COMP_CMD_START: - trace_src("SSt"); - dev->state = COMP_STATE_RUNNING; - break; case COMP_CMD_STOP: - trace_src("SSp"); - if (dev->state == COMP_STATE_RUNNING || - dev->state == COMP_STATE_DRAINING || - dev->state == COMP_STATE_PAUSED) { - comp_buffer_reset(dev); - dev->state = COMP_STATE_SETUP; - } - break; case COMP_CMD_PAUSE: - trace_src("SPe"); - /* only support pausing for running */ - if (dev->state == COMP_STATE_RUNNING) - dev->state = COMP_STATE_PAUSED; - - break; case COMP_CMD_RELEASE: - trace_src("SRl"); - dev->state = COMP_STATE_RUNNING; - break; default: - trace_src("SDf"); + ret = comp_set_state(dev, cmd); break; } - return 0; + return ret; } /* copy and process stream data from source to sink buffers */ diff --git a/src/audio/tone.c b/src/audio/tone.c index 448c472..aec8a72 100644 --- a/src/audio/tone.c +++ b/src/audio/tone.c @@ -434,6 +434,8 @@ static int tone_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata) { struct comp_data *cd = comp_get_drvdata(dev); + trace_tone("tri"); + switch (cdata->cmd) { case SOF_CTRL_CMD_MUTE: trace_tone("TMu"); @@ -468,6 +470,7 @@ static int tone_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata) static int tone_cmd(struct comp_dev *dev, int cmd, void *data) { struct sof_ipc_ctrl_data *cdata = data; + int ret = 0; trace_tone("tri"); @@ -475,36 +478,15 @@ static int tone_cmd(struct comp_dev *dev, int cmd, void *data) case COMP_CMD_SET_VALUE: return tone_ctrl_cmd(dev, cdata); case COMP_CMD_START: - trace_tone("TSt"); - dev->state = COMP_STATE_RUNNING; - break; case COMP_CMD_STOP: - trace_tone("TSp"); - if (dev->state == COMP_STATE_RUNNING || - dev->state == COMP_STATE_DRAINING || - dev->state == COMP_STATE_PAUSED) { - comp_buffer_reset(dev); - dev->state = COMP_STATE_SETUP; - } - break; case COMP_CMD_PAUSE: - trace_tone("TPe"); - /* only support pausing for running */ - if (dev->state == COMP_STATE_RUNNING) - dev->state = COMP_STATE_PAUSED; - - break; case COMP_CMD_RELEASE: - trace_tone("TRl"); - dev->state = COMP_STATE_RUNNING; - break; default: - trace_tone("TDf"); - + ret = comp_set_state(dev, cmd); break; } - return 0; + return ret; } /* copy and process stream data from source to sink buffers */ diff --git a/src/audio/volume.c b/src/audio/volume.c index c88f9d2..d642320 100644 --- a/src/audio/volume.c +++ b/src/audio/volume.c @@ -429,6 +429,7 @@ static int volume_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata static int volume_cmd(struct comp_dev *dev, int cmd, void *data) { struct sof_ipc_ctrl_data *cdata = data; + int ret = 0; trace_volume("cmd"); @@ -436,29 +437,15 @@ static int volume_cmd(struct comp_dev *dev, int cmd, void *data) case COMP_CMD_SET_VALUE: return volume_ctrl_cmd(dev, cdata); case COMP_CMD_START: - dev->state = COMP_STATE_RUNNING; - break; case COMP_CMD_STOP: - if (dev->state == COMP_STATE_RUNNING || - dev->state == COMP_STATE_DRAINING || - dev->state == COMP_STATE_PAUSED) { - comp_buffer_reset(dev); - dev->state = COMP_STATE_SETUP; - } - break; case COMP_CMD_PAUSE: - /* only support pausing for running */ - if (dev->state == COMP_STATE_RUNNING) - dev->state = COMP_STATE_PAUSED; - break; case COMP_CMD_RELEASE: - dev->state = COMP_STATE_RUNNING; - break; default: + ret = comp_set_state(dev, cmd); break; } - return 0; + return ret; } /* copy and process stream data from source to sink buffers */ diff --git a/src/include/reef/audio/component.h b/src/include/reef/audio/component.h index 9793c36..d7ea29a 100644 --- a/src/include/reef/audio/component.h +++ b/src/include/reef/audio/component.h @@ -214,6 +214,9 @@ static inline void comp_free(struct comp_dev *dev) dev->drv->ops.free(dev); } +/* component state set */ +int comp_set_state(struct comp_dev *dev, int cmd); + /* component parameter init - mandatory */ static inline int comp_params(struct comp_dev *dev) { -- 2.9.3
2 1
0 0
[Sound-open-firmware] [PATCH] comp: dai: drain and stop notifications come from host.
by Liam Girdwood 07 Sep '17

07 Sep '17
Make sure all stop/drain notification come from host and not DAI component. Signed-off-by: Liam Girdwood <liam.r.girdwood(a)linux.intel.com> --- src/audio/dai.c | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/src/audio/dai.c b/src/audio/dai.c index e085096..30d3ae9 100644 --- a/src/audio/dai.c +++ b/src/audio/dai.c @@ -121,38 +121,9 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next) } } - if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK && - dma_buffer->avail < dd->period_bytes) { - /* end of stream, finish */ - if (dma_buffer->avail == 0) { - dai_cmd(dev, COMP_CMD_STOP, NULL); - - /* stop dma immediately */ - next->size = DMA_RELOAD_END; - - /* let any waiters know we have completed */ - //wait_completed(&dev->pipeline->complete); - - return; - } else { - /* drain the last bytes */ - next->src = (uint32_t)dma_buffer->r_ptr; - next->dest = dai_fifo(dd->dai, SOF_IPC_STREAM_PLAYBACK); - next->size = dma_buffer->avail; - - dd->last_bytes = next->size; - - goto next_copy; - - } - - } - /* notify pipeline that DAI needs it's buffer processed */ pipeline_schedule_copy(dev->pipeline, dev); -next_copy: - return; } -- 2.11.0
1 0
0 0
[Sound-open-firmware] [PATCH] comp: buffer: add support for non period aligned buffers
by Liam Girdwood 07 Sep '17

07 Sep '17
Add support for non period aligned buffers to the buffer free/avail calculation. Signed-off-by: Liam Girdwood <liam.r.girdwood(a)linux.intel.com> --- src/include/reef/audio/buffer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/reef/audio/buffer.h b/src/include/reef/audio/buffer.h index 54978a8..83fcd57 100644 --- a/src/include/reef/audio/buffer.h +++ b/src/include/reef/audio/buffer.h @@ -93,7 +93,7 @@ static inline void comp_update_buffer_produce(struct comp_buffer *buffer, /* check for pointer wrap */ if (buffer->w_ptr >= buffer->end_addr) - buffer->w_ptr = buffer->addr; + buffer->w_ptr = buffer->addr + (buffer->w_ptr - buffer->end_addr); /* calculate available bytes */ if (buffer->r_ptr < buffer->w_ptr) @@ -127,7 +127,7 @@ static inline void comp_update_buffer_consume(struct comp_buffer *buffer, /* check for pointer wrap */ if (buffer->r_ptr >= buffer->end_addr) - buffer->r_ptr = buffer->addr; + buffer->r_ptr = buffer->addr + (buffer->r_ptr - buffer->end_addr); /* calculate available bytes */ if (buffer->r_ptr < buffer->w_ptr) -- 2.11.0
1 3
0 0
[Sound-open-firmware] [PATCH v3 1/3] comp: default function to set comp state
by Ranjani Sridharan 06 Sep '17

06 Sep '17
This patch adds a the comp_set_state() used for the mandatory pipeline commands, START, STOP, PAUSE and RELEASE. It also updates the cmd method in existing components to use comp_set_state(). Signed-off-by: Ranjani Sridharan <ranjani.sridharan(a)linux.intel.com> --- src/audio/component.c | 38 ++++++++++++++++++++++++++++++++++++++ src/audio/eq_fir.c | 23 +---------------------- src/audio/host.c | 16 ++++------------ src/audio/src.c | 25 +++---------------------- src/audio/tone.c | 28 +++++----------------------- src/audio/volume.c | 19 +++---------------- src/include/reef/audio/component.h | 3 +++ 7 files changed, 57 insertions(+), 95 deletions(-) diff --git a/src/audio/component.c b/src/audio/component.c index 6369e2e..232ef02 100644 --- a/src/audio/component.c +++ b/src/audio/component.c @@ -117,6 +117,44 @@ void comp_unregister(struct comp_driver *drv) spin_unlock(&cd->lock); } +int comp_set_state(struct comp_dev *dev, int cmd) +{ + int ret = 0; + + switch (cmd) { + case COMP_CMD_START: + case COMP_CMD_RELEASE: + dev->state = COMP_STATE_RUNNING; + break; + case COMP_CMD_STOP: + if (dev->state == COMP_STATE_RUNNING || + dev->state == COMP_STATE_DRAINING || + dev->state == COMP_STATE_PAUSED) { + comp_buffer_reset(dev); + dev->state = COMP_STATE_SETUP; + } else { + trace_comp_error("CEs"); + ret = -EINVAL; + } + break; + case COMP_CMD_PAUSE: + /* only support pausing for running */ + if (dev->state == COMP_STATE_RUNNING) + dev->state = COMP_STATE_PAUSED; + else { + trace_comp_error("CEp"); + ret = -EINVAL; + } + break; + default: + trace_comp_error("CEd"); + ret = -EINVAL; + break; + } + + return ret; +} + void sys_comp_init(void) { cd = rzalloc(RZONE_SYS, RFLAGS_NONE, sizeof(*cd)); diff --git a/src/audio/eq_fir.c b/src/audio/eq_fir.c index 540c68f..98cd43e 100644 --- a/src/audio/eq_fir.c +++ b/src/audio/eq_fir.c @@ -382,32 +382,11 @@ static int eq_fir_cmd(struct comp_dev *dev, int cmd, void *data) ret = fir_cmd(dev, cdata); break; case COMP_CMD_START: - trace_src("EFs"); - dev->state = COMP_STATE_RUNNING; - break; case COMP_CMD_STOP: - trace_src("ESp"); - if (dev->state == COMP_STATE_RUNNING || - dev->state == COMP_STATE_DRAINING || - dev->state == COMP_STATE_PAUSED) { - comp_buffer_reset(dev); - dev->state = COMP_STATE_SETUP; - } - break; case COMP_CMD_PAUSE: - trace_src("EPe"); - /* only support pausing for running */ - if (dev->state == COMP_STATE_RUNNING) - dev->state = COMP_STATE_PAUSED; - - break; case COMP_CMD_RELEASE: - trace_src("ERl"); - dev->state = COMP_STATE_RUNNING; - break; default: - trace_src("EDf"); - ret = -EINVAL; + ret = comp_set_state(dev, cmd); break; } diff --git a/src/audio/host.c b/src/audio/host.c index e71e95f..f81fd66 100644 --- a/src/audio/host.c +++ b/src/audio/host.c @@ -553,28 +553,20 @@ static int host_cmd(struct comp_dev *dev, int cmd, void *data) // TODO: align cmd macros. switch (cmd) { - case COMP_CMD_PAUSE: - /* only support pausing for running, channel is paused by DAI */ - if (dev->state == COMP_STATE_RUNNING) - dev->state = COMP_STATE_PAUSED; - break; case COMP_CMD_STOP: if (dev->state == COMP_STATE_RUNNING || dev->state == COMP_STATE_DRAINING || dev->state == COMP_STATE_PAUSED) ret = host_stop(dev); break; - case COMP_CMD_RELEASE: - /* channel is released by DAI */ - dev->state = COMP_STATE_RUNNING; - break; - case COMP_CMD_START: - dev->state = COMP_STATE_RUNNING; - break; case COMP_CMD_SUSPEND: case COMP_CMD_RESUME: break; + case COMP_CMD_START: + case COMP_CMD_PAUSE: + case COMP_CMD_RELEASE: default: + ret = comp_set_state(dev, cmd); break; } diff --git a/src/audio/src.c b/src/audio/src.c index c11ef3f..34cab7a 100644 --- a/src/audio/src.c +++ b/src/audio/src.c @@ -431,6 +431,7 @@ static int src_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata) static int src_cmd(struct comp_dev *dev, int cmd, void *data) { struct sof_ipc_ctrl_data *cdata = data; + int ret = 0; trace_src("SCm"); @@ -438,35 +439,15 @@ static int src_cmd(struct comp_dev *dev, int cmd, void *data) case COMP_CMD_SET_VALUE: return src_ctrl_cmd(dev, cdata); case COMP_CMD_START: - trace_src("SSt"); - dev->state = COMP_STATE_RUNNING; - break; case COMP_CMD_STOP: - trace_src("SSp"); - if (dev->state == COMP_STATE_RUNNING || - dev->state == COMP_STATE_DRAINING || - dev->state == COMP_STATE_PAUSED) { - comp_buffer_reset(dev); - dev->state = COMP_STATE_SETUP; - } - break; case COMP_CMD_PAUSE: - trace_src("SPe"); - /* only support pausing for running */ - if (dev->state == COMP_STATE_RUNNING) - dev->state = COMP_STATE_PAUSED; - - break; case COMP_CMD_RELEASE: - trace_src("SRl"); - dev->state = COMP_STATE_RUNNING; - break; default: - trace_src("SDf"); + ret = comp_set_state(dev, cmd); break; } - return 0; + return ret; } /* copy and process stream data from source to sink buffers */ diff --git a/src/audio/tone.c b/src/audio/tone.c index 448c472..aec8a72 100644 --- a/src/audio/tone.c +++ b/src/audio/tone.c @@ -434,6 +434,8 @@ static int tone_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata) { struct comp_data *cd = comp_get_drvdata(dev); + trace_tone("tri"); + switch (cdata->cmd) { case SOF_CTRL_CMD_MUTE: trace_tone("TMu"); @@ -468,6 +470,7 @@ static int tone_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata) static int tone_cmd(struct comp_dev *dev, int cmd, void *data) { struct sof_ipc_ctrl_data *cdata = data; + int ret = 0; trace_tone("tri"); @@ -475,36 +478,15 @@ static int tone_cmd(struct comp_dev *dev, int cmd, void *data) case COMP_CMD_SET_VALUE: return tone_ctrl_cmd(dev, cdata); case COMP_CMD_START: - trace_tone("TSt"); - dev->state = COMP_STATE_RUNNING; - break; case COMP_CMD_STOP: - trace_tone("TSp"); - if (dev->state == COMP_STATE_RUNNING || - dev->state == COMP_STATE_DRAINING || - dev->state == COMP_STATE_PAUSED) { - comp_buffer_reset(dev); - dev->state = COMP_STATE_SETUP; - } - break; case COMP_CMD_PAUSE: - trace_tone("TPe"); - /* only support pausing for running */ - if (dev->state == COMP_STATE_RUNNING) - dev->state = COMP_STATE_PAUSED; - - break; case COMP_CMD_RELEASE: - trace_tone("TRl"); - dev->state = COMP_STATE_RUNNING; - break; default: - trace_tone("TDf"); - + ret = comp_set_state(dev, cmd); break; } - return 0; + return ret; } /* copy and process stream data from source to sink buffers */ diff --git a/src/audio/volume.c b/src/audio/volume.c index 6cbd6ff..6fa36c4 100644 --- a/src/audio/volume.c +++ b/src/audio/volume.c @@ -429,6 +429,7 @@ static int volume_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata static int volume_cmd(struct comp_dev *dev, int cmd, void *data) { struct sof_ipc_ctrl_data *cdata = data; + int ret = 0; trace_volume("cmd"); @@ -436,29 +437,15 @@ static int volume_cmd(struct comp_dev *dev, int cmd, void *data) case COMP_CMD_SET_VALUE: return volume_ctrl_cmd(dev, cdata); case COMP_CMD_START: - dev->state = COMP_STATE_RUNNING; - break; case COMP_CMD_STOP: - if (dev->state == COMP_STATE_RUNNING || - dev->state == COMP_STATE_DRAINING || - dev->state == COMP_STATE_PAUSED) { - comp_buffer_reset(dev); - dev->state = COMP_STATE_SETUP; - } - break; case COMP_CMD_PAUSE: - /* only support pausing for running */ - if (dev->state == COMP_STATE_RUNNING) - dev->state = COMP_STATE_PAUSED; - break; case COMP_CMD_RELEASE: - dev->state = COMP_STATE_RUNNING; - break; default: + ret = comp_set_state(dev, cmd); break; } - return 0; + return ret; } /* copy and process stream data from source to sink buffers */ diff --git a/src/include/reef/audio/component.h b/src/include/reef/audio/component.h index 35c80de..e20ffed 100644 --- a/src/include/reef/audio/component.h +++ b/src/include/reef/audio/component.h @@ -214,6 +214,9 @@ static inline void comp_free(struct comp_dev *dev) dev->drv->ops.free(dev); } +/* component state set */ +int comp_set_state(struct comp_dev *dev, int cmd); + /* component parameter init - mandatory */ static inline int comp_params(struct comp_dev *dev) { -- 2.9.3
2 1
0 0
[Sound-open-firmware] [PATCH] SRC: Bug fix for copy period length and some init code cleanup
by Seppo Ingalsuo 06 Sep '17

06 Sep '17
The error in computing block length in copy() function is fixed. It caused SRC to use unnecessarily long blocks with some rates and fail to execute within available buffer size. The input and output block length is now computed in initization. Sample rates support mask bit for 7350 Hz is removed also. Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo(a)linux.intel.com> --- src/audio/src.c | 26 +++++---- src/audio/src_core.c | 153 +++++++++++++++++++++++++++------------------------ src/audio/src_core.h | 12 +++- 3 files changed, 104 insertions(+), 87 deletions(-) diff --git a/src/audio/src.c b/src/audio/src.c index c11ef3f..d741aeb 100644 --- a/src/audio/src.c +++ b/src/audio/src.c @@ -311,7 +311,7 @@ static int src_params(struct comp_dev *dev) size_t delay_lines_size; uint32_t source_rate, sink_rate; int32_t *buffer_start; - int n = 0, i, err; + int n = 0, i, err, frames_is_for_source; trace_src("par"); @@ -329,21 +329,25 @@ static int src_params(struct comp_dev *dev) sink_rate = src->sink_rate; /* re-write our params with output rate for next component */ params->rate = sink_rate; + frames_is_for_source = 0; } else { /* params rate is sink rate */ source_rate = src->source_rate; sink_rate = params->rate; /* re-write our params with output rate for next component */ params->rate = source_rate; + frames_is_for_source = 1; } /* Allocate needed memory for delay lines */ - err = src_buffer_lengths(&need, source_rate, sink_rate, params->channels); + err = src_buffer_lengths(&need, source_rate, sink_rate, + params->channels, dev->frames, frames_is_for_source); if (err < 0) { trace_src_error("sr1"); trace_value(source_rate); trace_value(sink_rate); trace_value(params->channels); + trace_value(dev->frames); return err; } @@ -371,8 +375,8 @@ static int src_params(struct comp_dev *dev) /* Initize SRC for actual sample rate */ for (i = 0; i < params->channels; i++) { - n = src_polyphase_init(&cd->src[i], source_rate, - sink_rate, buffer_start); + n = src_polyphase_init(&cd->src[i], source_rate, sink_rate, + &need, buffer_start); buffer_start += need.single_src; } @@ -474,7 +478,7 @@ static int src_copy(struct comp_dev *dev) { struct comp_data *cd = comp_get_drvdata(dev); struct comp_buffer *source, *sink; - int need_source, need_sink, blk_in, blk_out, frames_source, frames_sink; + int need_source, need_sink, blk_in, blk_out; trace_comp("SRC"); @@ -484,20 +488,18 @@ static int src_copy(struct comp_dev *dev) sink = list_first_item(&dev->bsink_list, struct comp_buffer, source_list); - /* Check that source has enough frames available and sink enough - * frames free. + /* Calculate needed amount of source buffer and sink buffer + * for one SRC run. */ blk_in = src_polyphase_get_blk_in(&cd->src[0]); blk_out = src_polyphase_get_blk_out(&cd->src[0]); - frames_source = dev->frames * blk_in / blk_out; - frames_sink = frames_source * blk_out / blk_in; - need_source = frames_source * dev->frame_bytes; - need_sink = frames_sink * dev->frame_bytes; + need_source = blk_in * dev->frame_bytes; + need_sink = blk_out * dev->frame_bytes; /* Run as many times as buffers allow */ while ((source->avail >= need_source) && (sink->free >= need_sink)) { /* Run src */ - cd->src_func(dev, source, sink, frames_source, frames_sink); + cd->src_func(dev, source, sink, blk_in, blk_out); /* calc new free and available */ comp_update_buffer_consume(source, 0); diff --git a/src/audio/src_core.c b/src/audio/src_core.c index 55f7062..cc44734 100644 --- a/src/audio/src_core.c +++ b/src/audio/src_core.c @@ -52,8 +52,8 @@ #endif /* TODO: These should be defined somewhere else. */ -#define SOF_RATES_LENGTH 16 -int sof_rates[SOF_RATES_LENGTH] = {7350, 8000, 11025, 12000, 16000, 18900, +#define SOF_RATES_LENGTH 15 +int sof_rates[SOF_RATES_LENGTH] = {8000, 11025, 12000, 16000, 18900, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000, 176400, 192000}; @@ -71,20 +71,6 @@ int src_out_delay_length(struct src_stage *s) return (s->num_of_subfilters - 1) * s->odm + 1; } -/* Calculates the buffer length needed between two SRC stages */ -int src_stage_buf_length(struct src_stage *s1, struct src_stage *s2) -{ - int k, s1_times; - - if ((s1->blk_out == 0) || (s2->blk_in == 0)) - return 0; - - k = gcd(s1->blk_out, s2->blk_in); - s1_times = s2->blk_in / k; - - return s1->blk_out * s1_times; -} - /* Returns index of a matching sample rate */ int src_find_fs(int fs_list[], int list_length, int fs) { @@ -126,31 +112,65 @@ int32_t src_output_rates(void) } /* Calculates buffers to allocate for a SRC mode */ -int src_buffer_lengths(struct src_alloc *a, int fs_in, int fs_out, int nch) +int src_buffer_lengths(struct src_alloc *a, int fs_in, int fs_out, int nch, + int max_frames, int max_frames_is_for_source) { - int idx_in, idx_out; + int blk_in, blk_out, k, s1_times, s2_times; struct src_stage *stage1, *stage2; - idx_in = src_find_fs(src_in_fs, NUM_IN_FS, fs_in); - idx_out = src_find_fs(src_out_fs, NUM_OUT_FS, fs_out); + a->idx_in = src_find_fs(src_in_fs, NUM_IN_FS, fs_in); + a->idx_out = src_find_fs(src_out_fs, NUM_OUT_FS, fs_out); - /* Return an error if no in and out match was found. */ - if ((idx_in < 0) || (idx_out < 0)) + /* Set blk_in, blk_out so that the muted fallback SRC keeps + * just source & sink in sync in pipeline without drift. + */ + if ((a->idx_in < 0) || (a->idx_out < 0)) { + k = gcd(fs_in, fs_out); + a->blk_in = fs_in / k; + a->blk_out = fs_out / k; return -EINVAL; + } - stage1 = src_table1[idx_out][idx_in]; - stage2 = src_table2[idx_out][idx_in]; + stage1 = src_table1[a->idx_out][a->idx_in]; + stage2 = src_table2[a->idx_out][a->idx_in]; a->fir_s1 = src_fir_delay_length(stage1); a->out_s1 = src_out_delay_length(stage1); + k = gcd(stage1->blk_out, stage2->blk_in); + s1_times = stage2->blk_in / k; + s2_times = s1_times * stage1->blk_out / stage2->blk_in; + blk_in = s1_times * stage1->blk_in; + blk_out = s2_times * stage2->blk_out; + + /* Find out how many additional times the SRC can be executed + while having block size less or equal to max_frames. + */ + if (max_frames_is_for_source) { + k = max_frames / blk_in; + } else { + k = max_frames / blk_out; + } + + /* Return with error if max_frames is too small even for smallest + possible SRC block length. */ + if (k < 1) + return -EINVAL; + + a->blk_mult = k; + a->blk_in = blk_in * k; + a->blk_out = blk_out * k; + a->stage1_times = s1_times * k; + a->stage2_times = s2_times * k; + if (stage2->filter_length == 1) { a->fir_s2 = 0; a->out_s2 = 0; a->scratch = 0; + a->stage2_times = 0; } else { a->fir_s2 = src_fir_delay_length(stage2); a->out_s2 = src_out_delay_length(stage2); - a->scratch = src_stage_buf_length(stage1, stage2); + a->scratch = stage1->blk_out * s1_times * k; } a->single_src = a->fir_s1 + a->fir_s2 + a->out_s1 + a->out_s2; a->total = a->scratch + nch * a->single_src; @@ -171,10 +191,9 @@ static void src_state_reset(struct src_state *state) static int init_stages( struct src_stage *stage1, struct src_stage *stage2, - struct polyphase_src *src, int n, int32_t *delay_lines_start) + struct polyphase_src *src, struct src_alloc *res, + int n, int32_t *delay_lines_start) { - int k; - /* Clear FIR state */ src_state_reset(&src->state1); src_state_reset(&src->state2); @@ -183,9 +202,9 @@ static int init_stages( src->stage1 = stage1; src->stage2 = stage2; if (n == 1) { - src->blk_in = stage1->blk_in; - src->blk_out = stage1->blk_out; - src->stage1_times = 1; + src->blk_in = stage1->blk_in * res->blk_mult; + src->blk_out = stage1->blk_out * res->blk_mult; + src->stage1_times = res->stage1_times; src->stage2_times = 0; if (stage1->blk_out == 0) return -EINVAL; @@ -193,23 +212,21 @@ static int init_stages( if ((stage1->blk_out == 0) || (stage1->blk_in == 0)) return -EINVAL; - k = gcd(stage1->blk_out, stage2->blk_in); - src->stage1_times = stage2->blk_in / k; - src->stage2_times = - src->stage1_times * stage1->blk_out / stage2->blk_in; - src->blk_in = src->stage1_times * stage1->blk_in; - src->blk_out = src->stage2_times * stage2->blk_out; + src->stage1_times = res->stage1_times; + src->stage2_times = res->stage2_times; + src->blk_in = res->blk_in; + src->blk_out = res->blk_out; } /* Delay line sizes */ - src->state1.fir_delay_size = src_fir_delay_length(stage1); - src->state1.out_delay_size = src_out_delay_length(stage1); + src->state1.fir_delay_size = res->fir_s1; //src_fir_delay_length(stage1); + src->state1.out_delay_size = res->out_s1; //src_out_delay_length(stage1); src->state1.fir_delay = delay_lines_start; src->state1.out_delay = src->state1.fir_delay + src->state1.fir_delay_size; if (n > 1) { - src->state2.fir_delay_size = src_fir_delay_length(stage2); - src->state2.out_delay_size = src_out_delay_length(stage2); + src->state2.fir_delay_size = res->fir_s2; // src_fir_delay_length(stage2); + src->state2.out_delay_size = res->out_s2; // src_out_delay_length(stage2); src->state2.fir_delay = src->state1.out_delay + src->state1.out_delay_size; src->state2.out_delay = @@ -253,45 +270,35 @@ void src_polyphase_reset(struct polyphase_src *src) } int src_polyphase_init(struct polyphase_src *src, int fs1, int fs2, - int32_t *delay_lines_start) + struct src_alloc *res, int32_t *delay_lines_start) { - int f, idx_in, idx_out, n_stages, ret; + int n_stages, ret; struct src_stage *stage1, *stage2; - idx_in = src_find_fs(src_in_fs, NUM_IN_FS, fs1); - idx_out = src_find_fs(src_out_fs, NUM_OUT_FS, fs2); - - if ((idx_in < 0) || (idx_out < 0)) { - ret = -EINVAL; - } else { - /* Get setup for 2 stage conversion */ - stage1 = src_table1[idx_out][idx_in]; - stage2 = src_table2[idx_out][idx_in]; - ret = init_stages(stage1, stage2, src, 2, delay_lines_start); - - /* Get number of stages used for optimize opportunity. 2nd - * stage lenth is one if conversion needs only one stage. - */ - n_stages = (src->stage2->filter_length == 1) ? 1 : 2; - - /* If filter length for first stage is zero this is a deleted - * mode from in/out matrix. Computing of such SRC mode needs - * to be prevented. - */ - if (src->stage2->filter_length == 0) - ret = -EINVAL; + if ((res->idx_in < 0) || (res->idx_out < 0)) { + src->blk_in = res->blk_in; + src->blk_out = res->blk_out; + return -EINVAL; } - if (ret < 0) { - /* Set blk_in, blk_out so that the muted fallback SRC keeps - * just source & sink in sync in pipeline without drift. - */ - f = gcd(fs1, fs2); - src->blk_in = fs1 / f; - src->blk_out = fs2 / f; + /* Get setup for 2 stage conversion */ + stage1 = src_table1[res->idx_out][res->idx_in]; + stage2 = src_table2[res->idx_out][res->idx_in]; + ret = init_stages(stage1, stage2, src, res, 2, delay_lines_start); + if (ret < 0) + return -EINVAL; + + /* Get number of stages used for optimize opportunity. 2nd + * stage lenth is one if conversion needs only one stage. + */ + n_stages = (src->stage2->filter_length == 1) ? 1 : 2; + /* If filter length for first stage is zero this is a deleted + * mode from in/out matrix. Computing of such SRC mode needs + * to be prevented. + */ + if (src->stage2->filter_length == 0) return -EINVAL; - } return n_stages; } diff --git a/src/audio/src_core.h b/src/audio/src_core.h index dae5e53..ae1223a 100644 --- a/src/audio/src_core.h +++ b/src/audio/src_core.h @@ -52,6 +52,13 @@ struct src_alloc { int scratch; int single_src; int total; + int blk_mult; + int blk_in; + int blk_out; + int stage1_times; + int stage2_times; + int idx_in; + int idx_out; }; struct src_stage { @@ -137,14 +144,15 @@ static inline int src_polyphase_get_blk_out(struct polyphase_src *src) void src_polyphase_reset(struct polyphase_src *src); int src_polyphase_init(struct polyphase_src *src, int fs1, int fs2, - int32_t *delay_lines_start); + struct src_alloc *res, int32_t *delay_lines_start); int src_polyphase(struct polyphase_src *src, int32_t x[], int32_t y[], int n_in); void src_polyphase_stage_cir(struct src_stage_prm *s); -int src_buffer_lengths(struct src_alloc *a, int fs_in, int fs_out, int nch); +int src_buffer_lengths(struct src_alloc *a, int fs_in, int fs_out, int nch, + int max_frames, int max_frames_is_for_source); int32_t src_input_rates(void); -- 2.11.0
1 0
0 0
[Sound-open-firmware] [PATCH] comp: mixer: report any mixer XRUNs to pipeline.
by Liam Girdwood 06 Sep '17

06 Sep '17
Report any mixer underruns or overruns for each source and sink to pipeline. Signed-off-by: Liam Girdwood <liam.r.girdwood(a)linux.intel.com> --- src/audio/mixer.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/audio/mixer.c b/src/audio/mixer.c index e82b5f0..932c3ad 100644 --- a/src/audio/mixer.c +++ b/src/audio/mixer.c @@ -203,7 +203,7 @@ static int mixer_copy(struct comp_dev *dev) struct mixer_data *md = comp_get_drvdata(dev); struct comp_buffer *sink, *sources[PLATFORM_MAX_STREAMS], *source; struct list_item *blist; - int32_t i = 0, num_mix_sources = 0; + int32_t i = 0, num_mix_sources = 0, xru = 0; tracev_mixer("cpy"); @@ -223,17 +223,19 @@ static int mixer_copy(struct comp_dev *dev) /* make sure no sources have underruns */ for (i = 0; i < num_mix_sources; i++) { if (sources[i]->avail < md->period_bytes) { - trace_mixer("xru"); - trace_value(source[i].source->comp.id); - return 0; + comp_underrun(dev, sources[i], sources[i]->avail, + md->period_bytes); + xru = 1; } } + /* underrun ? */ + if (xru) + return 0; /* make sure sink has no overuns */ sink = list_first_item(&dev->bsink_list, struct comp_buffer, source_list); if (sink->free < md->period_bytes) { - trace_mixer("xro"); - trace_value(sink[i].sink->comp.id); + comp_overrun(dev, sink, sink->free, md->period_bytes); return 0; } -- 2.11.0
1 7
0 0
  • ← Newer
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • Older →

HyperKitty Powered by HyperKitty version 1.3.8.