Skip to content

Commit 1ec9fc1

Browse files
lyakhlgirdwood
authored andcommitted
src: fix buffer acquisition
Instead of acquiring and releasing buffers locally multiple times, do that once for .params(), .copy() and .prepare() methods. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent 56ac46a commit 1ec9fc1

File tree

1 file changed

+75
-61
lines changed

1 file changed

+75
-61
lines changed

src/audio/src/src.c

Lines changed: 75 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ struct comp_data {
106106
int sink_frames;
107107
int sample_container_bytes;
108108
void (*src_func)(struct comp_dev *dev,
109-
const struct audio_stream *source,
110-
struct audio_stream *sink,
109+
const struct audio_stream __sparse_cache *source,
110+
struct audio_stream __sparse_cache *sink,
111111
int *consumed,
112112
int *produced);
113113
void (*polyphase_func)(struct src_stage_prm *s);
@@ -335,16 +335,16 @@ int src_polyphase_init(struct polyphase_src *src, struct src_param *p,
335335

336336
/* Fallback function */
337337
static void src_fallback(struct comp_dev *dev,
338-
const struct audio_stream *source,
339-
struct audio_stream *sink, int *n_read, int *n_written)
338+
const struct audio_stream __sparse_cache *source,
339+
struct audio_stream __sparse_cache *sink, int *n_read, int *n_written)
340340
{
341341
*n_read = 0;
342342
*n_written = 0;
343343
}
344344

345345
/* Normal 2 stage SRC */
346-
static void src_2s(struct comp_dev *dev, const struct audio_stream *source,
347-
struct audio_stream *sink, int *n_read, int *n_written)
346+
static void src_2s(struct comp_dev *dev, const struct audio_stream __sparse_cache *source,
347+
struct audio_stream __sparse_cache *sink, int *n_read, int *n_written)
348348
{
349349
struct src_stage_prm s1;
350350
struct src_stage_prm s2;
@@ -435,8 +435,8 @@ static void src_2s(struct comp_dev *dev, const struct audio_stream *source,
435435
}
436436

437437
/* 1 stage SRC for simple conversions */
438-
static void src_1s(struct comp_dev *dev, const struct audio_stream *source,
439-
struct audio_stream *sink, int *n_read, int *n_written)
438+
static void src_1s(struct comp_dev *dev, const struct audio_stream __sparse_cache *source,
439+
struct audio_stream __sparse_cache *sink, int *n_read, int *n_written)
440440
{
441441
struct src_stage_prm s1;
442442
struct comp_data *cd = comp_get_drvdata(dev);
@@ -461,8 +461,8 @@ static void src_1s(struct comp_dev *dev, const struct audio_stream *source,
461461

462462
/* A fast copy function for same in and out rate */
463463
static void src_copy_sxx(struct comp_dev *dev,
464-
const struct audio_stream *source,
465-
struct audio_stream *sink,
464+
const struct audio_stream __sparse_cache *source,
465+
struct audio_stream __sparse_cache *sink,
466466
int *n_read, int *n_written)
467467
{
468468
struct comp_data *cd = comp_get_drvdata(dev);
@@ -529,7 +529,7 @@ static void src_set_params(struct comp_dev *dev, struct sof_ipc_stream_params *p
529529
sinkb->stream.rate = cd->ipc_config.sink_rate;
530530
}
531531

532-
static void src_set_sink_params(struct comp_dev *dev, struct comp_buffer *sinkb)
532+
static void src_set_sink_params(struct comp_dev *dev, struct comp_buffer __sparse_cache *sinkb)
533533
{
534534
struct comp_data *cd = comp_get_drvdata(dev);
535535

@@ -568,7 +568,7 @@ static int src_stream_pcm_source_rate_check(struct ipc_config_src cfg,
568568

569569
static void src_set_params(struct comp_dev *dev, struct sof_ipc_stream_params *params) {}
570570

571-
static void src_set_sink_params(struct comp_dev *dev, struct comp_buffer *sinkb) {}
571+
static void src_set_sink_params(struct comp_dev *dev, struct comp_buffer __sparse_cache *sinkb) {}
572572
#else
573573
#error "No or invalid IPC MAJOR version selected."
574574
#endif /* CONFIG_IPC_MAJOR_4 */
@@ -667,11 +667,11 @@ static int src_params(struct comp_dev *dev,
667667
struct sof_ipc_stream_params *params)
668668
{
669669
struct comp_data *cd = comp_get_drvdata(dev);
670-
struct comp_buffer *sinkb;
671-
struct comp_buffer *sourceb;
670+
struct comp_buffer *sourceb, *sinkb;
671+
struct comp_buffer __sparse_cache *source_c, *sink_c;
672672
size_t delay_lines_size;
673673
int32_t *buffer_start;
674-
int n = 0;
674+
int n;
675675
int err;
676676

677677
comp_info(dev, "src_params()");
@@ -691,14 +691,19 @@ static int src_params(struct comp_dev *dev,
691691
sinkb = list_first_item(&dev->bsink_list, struct comp_buffer,
692692
source_list);
693693

694-
src_set_sink_params(dev, sinkb);
694+
source_c = buffer_acquire(sourceb);
695+
sink_c = buffer_acquire(sinkb);
696+
697+
src_set_sink_params(dev, sink_c);
695698

696699
/* Set source/sink_rate/frames */
697-
cd->source_rate = sourceb->stream.rate;
698-
cd->sink_rate = sinkb->stream.rate;
700+
cd->source_rate = source_c->stream.rate;
701+
cd->sink_rate = sink_c->stream.rate;
699702
if (!cd->sink_rate) {
700703
comp_err(dev, "src_params(), zero sink rate");
701-
return -EINVAL;
704+
705+
err = -EINVAL;
706+
goto out;
702707
}
703708

704709
cd->source_frames = dev->frames * cd->source_rate / cd->sink_rate;
@@ -708,12 +713,12 @@ static int src_params(struct comp_dev *dev,
708713
comp_info(dev, "src_params(), source_rate = %u, sink_rate = %u",
709714
cd->source_rate, cd->sink_rate);
710715
comp_info(dev, "src_params(), sourceb->channels = %u, sinkb->channels = %u, dev->frames = %u",
711-
sourceb->stream.channels, sinkb->stream.channels, dev->frames);
716+
source_c->stream.channels, sink_c->stream.channels, dev->frames);
712717
err = src_buffer_lengths(&cd->param, cd->source_rate, cd->sink_rate,
713-
sourceb->stream.channels, cd->source_frames);
718+
source_c->stream.channels, cd->source_frames);
714719
if (err < 0) {
715720
comp_err(dev, "src_params(): src_buffer_lengths() failed");
716-
return err;
721+
goto out;
717722
}
718723

719724
comp_info(dev, "src_params(), blk_in = %u, blk_out = %u",
@@ -722,7 +727,9 @@ static int src_params(struct comp_dev *dev,
722727
delay_lines_size = sizeof(int32_t) * cd->param.total;
723728
if (delay_lines_size == 0) {
724729
comp_err(dev, "src_params(): delay_lines_size = 0");
725-
return -EINVAL;
730+
731+
err = -EINVAL;
732+
goto out;
726733
}
727734

728735
/* free any existing delay lines. TODO reuse if same size */
@@ -733,7 +740,8 @@ static int src_params(struct comp_dev *dev,
733740
if (!cd->delay_lines) {
734741
comp_err(dev, "src_params(): failed to alloc cd->delay_lines, delay_lines_size = %u",
735742
delay_lines_size);
736-
return -EINVAL;
743+
err = -EINVAL;
744+
goto out;
737745
}
738746

739747
/* Clear all delay lines here */
@@ -765,10 +773,14 @@ static int src_params(struct comp_dev *dev,
765773
*/
766774
comp_info(dev, "src_params(), missing coefficients for requested rates combination");
767775
cd->src_func = src_fallback;
768-
return -EINVAL;
776+
err = -EINVAL;
769777
}
770778

771-
return 0;
779+
out:
780+
buffer_release(sink_c);
781+
buffer_release(source_c);
782+
783+
return err;
772784
}
773785

774786
static int src_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata)
@@ -808,8 +820,8 @@ static int src_trigger(struct comp_dev *dev, int cmd)
808820
}
809821

810822
static int src_get_copy_limits(struct comp_data *cd,
811-
const struct comp_buffer *source,
812-
const struct comp_buffer *sink)
823+
const struct comp_buffer __sparse_cache *source,
824+
const struct comp_buffer __sparse_cache *sink)
813825
{
814826
struct src_param *sp;
815827
struct src_stage *s1;
@@ -853,8 +865,8 @@ static int src_get_copy_limits(struct comp_data *cd,
853865
return 0;
854866
}
855867

856-
static void src_process(struct comp_dev *dev, struct comp_buffer *source,
857-
struct comp_buffer *sink)
868+
static void src_process(struct comp_dev *dev, struct comp_buffer __sparse_cache *source,
869+
struct comp_buffer __sparse_cache *sink)
858870
{
859871
struct comp_data *cd = comp_get_drvdata(dev);
860872
int consumed = 0;
@@ -868,18 +880,18 @@ static void src_process(struct comp_dev *dev, struct comp_buffer *source,
868880
comp_dbg(dev, "src_copy(), consumed = %u, produced = %u",
869881
consumed, produced);
870882

871-
comp_update_buffer_consume(source, consumed *
883+
comp_update_buffer_cached_consume(source, consumed *
872884
audio_stream_frame_bytes(&source->stream));
873-
comp_update_buffer_produce(sink, produced *
885+
comp_update_buffer_cached_produce(sink, produced *
874886
audio_stream_frame_bytes(&sink->stream));
875887
}
876888

877889
/* copy and process stream data from source to sink buffers */
878890
static int src_copy(struct comp_dev *dev)
879891
{
880892
struct comp_data *cd = comp_get_drvdata(dev);
881-
struct comp_buffer *source;
882-
struct comp_buffer *sink;
893+
struct comp_buffer *source, *sink;
894+
struct comp_buffer __sparse_cache *source_c, *sink_c;
883895
int ret;
884896

885897
comp_dbg(dev, "src_copy()");
@@ -890,30 +902,28 @@ static int src_copy(struct comp_dev *dev)
890902
sink = list_first_item(&dev->bsink_list, struct comp_buffer,
891903
source_list);
892904

893-
source = buffer_acquire(source);
894-
sink = buffer_acquire(sink);
905+
source_c = buffer_acquire(source);
906+
sink_c = buffer_acquire(sink);
895907

896908
/* Get from buffers and SRC conversion specific block constraints
897909
* how many frames can be processed. If sufficient number of samples
898910
* is not available the processing is omitted.
899911
*/
900-
ret = src_get_copy_limits(cd, source, sink);
901-
902-
buffer_release(sink);
903-
buffer_release(source);
904-
905-
if (ret) {
912+
ret = src_get_copy_limits(cd, source_c, sink_c);
913+
if (ret)
906914
comp_dbg(dev, "No data to process.");
907-
return 0;
908-
}
915+
else
916+
src_process(dev, source_c, sink_c);
917+
918+
buffer_release(sink_c);
919+
buffer_release(source_c);
909920

910-
src_process(dev, source, sink);
911921
return 0;
912922
}
913923

914924
static int src_check_buffer_sizes(struct comp_data *cd,
915-
struct audio_stream *source_stream,
916-
struct audio_stream *sink_stream)
925+
struct audio_stream __sparse_cache *source_stream,
926+
struct audio_stream __sparse_cache *sink_stream)
917927
{
918928
struct src_stage *s1 = cd->src.stage1;
919929
struct src_stage *s2 = cd->src.stage2;
@@ -958,8 +968,8 @@ static int src_check_buffer_sizes(struct comp_data *cd,
958968
static int src_prepare(struct comp_dev *dev)
959969
{
960970
struct comp_data *cd = comp_get_drvdata(dev);
961-
struct comp_buffer *sinkb;
962-
struct comp_buffer *sourceb;
971+
struct comp_buffer *sourceb, *sinkb;
972+
struct comp_buffer __sparse_cache *source_c, *sink_c;
963973
enum sof_ipc_frame source_format;
964974
enum sof_ipc_frame sink_format;
965975
int ret;
@@ -979,24 +989,25 @@ static int src_prepare(struct comp_dev *dev)
979989
sinkb = list_first_item(&dev->bsink_list,
980990
struct comp_buffer, source_list);
981991

992+
source_c = buffer_acquire(sourceb);
993+
sink_c = buffer_acquire(sinkb);
994+
982995
/* get source data format */
983-
source_format = sourceb->stream.frame_fmt;
996+
source_format = source_c->stream.frame_fmt;
984997

985998
/* get sink data format */
986-
sink_format = sinkb->stream.frame_fmt;
999+
sink_format = sink_c->stream.frame_fmt;
9871000

988-
ret = src_check_buffer_sizes(cd, &sourceb->stream, &sinkb->stream);
989-
if (ret < 0) {
990-
comp_err(dev, "src_prepare(): source or sink buffer size is insufficient");
991-
return ret;
992-
}
1001+
ret = src_check_buffer_sizes(cd, &source_c->stream, &sink_c->stream);
1002+
if (ret < 0)
1003+
goto out;
9931004

9941005
/* SRC supports S16_LE, S24_4LE and S32_LE formats */
9951006
if (source_format != sink_format) {
9961007
comp_err(dev, "src_prepare(): Source fmt %d and sink fmt %d are different.",
9971008
source_format, sink_format);
9981009
ret = -EINVAL;
999-
goto err;
1010+
goto out;
10001011
}
10011012

10021013
switch (source_format) {
@@ -1021,13 +1032,16 @@ static int src_prepare(struct comp_dev *dev)
10211032
default:
10221033
comp_err(dev, "src_prepare(): invalid format %d", source_format);
10231034
ret = -EINVAL;
1024-
goto err;
1035+
goto out;
10251036
}
10261037

1027-
return 0;
1038+
out:
1039+
if (ret < 0)
1040+
comp_set_state(dev, COMP_TRIGGER_RESET);
1041+
1042+
buffer_release(sink_c);
1043+
buffer_release(source_c);
10281044

1029-
err:
1030-
comp_set_state(dev, COMP_TRIGGER_RESET);
10311045
return ret;
10321046
}
10331047

0 commit comments

Comments
 (0)