1 /* SPDX-License-Identifier: GPL-2.0-or-later */
6 * Digital Audio (Plugin interface) abstract layer
7 * Copyright (c) by Jaroslav Kysela <perex@perex.cz>
10 #ifdef CONFIG_SND_PCM_OSS_PLUGINS
12 #define snd_pcm_plug_stream(plug) ((plug)->stream)
14 enum snd_pcm_plugin_action
{
19 struct snd_pcm_channel_area
{
20 void *addr
; /* base address of channel samples */
21 unsigned int first
; /* offset to first sample in bits */
22 unsigned int step
; /* samples distance in bits */
25 struct snd_pcm_plugin_channel
{
26 void *aptr
; /* pointer to the allocated area */
27 struct snd_pcm_channel_area area
;
28 snd_pcm_uframes_t frames
; /* allocated frames */
29 unsigned int enabled
:1; /* channel need to be processed */
30 unsigned int wanted
:1; /* channel is wanted */
33 struct snd_pcm_plugin_format
{
34 snd_pcm_format_t format
;
36 unsigned int channels
;
39 struct snd_pcm_plugin
{
40 const char *name
; /* plug-in name */
42 struct snd_pcm_plugin_format src_format
; /* source format */
43 struct snd_pcm_plugin_format dst_format
; /* destination format */
44 int src_width
; /* sample width in bits */
45 int dst_width
; /* sample width in bits */
46 snd_pcm_access_t access
;
47 snd_pcm_sframes_t (*src_frames
)(struct snd_pcm_plugin
*plugin
, snd_pcm_uframes_t dst_frames
);
48 snd_pcm_sframes_t (*dst_frames
)(struct snd_pcm_plugin
*plugin
, snd_pcm_uframes_t src_frames
);
49 snd_pcm_sframes_t (*client_channels
)(struct snd_pcm_plugin
*plugin
,
50 snd_pcm_uframes_t frames
,
51 struct snd_pcm_plugin_channel
**channels
);
52 snd_pcm_sframes_t (*transfer
)(struct snd_pcm_plugin
*plugin
,
53 const struct snd_pcm_plugin_channel
*src_channels
,
54 struct snd_pcm_plugin_channel
*dst_channels
,
55 snd_pcm_uframes_t frames
);
56 int (*action
)(struct snd_pcm_plugin
*plugin
,
57 enum snd_pcm_plugin_action action
,
59 struct snd_pcm_plugin
*prev
;
60 struct snd_pcm_plugin
*next
;
61 struct snd_pcm_substream
*plug
;
63 void (*private_free
)(struct snd_pcm_plugin
*plugin
);
65 snd_pcm_uframes_t buf_frames
;
66 struct snd_pcm_plugin_channel
*buf_channels
;
70 int snd_pcm_plugin_build(struct snd_pcm_substream
*handle
,
72 struct snd_pcm_plugin_format
*src_format
,
73 struct snd_pcm_plugin_format
*dst_format
,
75 struct snd_pcm_plugin
**ret
);
76 int snd_pcm_plugin_free(struct snd_pcm_plugin
*plugin
);
77 int snd_pcm_plugin_clear(struct snd_pcm_plugin
**first
);
78 int snd_pcm_plug_alloc(struct snd_pcm_substream
*plug
, snd_pcm_uframes_t frames
);
79 snd_pcm_sframes_t
snd_pcm_plug_client_size(struct snd_pcm_substream
*handle
, snd_pcm_uframes_t drv_size
);
80 snd_pcm_sframes_t
snd_pcm_plug_slave_size(struct snd_pcm_substream
*handle
, snd_pcm_uframes_t clt_size
);
82 #define FULL ROUTE_PLUGIN_RESOLUTION
83 #define HALF ROUTE_PLUGIN_RESOLUTION / 2
85 int snd_pcm_plugin_build_io(struct snd_pcm_substream
*handle
,
86 struct snd_pcm_hw_params
*params
,
87 struct snd_pcm_plugin
**r_plugin
);
88 int snd_pcm_plugin_build_linear(struct snd_pcm_substream
*handle
,
89 struct snd_pcm_plugin_format
*src_format
,
90 struct snd_pcm_plugin_format
*dst_format
,
91 struct snd_pcm_plugin
**r_plugin
);
92 int snd_pcm_plugin_build_mulaw(struct snd_pcm_substream
*handle
,
93 struct snd_pcm_plugin_format
*src_format
,
94 struct snd_pcm_plugin_format
*dst_format
,
95 struct snd_pcm_plugin
**r_plugin
);
96 int snd_pcm_plugin_build_rate(struct snd_pcm_substream
*handle
,
97 struct snd_pcm_plugin_format
*src_format
,
98 struct snd_pcm_plugin_format
*dst_format
,
99 struct snd_pcm_plugin
**r_plugin
);
100 int snd_pcm_plugin_build_route(struct snd_pcm_substream
*handle
,
101 struct snd_pcm_plugin_format
*src_format
,
102 struct snd_pcm_plugin_format
*dst_format
,
103 struct snd_pcm_plugin
**r_plugin
);
104 int snd_pcm_plugin_build_copy(struct snd_pcm_substream
*handle
,
105 struct snd_pcm_plugin_format
*src_format
,
106 struct snd_pcm_plugin_format
*dst_format
,
107 struct snd_pcm_plugin
**r_plugin
);
109 int snd_pcm_plug_format_plugins(struct snd_pcm_substream
*substream
,
110 struct snd_pcm_hw_params
*params
,
111 struct snd_pcm_hw_params
*slave_params
);
113 snd_pcm_format_t
snd_pcm_plug_slave_format(snd_pcm_format_t format
,
114 const struct snd_mask
*format_mask
);
116 int snd_pcm_plugin_append(struct snd_pcm_plugin
*plugin
);
118 snd_pcm_sframes_t
snd_pcm_plug_write_transfer(struct snd_pcm_substream
*handle
,
119 struct snd_pcm_plugin_channel
*src_channels
,
120 snd_pcm_uframes_t size
);
121 snd_pcm_sframes_t
snd_pcm_plug_read_transfer(struct snd_pcm_substream
*handle
,
122 struct snd_pcm_plugin_channel
*dst_channels_final
,
123 snd_pcm_uframes_t size
);
125 snd_pcm_sframes_t
snd_pcm_plug_client_channels_buf(struct snd_pcm_substream
*handle
,
126 char *buf
, snd_pcm_uframes_t count
,
127 struct snd_pcm_plugin_channel
**channels
);
129 snd_pcm_sframes_t
snd_pcm_plugin_client_channels(struct snd_pcm_plugin
*plugin
,
130 snd_pcm_uframes_t frames
,
131 struct snd_pcm_plugin_channel
**channels
);
133 int snd_pcm_area_silence(const struct snd_pcm_channel_area
*dst_channel
,
135 size_t samples
, snd_pcm_format_t format
);
136 int snd_pcm_area_copy(const struct snd_pcm_channel_area
*src_channel
,
138 const struct snd_pcm_channel_area
*dst_channel
,
140 size_t samples
, snd_pcm_format_t format
);
142 void *snd_pcm_plug_buf_alloc(struct snd_pcm_substream
*plug
, snd_pcm_uframes_t size
);
143 void snd_pcm_plug_buf_unlock(struct snd_pcm_substream
*plug
, void *ptr
);
144 snd_pcm_sframes_t
snd_pcm_oss_write3(struct snd_pcm_substream
*substream
,
145 const char *ptr
, snd_pcm_uframes_t size
,
147 snd_pcm_sframes_t
snd_pcm_oss_read3(struct snd_pcm_substream
*substream
,
148 char *ptr
, snd_pcm_uframes_t size
, int in_kernel
);
149 snd_pcm_sframes_t
snd_pcm_oss_writev3(struct snd_pcm_substream
*substream
,
150 void **bufs
, snd_pcm_uframes_t frames
);
151 snd_pcm_sframes_t
snd_pcm_oss_readv3(struct snd_pcm_substream
*substream
,
152 void **bufs
, snd_pcm_uframes_t frames
);
156 static inline snd_pcm_sframes_t
snd_pcm_plug_client_size(struct snd_pcm_substream
*handle
, snd_pcm_uframes_t drv_size
) { return drv_size
; }
157 static inline snd_pcm_sframes_t
snd_pcm_plug_slave_size(struct snd_pcm_substream
*handle
, snd_pcm_uframes_t clt_size
) { return clt_size
; }
158 static inline int snd_pcm_plug_slave_format(int format
, const struct snd_mask
*format_mask
) { return format
; }
163 #define pdprintf(fmt, args...) printk(KERN_DEBUG "plugin: " fmt, ##args)
165 #define pdprintf(fmt, args...)
168 #endif /* __PCM_PLUGIN_H */