Skip to content

Commit 8fecfba

Browse files
committed
audio: pcm_converter: change pcm conversion function interface
Rework the pcm conversion and dma copy paths to operate on circular buffer source and sink descriptors instead of the legacy audio stream buffers. Signed-off-by: Adrian Warecki <adrian.warecki@intel.com>
1 parent 62a3c52 commit 8fecfba

10 files changed

Lines changed: 737 additions & 721 deletions

File tree

posix/include/sof/lib/dma.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -265,10 +265,11 @@ struct dma_info {
265265
size_t num_dmas;
266266
};
267267

268-
struct audio_stream;
269-
typedef int (*dma_process_func)(const struct audio_stream __sparse_cache *source,
270-
uint32_t ioffset, struct audio_stream __sparse_cache *sink,
271-
uint32_t ooffset, uint32_t source_samples, uint32_t chmap);
268+
struct cir_buf_source;
269+
struct cir_buf_sink;
270+
typedef int (*dma_process_func)(const struct cir_buf_source *source,
271+
uint32_t src_channels, struct cir_buf_sink *sink,
272+
uint32_t sink_channels, uint32_t source_samples, uint32_t chmap);
272273

273274
/**
274275
* \brief API to initialize a platform DMA controllers.

src/audio/copier/copier.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -619,8 +619,22 @@ static int copier_module_copy(struct processing_module *mod,
619619
sink_dev = comp_buffer_get_sink_component(sink_c);
620620
processed_data.sink_bytes = 0;
621621
if (sink_dev->state == COMP_STATE_ACTIVE) {
622+
/* Bridge the legacy audio_stream buffers into cir_buf descriptors for
623+
* the new pcm_converter interface (read/write pointers = offset 0).
624+
*/
625+
struct cir_buf_source src_cir = {
626+
.buf_start = audio_stream_get_addr(input_buffers[0].data),
627+
.buf_end = audio_stream_get_end_addr(input_buffers[0].data),
628+
.ptr = audio_stream_get_rptr(input_buffers[0].data),
629+
};
630+
struct cir_buf_sink snk_cir = {
631+
.buf_start = audio_stream_get_addr(output_buffers[i].data),
632+
.buf_end = audio_stream_get_end_addr(output_buffers[i].data),
633+
.ptr = audio_stream_get_wptr(output_buffers[i].data),
634+
};
622635
uint32_t source_samples;
623636
int sink_queue_id;
637+
pcm_converter_func converter;
624638

625639
/*
626640
* Buffer ID is constructed as IPC4_COMP_ID(src_queue, dst_queue).
@@ -630,14 +644,15 @@ static int copier_module_copy(struct processing_module *mod,
630644
sink_queue_id = IPC4_SRC_QUEUE_ID(buf_get_id(sink_c));
631645
if (sink_queue_id >= IPC4_COPIER_MODULE_OUTPUT_PINS_COUNT)
632646
return -EINVAL;
647+
converter = cd->converter[sink_queue_id];
633648

634649
comp_get_copy_limits(src_c, sink_c, &processed_data);
635650

636651
source_samples = processed_data.frames *
637652
audio_stream_get_channels(input_buffers[0].data);
638-
cd->converter[sink_queue_id](input_buffers[0].data, 0,
639-
output_buffers[i].data, 0,
640-
source_samples, DUMMY_CHMAP);
653+
converter(&src_cir,audio_stream_get_channels(input_buffers[0].data),
654+
&snk_cir, audio_stream_get_channels(output_buffers[i].data),
655+
source_samples, DUMMY_CHMAP);
641656

642657
output_buffers[i].size = processed_data.sink_bytes;
643658
cd->output_total_data_processed += processed_data.sink_bytes;

src/audio/pcm_converter/pcm_converter.c

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,52 +15,76 @@
1515
#include <sof/audio/pcm_converter.h>
1616
#include <rtos/panic.h>
1717

18-
int pcm_convert_as_linear(const struct audio_stream *source, uint32_t ioffset,
19-
struct audio_stream *sink, uint32_t ooffset,
18+
int pcm_convert_as_linear(const struct cir_buf_source *source, size_t s_size_in,
19+
struct cir_buf_sink *sink, size_t s_size_out,
2020
uint32_t samples, pcm_converter_lin_func converter)
2121
{
22-
const int s_size_in = audio_stream_sample_bytes(source);
23-
const int s_size_out = audio_stream_sample_bytes(sink);
2422
const int log2_s_size_in = ffs(s_size_in) - 1;
2523
const int log2_s_size_out = ffs(s_size_out) - 1;
26-
char *r_ptr = audio_stream_get_frag(source, audio_stream_get_rptr(source), ioffset,
27-
s_size_in);
28-
char *w_ptr = audio_stream_get_frag(sink, audio_stream_get_wptr(sink), ooffset,
29-
s_size_out);
24+
const char *r_ptr = source->ptr;
25+
char *w_ptr = sink->ptr;
3026
int i = 0;
3127
int chunk;
3228
int N1, N2;
3329

34-
/* assert enough avail/free samples in source and sink buffer */
35-
if (audio_stream_get_avail_samples(source) < samples + ioffset)
36-
return -EINVAL;
37-
if (audio_stream_get_free_samples(sink) < samples + ooffset)
38-
return -EINVAL;
3930

4031
while (i < samples) {
41-
/* calculate chunk size */
42-
/* "">> log2_s_size" is equal "/ s_size" here */
43-
N1 = audio_stream_bytes_without_wrap(source, r_ptr) >>
44-
log2_s_size_in;
45-
N2 = audio_stream_bytes_without_wrap(sink, w_ptr) >>
46-
log2_s_size_out;
32+
/* calculate chunk size; shifting by log2_s_size is dividing by s_size */
33+
N1 = ((const char *)source->buf_end - r_ptr) >> log2_s_size_in;
34+
N2 = ((char *)sink->buf_end - w_ptr) >> log2_s_size_out;
4735
chunk = MIN(N1, N2);
4836
chunk = MIN(chunk, samples - i);
4937

5038
/* run conversion on linear memory region */
5139
converter(r_ptr, w_ptr, chunk);
5240

5341
/* move pointers */
54-
r_ptr = audio_stream_wrap(source, r_ptr + chunk * s_size_in);
55-
w_ptr = audio_stream_wrap(sink, w_ptr + chunk * s_size_out);
42+
r_ptr = cir_buf_wrap(r_ptr + chunk * s_size_in,
43+
source->buf_start, source->buf_end);
44+
w_ptr = cir_buf_wrap(w_ptr + chunk * s_size_out,
45+
sink->buf_start, sink->buf_end);
5646
i += chunk;
5747
}
5848

5949
return samples;
6050
}
6151

62-
int just_copy(const struct audio_stream *source, uint32_t ioffset,
63-
struct audio_stream *sink, uint32_t ooffset, uint32_t samples, uint32_t chmap)
52+
/* Copy "bytes" of raw data from a source to a sink circular buffer. */
53+
static void just_copy_bytes(const struct cir_buf_source *source, struct cir_buf_sink *sink,
54+
uint32_t bytes)
6455
{
65-
return audio_stream_copy(source, ioffset, sink, ooffset, samples);
56+
cir_buf_copy(source->ptr, source->buf_start, source->buf_end,
57+
sink->ptr, sink->buf_start, sink->buf_end, bytes);
58+
}
59+
60+
int just_copy_1b(const struct cir_buf_source *source, uint32_t src_channels,
61+
struct cir_buf_sink *sink, uint32_t sink_channels,
62+
uint32_t samples, uint32_t chmap)
63+
{
64+
just_copy_bytes(source, sink, samples);
65+
return samples;
66+
}
67+
68+
int just_copy_2b(const struct cir_buf_source *source, uint32_t src_channels,
69+
struct cir_buf_sink *sink, uint32_t sink_channels,
70+
uint32_t samples, uint32_t chmap)
71+
{
72+
just_copy_bytes(source, sink, samples * sizeof(int16_t));
73+
return samples;
74+
}
75+
76+
int just_copy_3b(const struct cir_buf_source *source, uint32_t src_channels,
77+
struct cir_buf_sink *sink, uint32_t sink_channels,
78+
uint32_t samples, uint32_t chmap)
79+
{
80+
just_copy_bytes(source, sink, samples * 3);
81+
return samples;
82+
}
83+
84+
int just_copy_4b(const struct cir_buf_source *source, uint32_t src_channels,
85+
struct cir_buf_sink *sink, uint32_t sink_channels,
86+
uint32_t samples, uint32_t chmap)
87+
{
88+
just_copy_bytes(source, sink, samples * sizeof(int32_t));
89+
return samples;
6690
}

0 commit comments

Comments
 (0)