Sound Open Firmware
Loading...
Searching...
No Matches
pcm_converter.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2019 Intel Corporation. All rights reserved.
4 *
5 * Author: Tomasz Lauda <tomasz.lauda@linux.intel.com>
6 */
7
13
14#ifndef __SOF_AUDIO_PCM_CONVERTER_H__
15#define __SOF_AUDIO_PCM_CONVERTER_H__
16
17#include <ipc/stream.h>
18#include <ipc4/gateway.h>
19
20#include <sof/compiler_attributes.h>
21
22#include <stddef.h>
23#include <stdint.h>
24
25struct audio_stream;
26struct cir_buf_source;
27struct cir_buf_sink;
28
29#if __XCC__
30#include <xtensa/config/core-isa.h>
31#endif
32
33#ifndef UNIT_TEST
34#if __XCC__ && XCHAL_HAVE_HIFI3 && CONFIG_FORMAT_CONVERT_HIFI3
35#define PCM_CONVERTER_HIFI3
36#else
37#define PCM_CONVERTER_GENERIC
38#endif
39#endif /* UNIT_TEST */
40
51typedef int (*pcm_converter_func)(const struct cir_buf_source *source,
52 uint32_t src_channels, struct cir_buf_sink *sink,
53 uint32_t sink_channels, size_t source_samples, uint32_t chmap);
54
55/* A channel map that does not perform any remapping. */
56#define DUMMY_CHMAP 0x76543210
57
64typedef void (*pcm_converter_lin_func)(const void *psrc, void *pdst,
65 size_t samples);
66
69 enum sof_ipc_frame source;
70 enum sof_ipc_frame sink;
72};
73
75extern const struct pcm_func_map pcm_func_map[];
76
78extern const size_t pcm_func_count;
79
80#if CONFIG_PCM_REMAPPING_CONVERTERS
82extern const struct pcm_func_map pcm_remap_func_map[];
83
85extern const size_t pcm_remap_func_count;
86#endif
87
93static inline pcm_converter_func
94pcm_get_conversion_function(enum sof_ipc_frame in,
95 enum sof_ipc_frame out)
96{
97 uint32_t i;
98
99 for (i = 0; i < pcm_func_count; i++) {
100 if (in != pcm_func_map[i].source)
101 continue;
102 if (out != pcm_func_map[i].sink)
103 continue;
104
105 return pcm_func_map[i].func;
106 }
107
108 return NULL;
109}
110
111#if CONFIG_PCM_REMAPPING_CONVERTERS
117static inline pcm_converter_func
118pcm_get_remap_function(enum sof_ipc_frame in, enum sof_ipc_frame out)
119{
120 int i;
121
122 for (i = 0; i < pcm_remap_func_count; i++) {
123 if (in != pcm_remap_func_map[i].source)
124 continue;
125 if (out != pcm_remap_func_map[i].sink)
126 continue;
127
128 return pcm_remap_func_map[i].func;
129 }
130
131 return NULL;
132}
133#endif
134
137 enum sof_ipc_frame source;
138 enum sof_ipc_frame valid_src_bits;
139 enum sof_ipc_frame sink;
140 enum sof_ipc_frame valid_sink_bits;
141
143};
144
146extern const struct pcm_func_vc_map pcm_func_vc_map[];
147
149extern const size_t pcm_func_vc_count;
150
160static inline pcm_converter_func
161pcm_get_conversion_vc_function(enum sof_ipc_frame in_bits,
162 enum sof_ipc_frame valid_in_bits,
163 enum sof_ipc_frame out_bits,
164 enum sof_ipc_frame valid_out_bits,
165 enum ipc4_gateway_type type,
166 enum ipc4_direction_type dir)
167{
168 uint32_t i;
169
170 for (i = 0; i < pcm_func_vc_count; i++) {
171 if (in_bits != pcm_func_vc_map[i].source)
172 continue;
173 if (valid_in_bits != pcm_func_vc_map[i].valid_src_bits)
174 continue;
175 if (out_bits != pcm_func_vc_map[i].sink)
176 continue;
177 if (valid_out_bits != pcm_func_vc_map[i].valid_sink_bits)
178 continue;
179
180 return pcm_func_vc_map[i].func;
181 }
182
183 return NULL;
184}
185
197int pcm_convert_as_linear(const struct cir_buf_source *source, size_t s_size_in,
198 struct cir_buf_sink *sink, size_t s_size_out,
199 size_t samples, pcm_converter_lin_func converter);
200
201/* Copy stream without conversion, typed by sample size in bytes. chmap is ignored. */
202int just_copy_1b(const struct cir_buf_source *source, uint32_t src_channels,
203 struct cir_buf_sink *sink, uint32_t sink_channels,
204 size_t samples, uint32_t chmap);
205int just_copy_2b(const struct cir_buf_source *source, uint32_t src_channels,
206 struct cir_buf_sink *sink, uint32_t sink_channels,
207 size_t samples, uint32_t chmap);
208int just_copy_3b(const struct cir_buf_source *source, uint32_t src_channels,
209 struct cir_buf_sink *sink, uint32_t sink_channels,
210 size_t samples, uint32_t chmap);
211int just_copy_4b(const struct cir_buf_source *source, uint32_t src_channels,
212 struct cir_buf_sink *sink, uint32_t sink_channels,
213 size_t samples, uint32_t chmap);
214
215#endif /* __SOF_AUDIO_PCM_CONVERTER_H__ */
IPC definitions for streams.
static pcm_converter_func pcm_get_conversion_function(enum sof_ipc_frame in, enum sof_ipc_frame out)
Retrieves PCM conversion function.
Definition pcm_converter.h:94
int just_copy_3b(const struct cir_buf_source *source, uint32_t src_channels, struct cir_buf_sink *sink, uint32_t sink_channels, size_t samples, uint32_t chmap)
int(* pcm_converter_func)(const struct cir_buf_source *source, uint32_t src_channels, struct cir_buf_sink *sink, uint32_t sink_channels, size_t source_samples, uint32_t chmap)
PCM conversion function interface for data in circular buffer.
Definition pcm_converter.h:51
const size_t pcm_func_vc_count
Number of conversion functions.
int just_copy_4b(const struct cir_buf_source *source, uint32_t src_channels, struct cir_buf_sink *sink, uint32_t sink_channels, size_t samples, uint32_t chmap)
int just_copy_2b(const struct cir_buf_source *source, uint32_t src_channels, struct cir_buf_sink *sink, uint32_t sink_channels, size_t samples, uint32_t chmap)
const size_t pcm_func_count
Number of conversion functions.
int pcm_convert_as_linear(const struct cir_buf_source *source, size_t s_size_in, struct cir_buf_sink *sink, size_t s_size_out, size_t samples, pcm_converter_lin_func converter)
Convert data from circular buffer using converter working on linear memory space.
static pcm_converter_func pcm_get_conversion_vc_function(enum sof_ipc_frame in_bits, enum sof_ipc_frame valid_in_bits, enum sof_ipc_frame out_bits, enum sof_ipc_frame valid_out_bits, enum ipc4_gateway_type type, enum ipc4_direction_type dir)
Retrieves PCM conversion function for different container size.
Definition pcm_converter.h:161
void(* pcm_converter_lin_func)(const void *psrc, void *pdst, size_t samples)
PCM conversion function interface for data in linear buffer.
Definition pcm_converter.h:64
int just_copy_1b(const struct cir_buf_source *source, uint32_t src_channels, struct cir_buf_sink *sink, uint32_t sink_channels, size_t samples, uint32_t chmap)
Audio stream is a circular buffer aware of audio format of the data in the buffer so provides API for...
Definition audio_stream.h:52
PCM conversion functions map.
Definition pcm_converter.h:68
enum sof_ipc_frame source
source frame format
Definition pcm_converter.h:69
pcm_converter_func func
PCM conversion function.
Definition pcm_converter.h:71
enum sof_ipc_frame sink
sink frame format
Definition pcm_converter.h:70
PCM conversion functions mapfor different size of valid bit and container.
Definition pcm_converter.h:136
enum sof_ipc_frame source
source frame container format
Definition pcm_converter.h:137
enum sof_ipc_frame valid_sink_bits
sink frame format
Definition pcm_converter.h:140
enum sof_ipc_frame valid_src_bits
source frame format
Definition pcm_converter.h:138
pcm_converter_func func
PCM conversion function.
Definition pcm_converter.h:142
enum sof_ipc_frame sink
sink frame container format
Definition pcm_converter.h:139
uint32_t type
Definition tlv.h:0