mirror of https://github.com/thesofproject/sof.git
audio_stream: Create wrapping function
In source code there are places where are implemented pointer wrapping by hand, what looks quite complicated for a first eye catch and is messy because of pointer type casting. Using as_wrap is very well descriptive method and consist with DRY principle. as_get_frag has been changed to preprocessor function as it is just moving given pointer and wrapping result. Signed-off-by: Karol Trzcinski <karolx.trzcinski@linux.intel.com>
This commit is contained in:
parent
9508d2efbd
commit
e9a9e87af0
|
@ -58,17 +58,17 @@ struct audio_stream {
|
||||||
#define audio_stream_write_frag_s32(buffer, idx) \
|
#define audio_stream_write_frag_s32(buffer, idx) \
|
||||||
audio_stream_get_frag(buffer, buffer->w_ptr, idx, sizeof(int32_t))
|
audio_stream_get_frag(buffer, buffer->w_ptr, idx, sizeof(int32_t))
|
||||||
|
|
||||||
static inline void *audio_stream_get_frag(const struct audio_stream *buffer,
|
#define audio_stream_get_frag(buffer, ptr, idx, sample_size) \
|
||||||
const void *ptr, uint32_t idx, uint32_t size)
|
audio_stream_wrap(buffer, (char *)(ptr) + ((idx) * (sample_size)))
|
||||||
|
|
||||||
|
static inline void *audio_stream_wrap(const struct audio_stream *buffer,
|
||||||
|
void *ptr)
|
||||||
{
|
{
|
||||||
void *current = (char *)ptr + (idx * size);
|
if (ptr >= buffer->end_addr)
|
||||||
|
ptr = (char *)buffer->addr +
|
||||||
|
((char *)ptr - (char *)buffer->end_addr);
|
||||||
|
|
||||||
/* check for pointer wrap */
|
return ptr;
|
||||||
if (current >= buffer->end_addr)
|
|
||||||
current = (char *)buffer->addr +
|
|
||||||
((char *)current - (char *)buffer->end_addr);
|
|
||||||
|
|
||||||
return current;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the max number of bytes that can be copied between sink and source */
|
/* get the max number of bytes that can be copied between sink and source */
|
||||||
|
@ -144,12 +144,12 @@ audio_stream_avail_frames(const struct audio_stream *source,
|
||||||
static inline void audio_stream_produce(struct audio_stream *buffer,
|
static inline void audio_stream_produce(struct audio_stream *buffer,
|
||||||
uint32_t bytes)
|
uint32_t bytes)
|
||||||
{
|
{
|
||||||
buffer->w_ptr = (char *)buffer->w_ptr + bytes;
|
buffer->w_ptr = audio_stream_wrap(buffer,
|
||||||
|
(char *)buffer->w_ptr + bytes);
|
||||||
|
|
||||||
/* check for pointer wrap */
|
/* "overwrite" old data in circular wrap case */
|
||||||
if (buffer->w_ptr >= buffer->end_addr)
|
if (bytes > buffer->free)
|
||||||
buffer->w_ptr = (char *)buffer->addr +
|
buffer->r_ptr = buffer->w_ptr;
|
||||||
((char *)buffer->w_ptr - (char *)buffer->end_addr);
|
|
||||||
|
|
||||||
/* calculate available bytes */
|
/* calculate available bytes */
|
||||||
if (buffer->r_ptr < buffer->w_ptr)
|
if (buffer->r_ptr < buffer->w_ptr)
|
||||||
|
@ -168,12 +168,8 @@ static inline void audio_stream_produce(struct audio_stream *buffer,
|
||||||
static inline void audio_stream_consume(struct audio_stream *buffer,
|
static inline void audio_stream_consume(struct audio_stream *buffer,
|
||||||
uint32_t bytes)
|
uint32_t bytes)
|
||||||
{
|
{
|
||||||
buffer->r_ptr = (char *)buffer->r_ptr + bytes;
|
buffer->r_ptr = audio_stream_wrap(buffer,
|
||||||
|
(char *)buffer->r_ptr + bytes);
|
||||||
/* check for pointer wrap */
|
|
||||||
if (buffer->r_ptr >= buffer->end_addr)
|
|
||||||
buffer->r_ptr = (char *)buffer->addr +
|
|
||||||
((char *)buffer->r_ptr - (char *)buffer->end_addr);
|
|
||||||
|
|
||||||
/* calculate available bytes */
|
/* calculate available bytes */
|
||||||
if (buffer->r_ptr < buffer->w_ptr)
|
if (buffer->r_ptr < buffer->w_ptr)
|
||||||
|
|
|
@ -208,11 +208,7 @@ void dma_buffer_copy_from(struct comp_buffer *source, uint32_t source_bytes,
|
||||||
process(istream, &sink->stream, samples);
|
process(istream, &sink->stream, samples);
|
||||||
|
|
||||||
istream->r_ptr = (char *)istream->r_ptr + source_bytes;
|
istream->r_ptr = (char *)istream->r_ptr + source_bytes;
|
||||||
|
istream->r_ptr = audio_stream_wrap(istream, istream->r_ptr);
|
||||||
/* check for pointer wrap */
|
|
||||||
if (istream->r_ptr >= istream->end_addr)
|
|
||||||
istream->r_ptr = (char *)istream->addr +
|
|
||||||
((char *)istream->r_ptr - (char *)istream->end_addr);
|
|
||||||
|
|
||||||
comp_update_buffer_produce(sink, sink_bytes);
|
comp_update_buffer_produce(sink, sink_bytes);
|
||||||
}
|
}
|
||||||
|
@ -239,11 +235,7 @@ void dma_buffer_copy_to(struct comp_buffer *source, uint32_t source_bytes,
|
||||||
dcache_writeback_region(ostream->addr, tail);
|
dcache_writeback_region(ostream->addr, tail);
|
||||||
|
|
||||||
ostream->w_ptr = (char *)ostream->w_ptr + sink_bytes;
|
ostream->w_ptr = (char *)ostream->w_ptr + sink_bytes;
|
||||||
|
ostream->w_ptr = audio_stream_wrap(ostream, ostream->w_ptr);
|
||||||
/* check for pointer wrap */
|
|
||||||
if (ostream->w_ptr >= ostream->end_addr)
|
|
||||||
ostream->w_ptr = (char *)ostream->addr +
|
|
||||||
((char *)ostream->w_ptr - (char *)ostream->end_addr);
|
|
||||||
|
|
||||||
comp_update_buffer_consume(source, source_bytes);
|
comp_update_buffer_consume(source, source_bytes);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue