* [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes
@ 2025-02-20 16:28 srinivas.kandagatla
2025-02-20 16:28 ` [PATCH v2 1/5] ASoC: q6apm-dai: schedule all available frames to avoid dsp under-runs srinivas.kandagatla
` (5 more replies)
0 siblings, 6 replies; 13+ messages in thread
From: srinivas.kandagatla @ 2025-02-20 16:28 UTC (permalink / raw)
To: broonie
Cc: perex, tiwai, krzysztof.kozlowski, linux-sound, linux-arm-msm,
linux-kernel, dmitry.baryshkov, johan+linaro, Srinivas Kandagatla
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
On Qualcomm Audioreach setup, some of the audio artifacts are seen in
both recording and playback. These patches fix issues by
1. Adjusting the fragment size that dsp can service.
2. schedule available playback buffers in time for dsp to not hit under runs
3. remove some of the manual calculations done to get hardware pointer.
With these patches, am able to see Audio quality improvements.
Any testing would be appreciated.
thanks,
Srini
Changes since v1:
- added new patches to fix the fragment size, pointer
calculations
- updated to schedule only available buffers.
Srinivas Kandagatla (4):
ASoC: q6apm-dai: schedule all available frames to avoid dsp under-runs
ASoC: q6apm: add q6apm_get_hw_pointer helper
ASoC: q6apm-dai: make use of q6apm_get_hw_pointer
ASoC: qdsp6: q6apm-dai: set correct period size
ASoC: q6apm-dai: remove redundant hw_constraints setup
sound/soc/qcom/qdsp6/q6apm-dai.c | 94 +++++++++++++-------------------
sound/soc/qcom/qdsp6/q6apm.c | 18 +++++-
sound/soc/qcom/qdsp6/q6apm.h | 3 +
3 files changed, 57 insertions(+), 58 deletions(-)
--
2.39.5
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/5] ASoC: q6apm-dai: schedule all available frames to avoid dsp under-runs
2025-02-20 16:28 [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes srinivas.kandagatla
@ 2025-02-20 16:28 ` srinivas.kandagatla
2025-02-20 16:28 ` [PATCH v2 2/5] ASoC: q6apm: add q6apm_get_hw_pointer helper srinivas.kandagatla
` (4 subsequent siblings)
5 siblings, 0 replies; 13+ messages in thread
From: srinivas.kandagatla @ 2025-02-20 16:28 UTC (permalink / raw)
To: broonie
Cc: perex, tiwai, krzysztof.kozlowski, linux-sound, linux-arm-msm,
linux-kernel, dmitry.baryshkov, johan+linaro, Srinivas Kandagatla
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
With the existing code, we are only setting up one period at a time, in a
ping-pong buffer style. This triggers lot of underruns in the dsp
leading to jitter noise during audio playback.
Fix this by scheduling all available periods, this will ensure that the dsp
has enough buffer feed and ultimatley fixing the underruns and audio
distortion.
Fixes: 9b4fe0f1cd79 ("ASoC: qdsp6: audioreach: add q6apm-dai support")
Reported-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
sound/soc/qcom/qdsp6/q6apm-dai.c | 33 +++++++++++++++++++++++++++-----
1 file changed, 28 insertions(+), 5 deletions(-)
diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-dai.c
index c9404b5934c7..eba51e88a297 100644
--- a/sound/soc/qcom/qdsp6/q6apm-dai.c
+++ b/sound/soc/qcom/qdsp6/q6apm-dai.c
@@ -70,6 +70,7 @@ struct q6apm_dai_rtd {
unsigned int bytes_received;
unsigned int copied_total;
uint16_t bits_per_sample;
+ unsigned int pb_tail;
bool next_track;
enum stream_state state;
struct q6apm_graph *graph;
@@ -134,8 +135,6 @@ static void event_handler(uint32_t opcode, uint32_t token, void *payload, void *
prtd->pos += prtd->pcm_count;
spin_unlock_irqrestore(&prtd->lock, flags);
snd_pcm_period_elapsed(substream);
- if (prtd->state == Q6APM_STREAM_RUNNING)
- q6apm_write_async(prtd->graph, prtd->pcm_count, 0, 0, 0);
break;
case APM_CLIENT_EVENT_DATA_READ_DONE:
@@ -294,6 +293,31 @@ static int q6apm_dai_prepare(struct snd_soc_component *component,
return 0;
}
+static int q6apm_dai_ack(struct snd_soc_component *component,
+ struct snd_pcm_substream *substream)
+{
+ struct snd_pcm_runtime *runtime = substream->runtime;
+ struct q6apm_dai_rtd *prtd = runtime->private_data;
+ unsigned int tail;
+ int i, ret = 0, avail_periods;
+
+ tail = runtime->control->appl_ptr/runtime->period_size;
+
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+ avail_periods = tail - prtd->pb_tail;
+ for (i = 0; i < avail_periods; i++) {
+ ret = q6apm_write_async(prtd->graph, prtd->pcm_count, 0, 0, 0);
+ if (ret < 0) {
+ dev_err(component->dev, "Error queuing playback buffer %d\n", ret);
+ return ret;
+ }
+ prtd->pb_tail++;
+ }
+ }
+
+ return ret;
+}
+
static int q6apm_dai_trigger(struct snd_soc_component *component,
struct snd_pcm_substream *substream, int cmd)
{
@@ -305,13 +329,11 @@ static int q6apm_dai_trigger(struct snd_soc_component *component,
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
- /* start writing buffers for playback only as we already queued capture buffers */
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
- ret = q6apm_write_async(prtd->graph, prtd->pcm_count, 0, 0, 0);
break;
case SNDRV_PCM_TRIGGER_STOP:
/* TODO support be handled via SoftPause Module */
prtd->state = Q6APM_STREAM_STOPPED;
+ prtd->pb_tail = 0;
break;
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
@@ -836,6 +858,7 @@ static const struct snd_soc_component_driver q6apm_fe_dai_component = {
.hw_params = q6apm_dai_hw_params,
.pointer = q6apm_dai_pointer,
.trigger = q6apm_dai_trigger,
+ .ack = q6apm_dai_ack,
.compress_ops = &q6apm_dai_compress_ops,
.use_dai_pcm_id = true,
};
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 2/5] ASoC: q6apm: add q6apm_get_hw_pointer helper
2025-02-20 16:28 [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes srinivas.kandagatla
2025-02-20 16:28 ` [PATCH v2 1/5] ASoC: q6apm-dai: schedule all available frames to avoid dsp under-runs srinivas.kandagatla
@ 2025-02-20 16:28 ` srinivas.kandagatla
2025-02-20 16:28 ` [PATCH v2 3/5] ASoC: q6apm-dai: make use of q6apm_get_hw_pointer srinivas.kandagatla
` (3 subsequent siblings)
5 siblings, 0 replies; 13+ messages in thread
From: srinivas.kandagatla @ 2025-02-20 16:28 UTC (permalink / raw)
To: broonie
Cc: perex, tiwai, krzysztof.kozlowski, linux-sound, linux-arm-msm,
linux-kernel, dmitry.baryshkov, johan+linaro, Srinivas Kandagatla
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Implement an helper function in q6apm to be able to read the current
hardware pointer for both read and write buffers.
This should help q6apm-dai to get the hardware pointer consistently
without it doing manual calculation, which could go wrong in some race
conditions.
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
sound/soc/qcom/qdsp6/q6apm.c | 18 +++++++++++++++++-
sound/soc/qcom/qdsp6/q6apm.h | 3 +++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/sound/soc/qcom/qdsp6/q6apm.c b/sound/soc/qcom/qdsp6/q6apm.c
index 2a2a5bd98110..ca57413cb784 100644
--- a/sound/soc/qcom/qdsp6/q6apm.c
+++ b/sound/soc/qcom/qdsp6/q6apm.c
@@ -494,6 +494,19 @@ int q6apm_read(struct q6apm_graph *graph)
}
EXPORT_SYMBOL_GPL(q6apm_read);
+int q6apm_get_hw_pointer(struct q6apm_graph *graph, int dir)
+{
+ struct audioreach_graph_data *data;
+
+ if (dir == SNDRV_PCM_STREAM_PLAYBACK)
+ data = &graph->rx_data;
+ else
+ data = &graph->tx_data;
+
+ return (int)atomic_read(&data->hw_ptr);
+}
+EXPORT_SYMBOL_GPL(q6apm_get_hw_pointer);
+
static int graph_callback(struct gpr_resp_pkt *data, void *priv, int op)
{
struct data_cmd_rsp_rd_sh_mem_ep_data_buffer_done_v2 *rd_done;
@@ -520,7 +533,8 @@ static int graph_callback(struct gpr_resp_pkt *data, void *priv, int op)
done = data->payload;
phys = graph->rx_data.buf[token].phys;
mutex_unlock(&graph->lock);
-
+ /* token numbering starts at 0 */
+ atomic_set(&graph->rx_data.hw_ptr, token + 1);
if (lower_32_bits(phys) == done->buf_addr_lsw &&
upper_32_bits(phys) == done->buf_addr_msw) {
graph->result.opcode = hdr->opcode;
@@ -553,6 +567,8 @@ static int graph_callback(struct gpr_resp_pkt *data, void *priv, int op)
rd_done = data->payload;
phys = graph->tx_data.buf[hdr->token].phys;
mutex_unlock(&graph->lock);
+ /* token numbering starts at 0 */
+ atomic_set(&graph->tx_data.hw_ptr, hdr->token + 1);
if (upper_32_bits(phys) == rd_done->buf_addr_msw &&
lower_32_bits(phys) == rd_done->buf_addr_lsw) {
diff --git a/sound/soc/qcom/qdsp6/q6apm.h b/sound/soc/qcom/qdsp6/q6apm.h
index c248c8d2b1ab..7ce08b401e31 100644
--- a/sound/soc/qcom/qdsp6/q6apm.h
+++ b/sound/soc/qcom/qdsp6/q6apm.h
@@ -2,6 +2,7 @@
#ifndef __Q6APM_H__
#define __Q6APM_H__
#include <linux/types.h>
+#include <linux/atomic.h>
#include <linux/slab.h>
#include <linux/wait.h>
#include <linux/kernel.h>
@@ -77,6 +78,7 @@ struct audioreach_graph_data {
uint32_t num_periods;
uint32_t dsp_buf;
uint32_t mem_map_handle;
+ atomic_t hw_ptr;
};
struct audioreach_graph {
@@ -150,4 +152,5 @@ int q6apm_enable_compress_module(struct device *dev, struct q6apm_graph *graph,
int q6apm_remove_initial_silence(struct device *dev, struct q6apm_graph *graph, uint32_t samples);
int q6apm_remove_trailing_silence(struct device *dev, struct q6apm_graph *graph, uint32_t samples);
int q6apm_set_real_module_id(struct device *dev, struct q6apm_graph *graph, uint32_t codec_id);
+int q6apm_get_hw_pointer(struct q6apm_graph *graph, int dir);
#endif /* __APM_GRAPH_ */
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 3/5] ASoC: q6apm-dai: make use of q6apm_get_hw_pointer
2025-02-20 16:28 [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes srinivas.kandagatla
2025-02-20 16:28 ` [PATCH v2 1/5] ASoC: q6apm-dai: schedule all available frames to avoid dsp under-runs srinivas.kandagatla
2025-02-20 16:28 ` [PATCH v2 2/5] ASoC: q6apm: add q6apm_get_hw_pointer helper srinivas.kandagatla
@ 2025-02-20 16:28 ` srinivas.kandagatla
2025-02-20 16:58 ` Dmitry Baryshkov
2025-02-20 16:28 ` [PATCH v2 4/5] ASoC: qdsp6: q6apm-dai: set correct period size srinivas.kandagatla
` (2 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: srinivas.kandagatla @ 2025-02-20 16:28 UTC (permalink / raw)
To: broonie
Cc: perex, tiwai, krzysztof.kozlowski, linux-sound, linux-arm-msm,
linux-kernel, dmitry.baryshkov, johan+linaro, Srinivas Kandagatla
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
With the existing code, the buffer position is only reset in pointer
callback, which leaves the possiblity of it going over the size of
buffer size and reporting incorrect position to userspace.
Without this patch, its possible to see errors like:
snd-x1e80100 sound: invalid position: pcmC0D0p:0, pos = 12288, buffer size = 12288, period size = 1536
snd-x1e80100 sound: invalid position: pcmC0D0p:0, pos = 12288, buffer size = 12288, period size = 1536
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
sound/soc/qcom/qdsp6/q6apm-dai.c | 23 ++++-------------------
1 file changed, 4 insertions(+), 19 deletions(-)
diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-dai.c
index eba51e88a297..7466fe0c661a 100644
--- a/sound/soc/qcom/qdsp6/q6apm-dai.c
+++ b/sound/soc/qcom/qdsp6/q6apm-dai.c
@@ -64,7 +64,6 @@ struct q6apm_dai_rtd {
phys_addr_t phys;
unsigned int pcm_size;
unsigned int pcm_count;
- unsigned int pos; /* Buffer position */
unsigned int periods;
unsigned int bytes_sent;
unsigned int bytes_received;
@@ -124,23 +123,16 @@ static void event_handler(uint32_t opcode, uint32_t token, void *payload, void *
{
struct q6apm_dai_rtd *prtd = priv;
struct snd_pcm_substream *substream = prtd->substream;
- unsigned long flags;
switch (opcode) {
case APM_CLIENT_EVENT_CMD_EOS_DONE:
prtd->state = Q6APM_STREAM_STOPPED;
break;
case APM_CLIENT_EVENT_DATA_WRITE_DONE:
- spin_lock_irqsave(&prtd->lock, flags);
- prtd->pos += prtd->pcm_count;
- spin_unlock_irqrestore(&prtd->lock, flags);
snd_pcm_period_elapsed(substream);
break;
case APM_CLIENT_EVENT_DATA_READ_DONE:
- spin_lock_irqsave(&prtd->lock, flags);
- prtd->pos += prtd->pcm_count;
- spin_unlock_irqrestore(&prtd->lock, flags);
snd_pcm_period_elapsed(substream);
if (prtd->state == Q6APM_STREAM_RUNNING)
q6apm_read(prtd->graph);
@@ -247,7 +239,6 @@ static int q6apm_dai_prepare(struct snd_soc_component *component,
}
prtd->pcm_count = snd_pcm_lib_period_bytes(substream);
- prtd->pos = 0;
/* rate and channels are sent to audio driver */
ret = q6apm_graph_media_format_shmem(prtd->graph, &cfg);
if (ret < 0) {
@@ -450,16 +441,12 @@ static snd_pcm_uframes_t q6apm_dai_pointer(struct snd_soc_component *component,
struct snd_pcm_runtime *runtime = substream->runtime;
struct q6apm_dai_rtd *prtd = runtime->private_data;
snd_pcm_uframes_t ptr;
- unsigned long flags;
- spin_lock_irqsave(&prtd->lock, flags);
- if (prtd->pos == prtd->pcm_size)
- prtd->pos = 0;
-
- ptr = bytes_to_frames(runtime, prtd->pos);
- spin_unlock_irqrestore(&prtd->lock, flags);
+ ptr = q6apm_get_hw_pointer(prtd->graph, substream->stream) * runtime->period_size;
+ if (ptr)
+ return ptr - 1;
- return ptr;
+ return 0;
}
static int q6apm_dai_hw_params(struct snd_soc_component *component,
@@ -674,8 +661,6 @@ static int q6apm_dai_compr_set_params(struct snd_soc_component *component,
prtd->pcm_size = runtime->fragments * runtime->fragment_size;
prtd->bits_per_sample = 16;
- prtd->pos = 0;
-
if (prtd->next_track != true) {
memcpy(&prtd->codec, codec, sizeof(*codec));
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 4/5] ASoC: qdsp6: q6apm-dai: set correct period size
2025-02-20 16:28 [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes srinivas.kandagatla
` (2 preceding siblings ...)
2025-02-20 16:28 ` [PATCH v2 3/5] ASoC: q6apm-dai: make use of q6apm_get_hw_pointer srinivas.kandagatla
@ 2025-02-20 16:28 ` srinivas.kandagatla
2025-02-20 16:57 ` Dmitry Baryshkov
2025-02-20 16:28 ` [PATCH v2 5/5] ASoC: q6apm-dai: remove redundant hw_constraints setup srinivas.kandagatla
2025-02-20 17:38 ` [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes Johan Hovold
5 siblings, 1 reply; 13+ messages in thread
From: srinivas.kandagatla @ 2025-02-20 16:28 UTC (permalink / raw)
To: broonie
Cc: perex, tiwai, krzysztof.kozlowski, linux-sound, linux-arm-msm,
linux-kernel, dmitry.baryshkov, johan+linaro, Srinivas Kandagatla
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
For some reason we ended up with a period size which is less than 1ms,
DSP does not support such a small fragment size. Adjust this to be in
the range of 16ms to 32ms.
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
sound/soc/qcom/qdsp6/q6apm-dai.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-dai.c
index 7466fe0c661a..049b91fd7a23 100644
--- a/sound/soc/qcom/qdsp6/q6apm-dai.c
+++ b/sound/soc/qcom/qdsp6/q6apm-dai.c
@@ -21,11 +21,11 @@
#define PLAYBACK_MIN_NUM_PERIODS 2
#define PLAYBACK_MAX_NUM_PERIODS 8
#define PLAYBACK_MAX_PERIOD_SIZE 65536
-#define PLAYBACK_MIN_PERIOD_SIZE 128
-#define CAPTURE_MIN_NUM_PERIODS 2
-#define CAPTURE_MAX_NUM_PERIODS 8
-#define CAPTURE_MAX_PERIOD_SIZE 4096
-#define CAPTURE_MIN_PERIOD_SIZE 320
+#define PLAYBACK_MIN_PERIOD_SIZE 6144
+#define CAPTURE_MIN_NUM_PERIODS PLAYBACK_MIN_NUM_PERIODS
+#define CAPTURE_MAX_NUM_PERIODS PLAYBACK_MAX_NUM_PERIODS
+#define CAPTURE_MAX_PERIOD_SIZE PLAYBACK_MAX_PERIOD_SIZE
+#define CAPTURE_MIN_PERIOD_SIZE PLAYBACK_MIN_PERIOD_SIZE
#define BUFFER_BYTES_MAX (PLAYBACK_MAX_NUM_PERIODS * PLAYBACK_MAX_PERIOD_SIZE)
#define BUFFER_BYTES_MIN (PLAYBACK_MIN_NUM_PERIODS * PLAYBACK_MIN_PERIOD_SIZE)
#define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024)
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 5/5] ASoC: q6apm-dai: remove redundant hw_constraints setup
2025-02-20 16:28 [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes srinivas.kandagatla
` (3 preceding siblings ...)
2025-02-20 16:28 ` [PATCH v2 4/5] ASoC: qdsp6: q6apm-dai: set correct period size srinivas.kandagatla
@ 2025-02-20 16:28 ` srinivas.kandagatla
2025-02-20 17:38 ` [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes Johan Hovold
5 siblings, 0 replies; 13+ messages in thread
From: srinivas.kandagatla @ 2025-02-20 16:28 UTC (permalink / raw)
To: broonie
Cc: perex, tiwai, krzysztof.kozlowski, linux-sound, linux-arm-msm,
linux-kernel, dmitry.baryshkov, johan+linaro, Srinivas Kandagatla
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
pcm core already does setup the hw_constraints from struct snd_pcm_hardware
values, setting this in q6apm-dai is redundant.
Remove the code that sets this.
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
sound/soc/qcom/qdsp6/q6apm-dai.c | 28 ----------------------------
1 file changed, 28 deletions(-)
diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-dai.c
index 049b91fd7a23..b644ce7d394b 100644
--- a/sound/soc/qcom/qdsp6/q6apm-dai.c
+++ b/sound/soc/qcom/qdsp6/q6apm-dai.c
@@ -374,34 +374,6 @@ static int q6apm_dai_open(struct snd_soc_component *component,
else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
runtime->hw = q6apm_dai_hardware_capture;
- /* Ensure that buffer size is a multiple of period size */
- ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
- if (ret < 0) {
- dev_err(dev, "snd_pcm_hw_constraint_integer failed\n");
- goto err;
- }
-
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
- ret = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
- BUFFER_BYTES_MIN, BUFFER_BYTES_MAX);
- if (ret < 0) {
- dev_err(dev, "constraint for buffer bytes min max ret = %d\n", ret);
- goto err;
- }
- }
-
- ret = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 32);
- if (ret < 0) {
- dev_err(dev, "constraint for period bytes step ret = %d\n", ret);
- goto err;
- }
-
- ret = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 32);
- if (ret < 0) {
- dev_err(dev, "constraint for buffer bytes step ret = %d\n", ret);
- goto err;
- }
-
runtime->private_data = prtd;
runtime->dma_bytes = BUFFER_BYTES_MAX;
if (pdata->sid < 0)
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 4/5] ASoC: qdsp6: q6apm-dai: set correct period size
2025-02-20 16:28 ` [PATCH v2 4/5] ASoC: qdsp6: q6apm-dai: set correct period size srinivas.kandagatla
@ 2025-02-20 16:57 ` Dmitry Baryshkov
0 siblings, 0 replies; 13+ messages in thread
From: Dmitry Baryshkov @ 2025-02-20 16:57 UTC (permalink / raw)
To: srinivas.kandagatla
Cc: broonie, perex, tiwai, krzysztof.kozlowski, linux-sound,
linux-arm-msm, linux-kernel, johan+linaro
On Thu, 20 Feb 2025 at 18:29, <srinivas.kandagatla@linaro.org> wrote:
>
> From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
>
> For some reason we ended up with a period size which is less than 1ms,
> DSP does not support such a small fragment size. Adjust this to be in
> the range of 16ms to 32ms.
>
> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Fixes: ?
> ---
> sound/soc/qcom/qdsp6/q6apm-dai.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-dai.c
> index 7466fe0c661a..049b91fd7a23 100644
> --- a/sound/soc/qcom/qdsp6/q6apm-dai.c
> +++ b/sound/soc/qcom/qdsp6/q6apm-dai.c
> @@ -21,11 +21,11 @@
> #define PLAYBACK_MIN_NUM_PERIODS 2
> #define PLAYBACK_MAX_NUM_PERIODS 8
> #define PLAYBACK_MAX_PERIOD_SIZE 65536
> -#define PLAYBACK_MIN_PERIOD_SIZE 128
> -#define CAPTURE_MIN_NUM_PERIODS 2
> -#define CAPTURE_MAX_NUM_PERIODS 8
> -#define CAPTURE_MAX_PERIOD_SIZE 4096
> -#define CAPTURE_MIN_PERIOD_SIZE 320
> +#define PLAYBACK_MIN_PERIOD_SIZE 6144
> +#define CAPTURE_MIN_NUM_PERIODS PLAYBACK_MIN_NUM_PERIODS
> +#define CAPTURE_MAX_NUM_PERIODS PLAYBACK_MAX_NUM_PERIODS
> +#define CAPTURE_MAX_PERIOD_SIZE PLAYBACK_MAX_PERIOD_SIZE
> +#define CAPTURE_MIN_PERIOD_SIZE PLAYBACK_MIN_PERIOD_SIZE
> #define BUFFER_BYTES_MAX (PLAYBACK_MAX_NUM_PERIODS * PLAYBACK_MAX_PERIOD_SIZE)
> #define BUFFER_BYTES_MIN (PLAYBACK_MIN_NUM_PERIODS * PLAYBACK_MIN_PERIOD_SIZE)
> #define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024)
> --
> 2.39.5
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/5] ASoC: q6apm-dai: make use of q6apm_get_hw_pointer
2025-02-20 16:28 ` [PATCH v2 3/5] ASoC: q6apm-dai: make use of q6apm_get_hw_pointer srinivas.kandagatla
@ 2025-02-20 16:58 ` Dmitry Baryshkov
0 siblings, 0 replies; 13+ messages in thread
From: Dmitry Baryshkov @ 2025-02-20 16:58 UTC (permalink / raw)
To: srinivas.kandagatla
Cc: broonie, perex, tiwai, krzysztof.kozlowski, linux-sound,
linux-arm-msm, linux-kernel, johan+linaro
On Thu, 20 Feb 2025 at 18:29, <srinivas.kandagatla@linaro.org> wrote:
>
> From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
>
> With the existing code, the buffer position is only reset in pointer
> callback, which leaves the possiblity of it going over the size of
> buffer size and reporting incorrect position to userspace.
>
> Without this patch, its possible to see errors like:
> snd-x1e80100 sound: invalid position: pcmC0D0p:0, pos = 12288, buffer size = 12288, period size = 1536
> snd-x1e80100 sound: invalid position: pcmC0D0p:0, pos = 12288, buffer size = 12288, period size = 1536
>
> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Fixes: ?
> ---
> sound/soc/qcom/qdsp6/q6apm-dai.c | 23 ++++-------------------
> 1 file changed, 4 insertions(+), 19 deletions(-)
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes
2025-02-20 16:28 [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes srinivas.kandagatla
` (4 preceding siblings ...)
2025-02-20 16:28 ` [PATCH v2 5/5] ASoC: q6apm-dai: remove redundant hw_constraints setup srinivas.kandagatla
@ 2025-02-20 17:38 ` Johan Hovold
2025-02-20 17:44 ` Srinivas Kandagatla
2025-02-21 8:29 ` Johan Hovold
5 siblings, 2 replies; 13+ messages in thread
From: Johan Hovold @ 2025-02-20 17:38 UTC (permalink / raw)
To: srinivas.kandagatla
Cc: broonie, perex, tiwai, krzysztof.kozlowski, linux-sound,
linux-arm-msm, linux-kernel, dmitry.baryshkov, johan+linaro
Hi Srini,
On Thu, Feb 20, 2025 at 04:28:42PM +0000, Srinivas Kandagatla wrote:
> On Qualcomm Audioreach setup, some of the audio artifacts are seen in
> both recording and playback. These patches fix issues by
> 1. Adjusting the fragment size that dsp can service.
> 2. schedule available playback buffers in time for dsp to not hit under runs
> 3. remove some of the manual calculations done to get hardware pointer.
>
> With these patches, am able to see Audio quality improvements.
>
> Any testing would be appreciated.
With this series, the choppy (robotic) capture when using pipewire
appears to be fixed (pulseaudio worked before).
Playback is still choppy (heavily distorted), though, and now it also
appears to be too slow.
I tested using pw-record and pw-play (and mpv) on the T14s (6.14-rc3).
Johan
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes
2025-02-20 17:38 ` [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes Johan Hovold
@ 2025-02-20 17:44 ` Srinivas Kandagatla
2025-02-21 8:29 ` Johan Hovold
1 sibling, 0 replies; 13+ messages in thread
From: Srinivas Kandagatla @ 2025-02-20 17:44 UTC (permalink / raw)
To: Johan Hovold
Cc: broonie, perex, tiwai, krzysztof.kozlowski, linux-sound,
linux-arm-msm, linux-kernel, dmitry.baryshkov, johan+linaro
Hi Johan,
thanks for testing.
On 20/02/2025 17:38, Johan Hovold wrote:
> Hi Srini,
>
> On Thu, Feb 20, 2025 at 04:28:42PM +0000, Srinivas Kandagatla wrote:
>
>> On Qualcomm Audioreach setup, some of the audio artifacts are seen in
>> both recording and playback. These patches fix issues by
>> 1. Adjusting the fragment size that dsp can service.
>> 2. schedule available playback buffers in time for dsp to not hit under runs
>> 3. remove some of the manual calculations done to get hardware pointer.
>>
>> With these patches, am able to see Audio quality improvements.
>>
>> Any testing would be appreciated.
>
> With this series, the choppy (robotic) capture when using pipewire
> appears to be fixed (pulseaudio worked before).
>
> Playback is still choppy (heavily distorted), though, and now it also
> appears to be too slow.
Interesting, Am running 6.14-rc2 aswell on t14
Both pw-play and youtube, it seems to be fine.
Let me check my pipewire config if I had disabled the tsched.
--srini
>
> I tested using pw-record and pw-play (and mpv) on the T14s (6.14-rc3).
>
> Johan
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes
2025-02-20 17:38 ` [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes Johan Hovold
2025-02-20 17:44 ` Srinivas Kandagatla
@ 2025-02-21 8:29 ` Johan Hovold
2025-02-21 8:59 ` Johan Hovold
1 sibling, 1 reply; 13+ messages in thread
From: Johan Hovold @ 2025-02-21 8:29 UTC (permalink / raw)
To: srinivas.kandagatla
Cc: broonie, perex, tiwai, krzysztof.kozlowski, linux-sound,
linux-arm-msm, linux-kernel, dmitry.baryshkov, johan+linaro
On Thu, Feb 20, 2025 at 06:38:11PM +0100, Johan Hovold wrote:
> On Thu, Feb 20, 2025 at 04:28:42PM +0000, Srinivas Kandagatla wrote:
> > On Qualcomm Audioreach setup, some of the audio artifacts are seen in
> > both recording and playback. These patches fix issues by
> > 1. Adjusting the fragment size that dsp can service.
> > 2. schedule available playback buffers in time for dsp to not hit under runs
> > 3. remove some of the manual calculations done to get hardware pointer.
> >
> > With these patches, am able to see Audio quality improvements.
> >
> > Any testing would be appreciated.
>
> With this series, the choppy (robotic) capture when using pipewire
> appears to be fixed (pulseaudio worked before).
>
> Playback is still choppy (heavily distorted), though, and now it also
> appears to be too slow.
>
> I tested using pw-record and pw-play (and mpv) on the T14s (6.14-rc3).
Retested this morning and realised that playback is only choppy (and too
slow) while I have pavucontrol open. That would be nice to fix if
possible, but this is still a great improvement since pipewire was not
usable at all before these changes.
Tested-by: Johan Hovold <johan+linaro@kernel.org>
Johan
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes
2025-02-21 8:29 ` Johan Hovold
@ 2025-02-21 8:59 ` Johan Hovold
2025-02-21 10:15 ` Srinivas Kandagatla
0 siblings, 1 reply; 13+ messages in thread
From: Johan Hovold @ 2025-02-21 8:59 UTC (permalink / raw)
To: srinivas.kandagatla
Cc: broonie, perex, tiwai, krzysztof.kozlowski, linux-sound,
linux-arm-msm, linux-kernel, dmitry.baryshkov, johan+linaro
On Fri, Feb 21, 2025 at 09:29:39AM +0100, Johan Hovold wrote:
> On Thu, Feb 20, 2025 at 06:38:11PM +0100, Johan Hovold wrote:
> > On Thu, Feb 20, 2025 at 04:28:42PM +0000, Srinivas Kandagatla wrote:
>
> > > On Qualcomm Audioreach setup, some of the audio artifacts are seen in
> > > both recording and playback. These patches fix issues by
> > > 1. Adjusting the fragment size that dsp can service.
> > > 2. schedule available playback buffers in time for dsp to not hit under runs
> > > 3. remove some of the manual calculations done to get hardware pointer.
> > >
> > > With these patches, am able to see Audio quality improvements.
> > >
> > > Any testing would be appreciated.
> >
> > With this series, the choppy (robotic) capture when using pipewire
> > appears to be fixed (pulseaudio worked before).
> >
> > Playback is still choppy (heavily distorted), though, and now it also
> > appears to be too slow.
> >
> > I tested using pw-record and pw-play (and mpv) on the T14s (6.14-rc3).
>
> Retested this morning and realised that playback is only choppy (and too
> slow) while I have pavucontrol open. That would be nice to fix if
> possible, but this is still a great improvement since pipewire was not
> usable at all before these changes.
>
> Tested-by: Johan Hovold <johan+linaro@kernel.org>
Hmm... Scratch that.
This series apparently breaks pulseaudio instead.
Too fast playback on the T14s with mpv, and after I stopped it I wasn't
able too play any audio anymore. And systemd complains about a stop job
running for long when rebooting. Similar issues on the X13s.
Johan
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes
2025-02-21 8:59 ` Johan Hovold
@ 2025-02-21 10:15 ` Srinivas Kandagatla
0 siblings, 0 replies; 13+ messages in thread
From: Srinivas Kandagatla @ 2025-02-21 10:15 UTC (permalink / raw)
To: Johan Hovold
Cc: broonie, perex, tiwai, krzysztof.kozlowski, linux-sound,
linux-arm-msm, linux-kernel, dmitry.baryshkov, johan+linaro
On 21/02/2025 08:59, Johan Hovold wrote:
> On Fri, Feb 21, 2025 at 09:29:39AM +0100, Johan Hovold wrote:
>> On Thu, Feb 20, 2025 at 06:38:11PM +0100, Johan Hovold wrote:
>>> On Thu, Feb 20, 2025 at 04:28:42PM +0000, Srinivas Kandagatla wrote:
>>
>>>> On Qualcomm Audioreach setup, some of the audio artifacts are seen in
>>>> both recording and playback. These patches fix issues by
>>>> 1. Adjusting the fragment size that dsp can service.
>>>> 2. schedule available playback buffers in time for dsp to not hit under runs
>>>> 3. remove some of the manual calculations done to get hardware pointer.
>>>>
>>>> With these patches, am able to see Audio quality improvements.
>>>>
>>>> Any testing would be appreciated.
>>>
>>> With this series, the choppy (robotic) capture when using pipewire
>>> appears to be fixed (pulseaudio worked before).
>>>
>>> Playback is still choppy (heavily distorted), though, and now it also
>>> appears to be too slow.
>>>
>>> I tested using pw-record and pw-play (and mpv) on the T14s (6.14-rc3).
>>
>> Retested this morning and realised that playback is only choppy (and too
>> slow) while I have pavucontrol open. That would be nice to fix if
>> possible, but this is still a great improvement since pipewire was not
>> usable at all before these changes.
>>
>> Tested-by: Johan Hovold <johan+linaro@kernel.org>
>
> Hmm... Scratch that.
>
> This series apparently breaks pulseaudio instead.
>
Thanks for trying out pulseaudio, I will try to reproduce this with my t14.
--srini
> Too fast playback on the T14s with mpv, and after I stopped it I wasn't
> able too play any audio anymore. And systemd complains about a stop job
> running for long when rebooting. Similar issues on the X13s.
>
> Johan
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-02-21 10:15 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-20 16:28 [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes srinivas.kandagatla
2025-02-20 16:28 ` [PATCH v2 1/5] ASoC: q6apm-dai: schedule all available frames to avoid dsp under-runs srinivas.kandagatla
2025-02-20 16:28 ` [PATCH v2 2/5] ASoC: q6apm: add q6apm_get_hw_pointer helper srinivas.kandagatla
2025-02-20 16:28 ` [PATCH v2 3/5] ASoC: q6apm-dai: make use of q6apm_get_hw_pointer srinivas.kandagatla
2025-02-20 16:58 ` Dmitry Baryshkov
2025-02-20 16:28 ` [PATCH v2 4/5] ASoC: qdsp6: q6apm-dai: set correct period size srinivas.kandagatla
2025-02-20 16:57 ` Dmitry Baryshkov
2025-02-20 16:28 ` [PATCH v2 5/5] ASoC: q6apm-dai: remove redundant hw_constraints setup srinivas.kandagatla
2025-02-20 17:38 ` [PATCH v2 0/5] ASoC: q6apm: fix under runs and fragment sizes Johan Hovold
2025-02-20 17:44 ` Srinivas Kandagatla
2025-02-21 8:29 ` Johan Hovold
2025-02-21 8:59 ` Johan Hovold
2025-02-21 10:15 ` Srinivas Kandagatla
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox