|
15 | 15 | #include <sof/audio/pcm_converter.h> |
16 | 16 | #include <rtos/panic.h> |
17 | 17 |
|
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, |
20 | 20 | uint32_t samples, pcm_converter_lin_func converter) |
21 | 21 | { |
22 | | - const int s_size_in = audio_stream_sample_bytes(source); |
23 | | - const int s_size_out = audio_stream_sample_bytes(sink); |
24 | 22 | const int log2_s_size_in = ffs(s_size_in) - 1; |
25 | 23 | 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; |
30 | 26 | int i = 0; |
31 | 27 | int chunk; |
32 | 28 | int N1, N2; |
33 | 29 |
|
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; |
39 | 30 |
|
40 | 31 | 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; |
47 | 35 | chunk = MIN(N1, N2); |
48 | 36 | chunk = MIN(chunk, samples - i); |
49 | 37 |
|
50 | 38 | /* run conversion on linear memory region */ |
51 | 39 | converter(r_ptr, w_ptr, chunk); |
52 | 40 |
|
53 | 41 | /* 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); |
56 | 46 | i += chunk; |
57 | 47 | } |
58 | 48 |
|
59 | 49 | return samples; |
60 | 50 | } |
61 | 51 |
|
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) |
64 | 55 | { |
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; |
66 | 90 | } |
0 commit comments