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
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
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#elif defined(CONFIG_FORMAT_CONVERT_ARM_SIMD)
37#define PCM_CONVERTER_ARM_SIMD
38#else
39#define PCM_CONVERTER_GENERIC
40#endif
41#endif /* UNIT_TEST */
42
53typedef int (*pcm_converter_func)(const struct cir_buf_source *source,
54 uint32_t src_channels, struct cir_buf_sink *sink,
55 uint32_t sink_channels, size_t source_samples, uint32_t chmap);
56
57/* A channel map that does not perform any remapping. */
58#define DUMMY_CHMAP 0x76543210
59
66typedef void (*pcm_converter_lin_func)(const void *psrc, void *pdst,
67 size_t samples);
68
75
77extern const struct pcm_func_map pcm_func_map[];
78
80extern const size_t pcm_func_count;
81
82#if CONFIG_PCM_REMAPPING_CONVERTERS
84extern const struct pcm_func_map pcm_remap_func_map[];
85
87extern const size_t pcm_remap_func_count;
88#endif
89
95static inline pcm_converter_func
97 enum sof_ipc_frame out)
98{
99 uint32_t i;
100
101 for (i = 0; i < pcm_func_count; i++) {
102 if (in != pcm_func_map[i].source)
103 continue;
104 if (out != pcm_func_map[i].sink)
105 continue;
106
107 return pcm_func_map[i].func;
108 }
109
110 return NULL;
111}
112
113#if CONFIG_PCM_REMAPPING_CONVERTERS
119static inline pcm_converter_func
120pcm_get_remap_function(enum sof_ipc_frame in, enum sof_ipc_frame out)
121{
122 int i;
123
124 for (i = 0; i < pcm_remap_func_count; i++) {
125 if (in != pcm_remap_func_map[i].source)
126 continue;
127 if (out != pcm_remap_func_map[i].sink)
128 continue;
129
130 return pcm_remap_func_map[i].func;
131 }
132
133 return NULL;
134}
135#endif
136
146
148extern const struct pcm_func_vc_map pcm_func_vc_map[];
149
151extern const size_t pcm_func_vc_count;
152
162static inline pcm_converter_func
164 enum sof_ipc_frame valid_in_bits,
165 enum sof_ipc_frame out_bits,
166 enum sof_ipc_frame valid_out_bits,
168 enum ipc4_direction_type dir)
169{
170 uint32_t i;
171
172 for (i = 0; i < pcm_func_vc_count; i++) {
173 if (in_bits != pcm_func_vc_map[i].source)
174 continue;
175 if (valid_in_bits != pcm_func_vc_map[i].valid_src_bits)
176 continue;
177 if (out_bits != pcm_func_vc_map[i].sink)
178 continue;
179 if (valid_out_bits != pcm_func_vc_map[i].valid_sink_bits)
180 continue;
181
182 return pcm_func_vc_map[i].func;
183 }
184
185 return NULL;
186}
187
199int pcm_convert_as_linear(const struct cir_buf_source *source, size_t s_size_in,
200 struct cir_buf_sink *sink, size_t s_size_out,
201 size_t samples, pcm_converter_lin_func converter);
202
213int just_copy_1b(const struct cir_buf_source *source, uint32_t src_channels,
214 struct cir_buf_sink *sink, uint32_t sink_channels,
215 size_t samples, uint32_t chmap);
216
227int just_copy_2b(const struct cir_buf_source *source, uint32_t src_channels,
228 struct cir_buf_sink *sink, uint32_t sink_channels,
229 size_t samples, uint32_t chmap);
230
241int just_copy_3b(const struct cir_buf_source *source, uint32_t src_channels,
242 struct cir_buf_sink *sink, uint32_t sink_channels,
243 size_t samples, uint32_t chmap);
244
255int just_copy_4b(const struct cir_buf_source *source, uint32_t src_channels,
256 struct cir_buf_sink *sink, uint32_t sink_channels,
257 size_t samples, uint32_t chmap);
258
259#endif /* __SOF_AUDIO_PCM_CONVERTER_H__ */
IPC4 audio gateway attributes, ALH, HDA, and SoundWire gateway definitions.
ipc4_gateway_type
Gateway peripheral category bitmask.
Definition gateway.h:171
ipc4_direction_type
Audio data stream direction flags.
Definition gateway.h:185
uint32_t type
Message type, symmetric to the incoming request.
Definition header.h:8
sof_ipc_frame
Definition stream.h:16
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:96
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)
Copy 3-byte PCM stream without conversion (24-bit samples in 3 bytes).
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:53
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)
Copy 4-byte PCM stream without conversion (32-bit samples or 24-bit in 4 bytes).
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)
Copy 2-byte PCM stream without conversion (16-bit samples).
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:163
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:66
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)
Copy 1-byte PCM stream without conversion (8-bit samples).
Audio stream is a circular buffer aware of audio format of the data in the buffer so provides API for...
Definition audio_stream.h:51
Writable view of sink data in a circular buffer.
Definition audio_stream.h:128
void * ptr
Current write pointer within the buffer.
Definition audio_stream.h:131
Read-only view of source data in a circular buffer.
Definition audio_stream.h:116
const void * ptr
Current read pointer within the buffer.
Definition audio_stream.h:119
PCM conversion functions map.
Definition pcm_converter.h:70
enum sof_ipc_frame source
source frame format
Definition pcm_converter.h:71
pcm_converter_func func
PCM conversion function.
Definition pcm_converter.h:73
enum sof_ipc_frame sink
sink frame format
Definition pcm_converter.h:72
PCM conversion functions mapfor different size of valid bit and container.
Definition pcm_converter.h:138
enum sof_ipc_frame source
source frame container format
Definition pcm_converter.h:139
enum sof_ipc_frame valid_sink_bits
sink frame format
Definition pcm_converter.h:142
enum sof_ipc_frame valid_src_bits
source frame format
Definition pcm_converter.h:140
pcm_converter_func func
PCM conversion function.
Definition pcm_converter.h:144
enum sof_ipc_frame sink
sink frame container format
Definition pcm_converter.h:141