Skip to content

Commit 3e4736f

Browse files
lyakhkv2019i
authored andcommitted
audio: buffer: don't overwrite global objects
The 4 buffer operation sets: comp_buffer_source_ops, comp_buffer_sink_ops, ring_buffer_source_ops and ring_buffer_sink_ops are pointed to by every buffer. Yet when initialising each of those buffers attempts are made to overwrite those global objects with the same pointers. So in practive when the first buffer is registered, it overwrites those object members, and then all further buffers inherit those changes. This works because those values are always the same, still this isn't a good practice. Assign those members statically and make objects constant instead. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent 446c576 commit 3e4736f

4 files changed

Lines changed: 32 additions & 29 deletions

File tree

src/audio/buffers/audio_buffer.c

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ int audio_buffer_source_set_ipc_params_default(struct sof_audio_buffer *buffer,
122122
return 0;
123123
}
124124

125-
static
126125
int audio_buffer_sink_set_ipc_params(struct sof_sink *sink, struct sof_ipc_stream_params *params,
127126
bool force_update)
128127
{
@@ -133,7 +132,6 @@ int audio_buffer_sink_set_ipc_params(struct sof_sink *sink, struct sof_ipc_strea
133132
return audio_buffer_source_set_ipc_params_default(buffer, params, force_update);
134133
}
135134

136-
static
137135
int audio_buffer_sink_on_audio_format_set(struct sof_sink *sink)
138136
{
139137
struct sof_audio_buffer *buffer = sof_audio_buffer_from_sink(sink);
@@ -143,7 +141,6 @@ int audio_buffer_sink_on_audio_format_set(struct sof_sink *sink)
143141
return 0;
144142
}
145143

146-
static
147144
int audio_buffer_sink_set_alignment_constants(struct sof_sink *sink,
148145
const uint32_t byte_align,
149146
const uint32_t frame_align_req)
@@ -155,7 +152,6 @@ int audio_buffer_sink_set_alignment_constants(struct sof_sink *sink,
155152
return 0;
156153
}
157154

158-
static
159155
int audio_buffer_source_set_ipc_params(struct sof_source *source,
160156
struct sof_ipc_stream_params *params, bool force_update)
161157
{
@@ -166,7 +162,6 @@ int audio_buffer_source_set_ipc_params(struct sof_source *source,
166162
return audio_buffer_source_set_ipc_params_default(buffer, params, force_update);
167163
}
168164

169-
static
170165
int audio_buffer_source_on_audio_format_set(struct sof_source *source)
171166
{
172167
struct sof_audio_buffer *buffer = sof_audio_buffer_from_source(source);
@@ -176,7 +171,6 @@ int audio_buffer_source_on_audio_format_set(struct sof_source *source)
176171
return 0;
177172
}
178173

179-
static
180174
int audio_buffer_source_set_alignment_constants(struct sof_source *source,
181175
const uint32_t byte_align,
182176
const uint32_t frame_align_req)
@@ -189,7 +183,7 @@ int audio_buffer_source_set_alignment_constants(struct sof_source *source,
189183
}
190184

191185
void audio_buffer_init(struct sof_audio_buffer *buffer, uint32_t buffer_type, bool is_shared,
192-
struct source_ops *source_ops, struct sink_ops *sink_ops,
186+
const struct source_ops *source_ops, const struct sink_ops *sink_ops,
193187
const struct audio_buffer_ops *audio_buffer_ops,
194188
struct sof_audio_stream_params *audio_stream_params)
195189
{
@@ -200,23 +194,6 @@ void audio_buffer_init(struct sof_audio_buffer *buffer, uint32_t buffer_type, bo
200194
buffer->audio_stream_params = audio_stream_params;
201195
buffer->is_shared = is_shared;
202196

203-
/* set default implementations of sink/source methods, if there's no
204-
* specific implementation provided
205-
*/
206-
if (!sink_ops->audio_set_ipc_params)
207-
sink_ops->audio_set_ipc_params = audio_buffer_sink_set_ipc_params;
208-
if (!sink_ops->on_audio_format_set && buffer->ops->on_audio_format_set)
209-
sink_ops->on_audio_format_set = audio_buffer_sink_on_audio_format_set;
210-
if (!sink_ops->set_alignment_constants && buffer->ops->set_alignment_constants)
211-
sink_ops->set_alignment_constants = audio_buffer_sink_set_alignment_constants;
212-
213-
if (!source_ops->audio_set_ipc_params)
214-
source_ops->audio_set_ipc_params = audio_buffer_source_set_ipc_params;
215-
if (!source_ops->on_audio_format_set && buffer->ops->on_audio_format_set)
216-
source_ops->on_audio_format_set = audio_buffer_source_on_audio_format_set;
217-
if (!source_ops->set_alignment_constants && buffer->ops->set_alignment_constants)
218-
source_ops->set_alignment_constants = audio_buffer_source_set_alignment_constants;
219-
220197
source_init(audio_buffer_get_source(buffer), source_ops,
221198
audio_buffer_get_stream_params(buffer));
222199
sink_init(audio_buffer_get_sink(buffer), sink_ops,

src/audio/buffers/comp_buffer.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,22 @@ static void comp_buffer_free(struct sof_audio_buffer *audio_buffer)
161161
rfree(buffer);
162162
}
163163

164-
static struct source_ops comp_buffer_source_ops = {
164+
static const struct source_ops comp_buffer_source_ops = {
165165
.get_data_available = comp_buffer_get_data_available,
166166
.get_data = comp_buffer_get_data,
167167
.release_data = comp_buffer_release_data,
168+
.audio_set_ipc_params = audio_buffer_source_set_ipc_params,
169+
.on_audio_format_set = audio_buffer_source_on_audio_format_set,
170+
.set_alignment_constants = audio_buffer_source_set_alignment_constants,
168171
};
169172

170-
static struct sink_ops comp_buffer_sink_ops = {
173+
static const struct sink_ops comp_buffer_sink_ops = {
171174
.get_free_size = comp_buffer_get_free_size,
172175
.get_buffer = comp_buffer_get_buffer,
173176
.commit_buffer = comp_buffer_commit_buffer,
177+
.audio_set_ipc_params = audio_buffer_sink_set_ipc_params,
178+
.on_audio_format_set = audio_buffer_sink_on_audio_format_set,
179+
.set_alignment_constants = audio_buffer_sink_set_alignment_constants,
174180
};
175181

176182
static const struct audio_buffer_ops audio_buffer_ops = {

src/audio/buffers/ring_buffer.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,17 +255,23 @@ int ring_buffer_module_unbind(struct sof_sink *sink)
255255
return 0;
256256
}
257257

258-
static struct source_ops ring_buffer_source_ops = {
258+
static const struct source_ops ring_buffer_source_ops = {
259259
.get_data_available = ring_buffer_get_data_available,
260260
.get_data = ring_buffer_get_data,
261261
.release_data = ring_buffer_release_data,
262+
.audio_set_ipc_params = audio_buffer_source_set_ipc_params,
263+
.on_audio_format_set = audio_buffer_source_on_audio_format_set,
264+
.set_alignment_constants = audio_buffer_source_set_alignment_constants,
262265
};
263266

264-
static struct sink_ops ring_buffer_sink_ops = {
267+
static const struct sink_ops ring_buffer_sink_ops = {
265268
.get_free_size = ring_buffer_get_free_size,
266269
.get_buffer = ring_buffer_get_buffer,
267270
.commit_buffer = ring_buffer_commit_buffer,
268271
.on_unbind = ring_buffer_module_unbind,
272+
.audio_set_ipc_params = audio_buffer_sink_set_ipc_params,
273+
.on_audio_format_set = audio_buffer_sink_on_audio_format_set,
274+
.set_alignment_constants = audio_buffer_sink_set_alignment_constants,
269275
};
270276

271277
static const struct audio_buffer_ops audio_buffer_ops = {

src/include/sof/audio/audio_buffer.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ static inline struct sof_audio_buffer *sof_audio_buffer_from_source(struct sof_s
287287
* audio_buffer_ops operations
288288
*/
289289
void audio_buffer_init(struct sof_audio_buffer *buffer, uint32_t buffer_type, bool is_shared,
290-
struct source_ops *source_ops, struct sink_ops *sink_ops,
290+
const struct source_ops *source_ops, const struct sink_ops *sink_ops,
291291
const struct audio_buffer_ops *audio_buffer_ops,
292292
struct sof_audio_stream_params *audio_stream_params);
293293

@@ -307,4 +307,18 @@ void audio_buffer_reset(struct sof_audio_buffer *buffer)
307307
buffer->ops->reset(buffer);
308308
}
309309

310+
/* Audio-buffer wrappers for the source-sink API */
311+
int audio_buffer_source_set_ipc_params(struct sof_source *source,
312+
struct sof_ipc_stream_params *params, bool force_update);
313+
int audio_buffer_source_on_audio_format_set(struct sof_source *source);
314+
int audio_buffer_source_set_alignment_constants(struct sof_source *source,
315+
const uint32_t byte_align,
316+
const uint32_t frame_align_req);
317+
int audio_buffer_sink_set_ipc_params(struct sof_sink *sink, struct sof_ipc_stream_params *params,
318+
bool force_update);
319+
int audio_buffer_sink_on_audio_format_set(struct sof_sink *sink);
320+
int audio_buffer_sink_set_alignment_constants(struct sof_sink *sink,
321+
const uint32_t byte_align,
322+
const uint32_t frame_align_req);
323+
310324
#endif /* __SOF_AUDIO_BUFFER__ */

0 commit comments

Comments
 (0)