From 40046a2d2546bb5cdf3446b8ea035d92c72bc272 Mon Sep 17 00:00:00 2001 From: Seppo Ingalsuo Date: Fri, 17 Dec 2021 15:45:15 +0200 Subject: [PATCH] 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 --- src/audio/component.c | 65 +++++++++++++++++ src/include/sof/audio/audio_stream.h | 72 ++----------------- .../src/audio/pcm_converter/CMakeLists.txt | 1 + 3 files changed, 72 insertions(+), 66 deletions(-) diff --git a/src/audio/component.c b/src/audio/component.c index 051e7dfaa..f6d0daf8b 100644 --- a/src/audio/component.c +++ b/src/audio/component.c @@ -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; + } +} diff --git a/src/include/sof/audio/audio_stream.h b/src/include/sof/audio/audio_stream.h index 3f7e11ea4..56e2934ea 100644 --- a/src/include/sof/audio/audio_stream.h +++ b/src/include/sof/audio/audio_stream.h @@ -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. diff --git a/test/cmocka/src/audio/pcm_converter/CMakeLists.txt b/test/cmocka/src/audio/pcm_converter/CMakeLists.txt index 14ef419da..df08e29e2 100644 --- a/test/cmocka/src/audio/pcm_converter/CMakeLists.txt +++ b/test/cmocka/src/audio/pcm_converter/CMakeLists.txt @@ -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