Skip to content

Commit 0b31723

Browse files
committed
Module: Audio: Add s16/32 source_get_data and sink_get_buffer
This patch adds helper functions source_get_data_s16(), source_get_data_s32(), sink_get_buffer_s16(), and sink_get_buffer_s32(). The buffer_samples as number of samples simplifies the processing function with no division or shift needed to convert buffer size in bytes to samples. Also the int16_t and int32_t typed arguments for data pointer and buffer start avoid type casts in a typical simple processing function. Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
1 parent b193c48 commit 0b31723

4 files changed

Lines changed: 90 additions & 0 deletions

File tree

src/include/module/audio/sink_api.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,12 @@ size_t sink_get_free_frames(struct sof_sink *sink);
170170
int sink_get_buffer(struct sof_sink *sink, size_t req_size, void **data_ptr, void **buffer_start,
171171
size_t *buffer_size);
172172

173+
int sink_get_buffer_s16(struct sof_sink *sink, size_t req_size, int16_t **data_ptr,
174+
int16_t **buffer_start, int *buffer_samples);
175+
176+
int sink_get_buffer_s32(struct sof_sink *sink, size_t req_size, int32_t **data_ptr,
177+
int32_t **buffer_start, int *buffer_samples);
178+
173179
/**
174180
* Commits that the buffer previously obtained by get_buffer is filled with data
175181
* and ready to be used

src/include/module/audio/source_api.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,38 @@ size_t source_get_data_frames_available(struct sof_source *source);
184184
int source_get_data(struct sof_source *source, size_t req_size, void const **data_ptr,
185185
void const **buffer_start, size_t *buffer_size);
186186

187+
/**
188+
* Same as source_get_data() except that the size of circular buffer is returned as
189+
* 16 bit samples count. The returned samples count simplifies pointer arithmetic in a
190+
* samples process function.
191+
*
192+
* @param source a handler to source
193+
* @param [in] req_size requested size of data.
194+
* @param [out] data_ptr a pointer to data will be provided there
195+
* @param [out] buffer_start pointer to circular buffer start
196+
* @param [out] buffer_samples number of 16 bit samples total in circular buffer
197+
*
198+
* @retval -ENODATA if req_size is bigger than available data
199+
*/
200+
int source_get_data_s16(struct sof_source *source, size_t req_size, int16_t const **data_ptr,
201+
int16_t const **buffer_start, int *buffer_samples);
202+
203+
/**
204+
* Same as source_get_data() except that the size of circular buffer is returned as
205+
* 32 bit samples count. The returned samples count simplifies pointer arithmetic in a
206+
* samples process function.
207+
*
208+
* @param source a handler to source
209+
* @param [in] req_size requested size of data.
210+
* @param [out] data_ptr a pointer to data will be provided there
211+
* @param [out] buffer_start pointer to circular buffer start
212+
* @param [out] buffer_samples number of 32 bit samples total in circular buffer
213+
*
214+
* @retval -ENODATA if req_size is bigger than available data
215+
*/
216+
int source_get_data_s32(struct sof_source *source, size_t req_size, int32_t const **data_ptr,
217+
int32_t const **buffer_start, int *buffer_samples);
218+
187219
/**
188220
* Releases fragment previously obtained by source_get_data()
189221
* Once called, the data are no longer available for the caller

src/module/audio/sink_api.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,32 @@ int sink_get_buffer(struct sof_sink *sink, size_t req_size,
3636
}
3737
EXPORT_SYMBOL(sink_get_buffer);
3838

39+
int sink_get_buffer_s16(struct sof_sink *sink, size_t req_size,
40+
int16_t **data_ptr, int16_t **buffer_start, int *buffer_samples)
41+
{
42+
size_t buffer_size;
43+
int ret;
44+
45+
ret = sink_get_buffer(sink, req_size, (void **)data_ptr, (void **)buffer_start,
46+
&buffer_size);
47+
*buffer_samples = buffer_size >> 1;
48+
return ret;
49+
}
50+
EXPORT_SYMBOL(sink_get_buffer_s16);
51+
52+
int sink_get_buffer_s32(struct sof_sink *sink, size_t req_size,
53+
int32_t **data_ptr, int32_t **buffer_start, int *buffer_samples)
54+
{
55+
size_t buffer_size;
56+
int ret;
57+
58+
ret = sink_get_buffer(sink, req_size, (void **)data_ptr, (void **)buffer_start,
59+
&buffer_size);
60+
*buffer_samples = buffer_size >> 2;
61+
return ret;
62+
}
63+
EXPORT_SYMBOL(sink_get_buffer_s32);
64+
3965
int sink_commit_buffer(struct sof_sink *sink, size_t commit_size)
4066
{
4167
int ret;

src/module/audio/source_api.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,32 @@ int source_get_data(struct sof_source *source, size_t req_size,
3535
}
3636
EXPORT_SYMBOL(source_get_data);
3737

38+
int source_get_data_s16(struct sof_source *source, size_t req_size, int16_t const **data_ptr,
39+
int16_t const **buffer_start, int *buffer_samples)
40+
{
41+
size_t buffer_size;
42+
int ret;
43+
44+
ret = source_get_data(source, req_size, (void const **)data_ptr,
45+
(void const **)buffer_start, &buffer_size);
46+
*buffer_samples = buffer_size >> 1;
47+
return ret;
48+
}
49+
EXPORT_SYMBOL(source_get_data_s16);
50+
51+
int source_get_data_s32(struct sof_source *source, size_t req_size, int32_t const **data_ptr,
52+
int32_t const **buffer_start, int *buffer_samples)
53+
{
54+
size_t buffer_size;
55+
int ret;
56+
57+
ret = source_get_data(source, req_size, (void const **)data_ptr,
58+
(void const **)buffer_start, &buffer_size);
59+
*buffer_samples = buffer_size >> 2;
60+
return ret;
61+
}
62+
EXPORT_SYMBOL(source_get_data_s32);
63+
3864
int source_release_data(struct sof_source *source, size_t free_size)
3965
{
4066
int ret;

0 commit comments

Comments
 (0)