Audio: Move audio stream copy inline functions to component.c

This patch moves functions audio_stream_copy(),
audio_stream_copy_from_linear(), and audio_stream_copy_to_linear()
into component.c. The functions are not changed.

There is no measurable code execution time
increase. In a test build this change saved about 800 bytes.

Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
This commit is contained in:
Seppo Ingalsuo 2021-12-17 15:45:15 +02:00 committed by Liam Girdwood
parent 3d6b7c5730
commit 40046a2d25
3 changed files with 72 additions and 66 deletions

View File

@ -471,3 +471,68 @@ struct comp_dev *comp_make_shared(struct comp_dev *dev)
return dev;
}
int audio_stream_copy(const struct audio_stream *source, uint32_t ioffset,
struct audio_stream *sink, uint32_t ooffset, uint32_t samples)
{
int ssize = audio_stream_sample_bytes(source); /* src fmt == sink fmt */
uint8_t *src = audio_stream_wrap(source, (uint8_t *)source->r_ptr + ioffset * ssize);
uint8_t *snk = audio_stream_wrap(sink, (uint8_t *)sink->w_ptr + ooffset * ssize);
size_t bytes = samples * ssize;
size_t bytes_src;
size_t bytes_snk;
size_t bytes_copied;
while (bytes) {
bytes_src = audio_stream_bytes_without_wrap(source, src);
bytes_snk = audio_stream_bytes_without_wrap(sink, snk);
bytes_copied = MIN(bytes_src, bytes_snk);
bytes_copied = MIN(bytes, bytes_copied);
memcpy(snk, src, bytes_copied);
bytes -= bytes_copied;
src = audio_stream_wrap(source, src + bytes_copied);
snk = audio_stream_wrap(sink, snk + bytes_copied);
}
return samples;
}
void audio_stream_copy_from_linear(void *linear_source, int ioffset,
struct audio_stream *sink, int ooffset, unsigned int samples)
{
int ssize = audio_stream_sample_bytes(sink); /* src fmt == sink fmt */
uint8_t *src = (uint8_t *)linear_source + ioffset * ssize;
uint8_t *snk = audio_stream_wrap(sink, (uint8_t *)sink->w_ptr + ooffset * ssize);
size_t bytes = samples * ssize;
size_t bytes_snk;
size_t bytes_copied;
while (bytes) {
bytes_snk = audio_stream_bytes_without_wrap(sink, snk);
bytes_copied = MIN(bytes, bytes_snk);
memcpy(snk, src, bytes_copied);
bytes -= bytes_copied;
src += bytes_copied;
snk = audio_stream_wrap(sink, snk + bytes_copied);
}
}
void audio_stream_copy_to_linear(struct audio_stream *source, int ioffset,
void *linear_sink, int ooffset, unsigned int samples)
{
int ssize = audio_stream_sample_bytes(source); /* src fmt == sink fmt */
uint8_t *src = audio_stream_wrap(source, (uint8_t *)source->r_ptr + ioffset * ssize);
uint8_t *snk = (uint8_t *)linear_sink + ooffset * ssize;
size_t bytes = samples * ssize;
size_t bytes_src;
size_t bytes_copied;
while (bytes) {
bytes_src = audio_stream_bytes_without_wrap(source, src);
bytes_copied = MIN(bytes, bytes_src);
memcpy(snk, src, bytes_copied);
bytes -= bytes_copied;
src = audio_stream_wrap(source, src + bytes_copied);
snk += bytes_copied;
}
}

View File

@ -555,32 +555,8 @@ audio_stream_frames_without_wrap(const struct audio_stream *source,
* @param samples Number of samples to copy.
* @return number of processed samples.
*/
static inline int audio_stream_copy(const struct audio_stream *source,
uint32_t ioffset,
struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
int ssize = audio_stream_sample_bytes(source); /* src fmt == sink fmt */
uint8_t *src = audio_stream_wrap(source, (uint8_t *)source->r_ptr + ioffset * ssize);
uint8_t *snk = audio_stream_wrap(sink, (uint8_t *)sink->w_ptr + ooffset * ssize);
size_t bytes = samples * ssize;
size_t bytes_src;
size_t bytes_snk;
size_t bytes_copied;
while (bytes) {
bytes_src = audio_stream_bytes_without_wrap(source, src);
bytes_snk = audio_stream_bytes_without_wrap(sink, snk);
bytes_copied = MIN(bytes_src, bytes_snk);
bytes_copied = MIN(bytes, bytes_copied);
memcpy(snk, src, bytes_copied);
bytes -= bytes_copied;
src = audio_stream_wrap(source, src + bytes_copied);
snk = audio_stream_wrap(sink, snk + bytes_copied);
}
return samples;
}
int audio_stream_copy(const struct audio_stream *source, uint32_t ioffset,
struct audio_stream *sink, uint32_t ooffset, uint32_t samples);
/**
* Copies data from linear source buffer to circular sink buffer.
@ -590,26 +566,8 @@ static inline int audio_stream_copy(const struct audio_stream *source,
* @param ooffset Offset (in samples) in sink buffer to start writing to.
* @param samples Number of samples to copy.
*/
static inline void audio_stream_copy_from_linear(void *linear_source, int ioffset,
struct audio_stream *sink, int ooffset,
unsigned int samples)
{
int ssize = audio_stream_sample_bytes(sink); /* src fmt == sink fmt */
uint8_t *src = (uint8_t *)linear_source + ioffset * ssize;
uint8_t *snk = audio_stream_wrap(sink, (uint8_t *)sink->w_ptr + ooffset * ssize);
size_t bytes = samples * ssize;
size_t bytes_snk;
size_t bytes_copied;
while (bytes) {
bytes_snk = audio_stream_bytes_without_wrap(sink, snk);
bytes_copied = MIN(bytes, bytes_snk);
memcpy(snk, src, bytes_copied);
bytes -= bytes_copied;
src += bytes_copied;
snk = audio_stream_wrap(sink, snk + bytes_copied);
}
}
void audio_stream_copy_from_linear(void *linear_source, int ioffset,
struct audio_stream *sink, int ooffset, unsigned int samples);
/**
* Copies data from circular source buffer to linear sink buffer.
@ -619,26 +577,8 @@ static inline void audio_stream_copy_from_linear(void *linear_source, int ioffse
* @param ooffset Offset (in samples) in sink buffer to start writing to.
* @param samples Number of samples to copy.
*/
static inline void audio_stream_copy_to_linear(struct audio_stream *source, int ioffset,
void *linear_sink, int ooffset,
unsigned int samples)
{
int ssize = audio_stream_sample_bytes(source); /* src fmt == sink fmt */
uint8_t *src = audio_stream_wrap(source, (uint8_t *)source->r_ptr + ioffset * ssize);
uint8_t *snk = (uint8_t *)linear_sink + ooffset * ssize;
size_t bytes = samples * ssize;
size_t bytes_src;
size_t bytes_copied;
while (bytes) {
bytes_src = audio_stream_bytes_without_wrap(source, src);
bytes_copied = MIN(bytes, bytes_src);
memcpy(snk, src, bytes_copied);
bytes -= bytes_copied;
src = audio_stream_wrap(source, src + bytes_copied);
snk += bytes_copied;
}
}
void audio_stream_copy_to_linear(struct audio_stream *source, int ioffset,
void *linear_sink, int ooffset, unsigned int samples);
/**
* Writes zeros in range [w_ptr, w_ptr+bytes], with rollover if necessary.

View File

@ -6,6 +6,7 @@ if(CONFIG_FORMAT_FLOAT)
${PROJECT_SOURCE_DIR}/src/audio/pcm_converter/pcm_converter.c
${PROJECT_SOURCE_DIR}/src/audio/pcm_converter/pcm_converter_generic.c
${PROJECT_SOURCE_DIR}/src/audio/buffer.c
${PROJECT_SOURCE_DIR}/src/audio/component.c
${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c
${PROJECT_SOURCE_DIR}/test/cmocka/src/notifier_mocks.c
${PROJECT_SOURCE_DIR}/src/ipc/ipc-common.c