Skip to content

Commit 7331745

Browse files
RanderWanglgirdwood
authored andcommitted
dummy-smart-amp: use sink & source buffer
Use process instead of process_audio_stream for pipeline 2.0 Signed-off-by: Rander Wang <rander.wang@intel.com>
1 parent 7f1193c commit 7331745

File tree

1 file changed

+144
-172
lines changed

1 file changed

+144
-172
lines changed

src/samples/audio/smart_amp_test_ipc4.c

Lines changed: 144 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,15 @@ DECLARE_SOF_RT_UUID("smart_amp-test", smart_amp_test_comp_uuid, 0x167a961e, 0x8a
2525

2626
DECLARE_TR_CTX(smart_amp_test_comp_tr, SOF_UUID(smart_amp_test_comp_uuid),
2727
LOG_LEVEL_INFO);
28-
typedef int(*smart_amp_proc)(struct processing_module *mod,
29-
struct input_stream_buffer *bsource,
30-
struct output_stream_buffer *bsink, uint32_t frames,
31-
int8_t *chan_map);
28+
29+
typedef void (*smart_amp_proc)(int8_t const *src_ptr,
30+
int8_t const *src_begin,
31+
int8_t const *src_end,
32+
int8_t *dst_ptr,
33+
int8_t const *dst_begin,
34+
int8_t const *dst_end,
35+
uint32_t size);
36+
3237
struct smart_amp_data {
3338
struct sof_smart_amp_ipc4_config ipc4_cfg;
3439
struct sof_smart_amp_config config;
@@ -86,27 +91,6 @@ static int smart_amp_init(struct processing_module *mod)
8691
return ret;
8792
}
8893

89-
static void smart_amp_set_params(struct processing_module *mod)
90-
{
91-
struct sof_ipc_stream_params *params = mod->stream_params;
92-
struct comp_dev *dev = mod->dev;
93-
struct smart_amp_data *sad = module_get_private_data(mod);
94-
struct comp_buffer *sink;
95-
96-
ipc4_base_module_cfg_to_stream_params(&mod->priv.cfg.base_cfg, params);
97-
98-
/* update sink format */
99-
if (!list_is_empty(&dev->bsink_list)) {
100-
struct ipc4_output_pin_format *sink_fmt = &sad->ipc4_cfg.output_pin;
101-
struct ipc4_audio_format out_fmt = sink_fmt->audio_fmt;
102-
103-
sink = list_first_item(&dev->bsink_list, struct comp_buffer, source_list);
104-
105-
ipc4_update_buffer_format(sink, &out_fmt);
106-
params->frame_fmt = audio_stream_get_frm_fmt(&sink->stream);
107-
}
108-
}
109-
11094
static int smart_amp_set_config(struct processing_module *mod, uint32_t config_id,
11195
enum module_cfg_fragment_position pos, uint32_t data_offset_size,
11296
const uint8_t *fragment, size_t fragment_size, uint8_t *response,
@@ -171,160 +155,156 @@ static int smart_amp_free(struct processing_module *mod)
171155
return 0;
172156
}
173157

174-
static int smart_amp_params(struct processing_module *mod)
158+
static void process_s16(int8_t const *src_ptr,
159+
int8_t const *src_begin,
160+
int8_t const *src_end,
161+
int8_t *dst_ptr,
162+
int8_t const *dst_begin,
163+
int8_t const *dst_end,
164+
uint32_t size)
175165
{
176-
struct sof_ipc_stream_params *params = mod->stream_params;
177-
struct comp_dev *dev = mod->dev;
178-
int ret;
166+
int16_t const *src_addr = (int16_t const *)src_ptr;
167+
int16_t *dst_addr = (int16_t *)dst_ptr;
168+
int count = size >> 1;
169+
int i;
179170

180-
comp_dbg(dev, "smart_amp_params()");
181-
smart_amp_set_params(mod);
182-
ret = comp_verify_params(dev, BUFF_PARAMS_CHANNELS, params);
183-
if (ret < 0) {
184-
comp_err(dev, "smart_amp_params(): pcm params verification failed.");
185-
return -EINVAL;
171+
for (i = 0; i < count; i++) {
172+
if (src_addr >= (int16_t const *)src_end)
173+
src_addr = (int16_t const *)src_begin;
174+
175+
if (dst_addr >= (int16_t *)dst_end)
176+
dst_addr = (int16_t *)dst_begin;
177+
178+
*dst_addr = *src_addr;
179+
src_addr++;
180+
dst_addr++;
186181
}
187-
return 0;
188182
}
189183

190-
static int smart_amp_process_s16(struct processing_module *mod,
191-
struct input_stream_buffer *bsource,
192-
struct output_stream_buffer *bsink,
193-
uint32_t frames, int8_t *chan_map)
184+
static void process_s32(int8_t const *src_ptr,
185+
int8_t const *src_begin,
186+
int8_t const *src_end,
187+
int8_t *dst_ptr,
188+
int8_t const *dst_begin,
189+
int8_t const *dst_end,
190+
uint32_t size)
194191
{
195-
struct smart_amp_data *sad = module_get_private_data(mod);
196-
struct audio_stream *source = bsource->data;
197-
struct audio_stream *sink = bsink->data;
198-
int16_t *src;
199-
int16_t *dest;
200-
uint32_t in_frag = 0;
201-
uint32_t out_frag = 0;
192+
int32_t const *src_addr = (int32_t const *)src_ptr;
193+
int32_t *dst_addr = (int32_t *)dst_ptr;
194+
int count = size >> 2;
202195
int i;
203-
int j;
204-
205-
bsource->consumed += frames * audio_stream_get_channels(source) * sizeof(int16_t);
206-
for (i = 0; i < frames; i++) {
207-
for (j = 0 ; j < sad->out_channels; j++) {
208-
if (chan_map[j] != -1) {
209-
src = audio_stream_read_frag_s16(source,
210-
in_frag +
211-
chan_map[j]);
212-
dest = audio_stream_write_frag_s16(sink,
213-
out_frag);
214-
*dest = *src;
215-
}
216-
out_frag++;
217-
}
218-
in_frag += audio_stream_get_channels(source);
196+
197+
for (i = 0; i < count; i++) {
198+
if (src_addr >= (int32_t const *)src_end)
199+
src_addr = (int32_t const *)src_begin;
200+
201+
if (dst_addr >= (int32_t *)dst_end)
202+
dst_addr = (int32_t *)dst_begin;
203+
204+
*dst_addr = *src_addr;
205+
src_addr++;
206+
dst_addr++;
219207
}
220-
return 0;
221208
}
222209

223-
static int smart_amp_process_s32(struct processing_module *mod,
224-
struct input_stream_buffer *bsource,
225-
struct output_stream_buffer *bsink,
226-
uint32_t frames, int8_t *chan_map)
210+
static int smart_amp_process_data(struct processing_module *mod,
211+
struct sof_source *source,
212+
struct sof_source *feedback,
213+
struct sof_sink *sink,
214+
size_t size)
227215
{
228216
struct smart_amp_data *sad = module_get_private_data(mod);
229-
struct audio_stream *source = bsource->data;
230-
struct audio_stream *sink = bsink->data;
231-
int32_t *src;
232-
int32_t *dest;
233-
uint32_t in_frag = 0;
234-
uint32_t out_frag = 0;
235-
int i;
236-
int j;
237-
238-
bsource->consumed += frames * audio_stream_get_channels(source) * sizeof(int32_t);
239-
for (i = 0; i < frames; i++) {
240-
for (j = 0 ; j < sad->out_channels; j++) {
241-
if (chan_map[j] != -1) {
242-
src = audio_stream_read_frag_s32(source,
243-
in_frag +
244-
chan_map[j]);
245-
dest = audio_stream_write_frag_s32(sink,
246-
out_frag);
247-
*dest = *src;
248-
}
249-
out_frag++;
250-
}
251-
in_frag += audio_stream_get_channels(source);
252-
}
217+
int8_t const *src_ptr;
218+
int8_t const *src_begin;
219+
int8_t const *src_end;
220+
int8_t *dst_ptr;
221+
int8_t const *dst_begin;
222+
int8_t const *dst_end;
223+
size_t src_size;
224+
size_t dst_size;
225+
int ret;
253226

254-
return 0;
255-
}
227+
ret = sink_get_buffer(sink, size,
228+
(void **)&dst_ptr,
229+
(void **)&dst_begin,
230+
&dst_size);
231+
if (ret)
232+
return ret;
256233

257-
static smart_amp_proc get_smart_amp_process(struct comp_dev *dev,
258-
struct comp_buffer *buf)
259-
{
260-
switch (audio_stream_get_frm_fmt(&buf->stream)) {
261-
case SOF_IPC_FRAME_S16_LE:
262-
return smart_amp_process_s16;
263-
case SOF_IPC_FRAME_S24_4LE:
264-
case SOF_IPC_FRAME_S32_LE:
265-
return smart_amp_process_s32;
266-
default:
267-
comp_err(dev, "smart_amp_process() error: not supported frame format");
268-
return NULL;
234+
if (!feedback || !source_get_data_available(feedback))
235+
goto source;
236+
237+
ret = source_get_data(feedback, size,
238+
(void const **)&src_ptr,
239+
(void const **)&src_begin,
240+
&src_size);
241+
if (ret) {
242+
if (ret == -EBUSY)
243+
return 0;
244+
else
245+
return ret;
269246
}
247+
248+
src_end = src_begin + src_size;
249+
dst_end = dst_begin + dst_size;
250+
sad->process(src_ptr, src_begin, src_end, dst_ptr, dst_begin, dst_end, size);
251+
source_release_data(feedback, size);
252+
253+
source:
254+
ret = source_get_data(source, size,
255+
(void const **)&src_ptr,
256+
(void const **)&src_begin,
257+
&src_size);
258+
if (ret)
259+
return ret;
260+
261+
src_end = src_begin + src_size;
262+
dst_end = dst_begin + dst_size;
263+
sad->process(src_ptr, src_begin, src_end, dst_ptr, dst_begin, dst_end, size);
264+
source_release_data(source, size);
265+
sink_commit_buffer(sink, size);
266+
return 0;
270267
}
271268

272269
static int smart_amp_process(struct processing_module *mod,
273-
struct input_stream_buffer *input_buffers, int num_input_buffers,
274-
struct output_stream_buffer *output_buffers, int num_output_buffers)
270+
struct sof_source **sources, int num_of_sources,
271+
struct sof_sink **sinks, int num_of_sinks)
275272
{
276273
struct smart_amp_data *sad = module_get_private_data(mod);
277274
struct comp_dev *dev = mod->dev;
278-
struct comp_buffer *fb_buf_c;
279-
struct comp_buffer *buf;
280-
struct input_stream_buffer *fb_input = NULL;
275+
struct sof_source *fb_input = NULL;
281276
/* if there is only one input stream, it should be the source input */
282-
struct input_stream_buffer *src_input = &input_buffers[0];
283-
uint32_t avail_passthrough_frames;
284-
uint32_t avail_frames = 0;
285-
uint32_t sink_bytes;
277+
struct sof_source *src_input = sources[0];
278+
uint32_t avail_passthrough;
279+
uint32_t avail = 0;
286280
uint32_t i;
281+
int ret;
287282

288-
if (num_input_buffers == SMART_AMP_NUM_IN_PINS)
289-
for (i = 0; i < num_input_buffers; i++) {
290-
buf = container_of(input_buffers[i].data, struct comp_buffer, stream);
291-
292-
if (IPC4_SINK_QUEUE_ID(buf_get_id(buf)) ==
293-
SOF_SMART_AMP_FEEDBACK_QUEUE_ID) {
294-
fb_input = &input_buffers[i];
295-
fb_buf_c = buf;
283+
if (num_of_sources == SMART_AMP_NUM_IN_PINS) {
284+
for (i = 0; i < num_of_sources; i++) {
285+
if (IPC4_SINK_QUEUE_ID(source_get_id(sources[i])) ==
286+
SOF_SMART_AMP_FEEDBACK_QUEUE_ID) {
287+
fb_input = sources[i];
296288
} else {
297-
src_input = &input_buffers[i];
289+
src_input = sources[i];
298290
}
299291
}
300-
301-
avail_passthrough_frames = src_input->size;
302-
303-
if (fb_input) {
304-
if (fb_buf_c->source && comp_get_state(dev, fb_buf_c->source) == dev->state) {
305-
/* feedback */
306-
avail_frames = MIN(avail_passthrough_frames,
307-
fb_input->size);
308-
309-
sad->process(mod, fb_input, &output_buffers[0],
310-
avail_frames, sad->config.feedback_ch_map);
311-
}
312292
}
313293

314-
if (!avail_frames)
315-
avail_frames = avail_passthrough_frames;
294+
avail_passthrough = source_get_data_available(src_input);
316295

317-
/* bytes calculation */
318-
sink_bytes = avail_frames *
319-
audio_stream_frame_bytes(output_buffers[0].data);
296+
if (fb_input && source_get_data_available(fb_input)) {
297+
/* feedback */
298+
avail = MIN(avail_passthrough, source_get_data_available(fb_input));
299+
avail = MIN(avail, sink_get_free_size(sinks[0]));
300+
} else {
301+
avail = MIN(avail_passthrough, sink_get_free_size(sinks[0]));
302+
}
320303

321304
/* process data */
322-
sad->process(mod, src_input, &output_buffers[0],
323-
avail_frames, sad->config.source_ch_map);
324-
325-
output_buffers[0].size = sink_bytes;
305+
ret = smart_amp_process_data(mod, src_input, fb_input, sinks[0], avail);
326306

327-
return 0;
307+
return ret;
328308
}
329309

330310
static int smart_amp_reset(struct processing_module *mod)
@@ -336,6 +316,19 @@ static int smart_amp_reset(struct processing_module *mod)
336316
return 0;
337317
}
338318

319+
static smart_amp_proc get_smart_amp_process(struct sof_sink *sink)
320+
{
321+
switch (sink_get_frm_fmt(sink)) {
322+
case SOF_IPC_FRAME_S16_LE:
323+
return process_s16;
324+
case SOF_IPC_FRAME_S24_4LE:
325+
case SOF_IPC_FRAME_S32_LE:
326+
return process_s32;
327+
default:
328+
return NULL;
329+
}
330+
}
331+
339332
static int smart_amp_prepare(struct processing_module *mod,
340333
struct sof_source **sources, int num_of_sources,
341334
struct sof_sink **sinks, int num_of_sinks)
@@ -346,42 +339,21 @@ static int smart_amp_prepare(struct processing_module *mod,
346339
struct comp_buffer *sink_buffer;
347340
struct list_item *blist;
348341
int ret;
342+
int i;
349343

350-
ret = smart_amp_params(mod);
351-
if (ret < 0)
352-
return ret;
353-
354-
comp_dbg(dev, "smart_amp_prepare()");
355-
/* searching for stream and feedback source buffers */
356-
list_for_item(blist, &dev->bsource_list) {
357-
source_buffer = container_of(blist, struct comp_buffer,
358-
sink_list);
359-
audio_stream_init_alignment_constants(1, 1, &source_buffer->stream);
360-
if (IPC4_SINK_QUEUE_ID(buf_get_id(source_buffer)) ==
361-
SOF_SMART_AMP_FEEDBACK_QUEUE_ID) {
362-
audio_stream_set_channels(&source_buffer->stream,
363-
sad->config.feedback_channels);
364-
audio_stream_set_rate(&source_buffer->stream,
365-
mod->priv.cfg.base_cfg.audio_fmt.sampling_frequency);
366-
}
367-
}
368-
369-
sink_buffer = list_first_item(&dev->bsink_list, struct comp_buffer, source_list);
370-
sad->out_channels = audio_stream_get_channels(&sink_buffer->stream);
371-
audio_stream_init_alignment_constants(1, 1, &sink_buffer->stream);
372-
sad->process = get_smart_amp_process(dev, sink_buffer);
344+
sad->process = get_smart_amp_process(sinks[0]);
373345

374346
if (!sad->process) {
375347
comp_err(dev, "smart_amp_prepare(): get_smart_amp_process failed");
376-
ret = -EINVAL;
348+
return -EINVAL;
377349
}
378-
return ret;
350+
return 0;
379351
}
380352

381353
static const struct module_interface smart_amp_test_interface = {
382354
.init = smart_amp_init,
383355
.prepare = smart_amp_prepare,
384-
.process_audio_stream = smart_amp_process,
356+
.process = smart_amp_process,
385357
.set_configuration = smart_amp_set_config,
386358
.get_configuration = smart_amp_get_config,
387359
.reset = smart_amp_reset,

0 commit comments

Comments
 (0)