Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 22 additions & 4 deletions src/audio/dai.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,10 @@ static void dai_dma_cb(void *arg, enum notify_id type, void *data)
struct comp_dev *dev = arg;
struct dai_data *dd = comp_get_drvdata(dev);
uint32_t bytes = next->elem.size;
struct comp_buffer *source;
struct comp_buffer *sink;
void *buffer_ptr;
int ret;

comp_dbg(dev, "dai_dma_cb()");

Expand All @@ -99,17 +102,32 @@ static void dai_dma_cb(void *arg, enum notify_id type, void *data)
}

if (dev->direction == SOF_IPC_STREAM_PLAYBACK) {
dma_buffer_copy_to(dd->local_buffer, dd->dma_buffer,
dd->process, bytes);
ret = dma_buffer_copy_to(dd->local_buffer, dd->dma_buffer,
dd->process, bytes);

buffer_ptr = dd->local_buffer->stream.r_ptr;
} else {
dma_buffer_copy_from(dd->dma_buffer, dd->local_buffer,
dd->process, bytes);
ret = dma_buffer_copy_from(dd->dma_buffer, dd->local_buffer,
dd->process, bytes);

buffer_ptr = dd->local_buffer->stream.w_ptr;
}

/* assert dma_buffer_copy succeed */
if (ret < 0) {
source = dev->direction == SOF_IPC_STREAM_PLAYBACK ?
dd->local_buffer : dd->dma_buffer;
sink = dev->direction == SOF_IPC_STREAM_PLAYBACK ?
dd->dma_buffer : dd->local_buffer;
comp_err(dev, "dai_dma_cb() dma buffer copy failed, dir %d bytes %d avail %d free %d",
dev->direction, bytes,
audio_stream_get_avail_samples(&source->stream) *
audio_stream_frame_bytes(&source->stream),
audio_stream_get_free_samples(&sink->stream) *
audio_stream_frame_bytes(&sink->stream));
return;
}

/* update host position (in bytes offset) for drivers */
dev->position += bytes;
if (dd->dai_pos) {
Expand Down
27 changes: 23 additions & 4 deletions src/audio/host.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,13 +130,32 @@ static uint32_t host_dma_get_split(struct host_data *hd, uint32_t bytes)
static void host_update_position(struct comp_dev *dev, uint32_t bytes)
{
struct host_data *hd = comp_get_drvdata(dev);
struct comp_buffer *source;
struct comp_buffer *sink;
int ret;


if (dev->direction == SOF_IPC_STREAM_PLAYBACK)
dma_buffer_copy_from(hd->dma_buffer, hd->local_buffer,
hd->process, bytes);
ret = dma_buffer_copy_from(hd->dma_buffer, hd->local_buffer,
hd->process, bytes);
else
dma_buffer_copy_to(hd->local_buffer, hd->dma_buffer,
hd->process, bytes);
ret = dma_buffer_copy_to(hd->local_buffer, hd->dma_buffer,
hd->process, bytes);

/* assert dma_buffer_copy succeed */
if (ret < 0) {
source = dev->direction == SOF_IPC_STREAM_PLAYBACK ?
hd->dma_buffer : hd->local_buffer;
sink = dev->direction == SOF_IPC_STREAM_PLAYBACK ?
hd->local_buffer : hd->dma_buffer;
comp_err(dev, "host_update_position() dma buffer copy failed, dir %d bytes %d avail %d free %d",
dev->direction, bytes,
audio_stream_get_avail_samples(&source->stream) *
audio_stream_frame_bytes(&source->stream),
audio_stream_get_free_samples(&sink->stream) *
audio_stream_frame_bytes(&sink->stream));
return;
}

dev->position += bytes;

Expand Down
15 changes: 10 additions & 5 deletions src/audio/pcm_converter/pcm_converter.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
#include <sof/audio/pcm_converter.h>
#include <sof/debug/panic.h>

void pcm_convert_as_linear(const struct audio_stream *source, uint32_t ioffset,
struct audio_stream *sink, uint32_t ooffset,
uint32_t samples, pcm_converter_lin_func converter)
int pcm_convert_as_linear(const struct audio_stream *source, uint32_t ioffset,
struct audio_stream *sink, uint32_t ooffset,
uint32_t samples, pcm_converter_lin_func converter)
{
const int s_size_in = audio_stream_sample_bytes(source);
const int s_size_out = audio_stream_sample_bytes(sink);
Expand All @@ -30,8 +30,11 @@ void pcm_convert_as_linear(const struct audio_stream *source, uint32_t ioffset,
int chunk;
int N1, N2;

assert(audio_stream_get_avail_samples(source) >= samples + ioffset);
assert(audio_stream_get_free_samples(sink) >= samples + ooffset);
/* assert enough avail/free samples in source and sink buffer */
if (audio_stream_get_avail_samples(source) < samples + ioffset)
return -EINVAL;
Comment thread
lgirdwood marked this conversation as resolved.
Resolved
if (audio_stream_get_free_samples(sink) < samples + ooffset)
return -EINVAL;

while (i < samples) {
/* calculate chunk size */
Expand All @@ -51,4 +54,6 @@ void pcm_convert_as_linear(const struct audio_stream *source, uint32_t ioffset,
w_ptr = audio_stream_wrap(sink, w_ptr + chunk * s_size_out);
i += chunk;
}

return samples;
}
108 changes: 60 additions & 48 deletions src/audio/pcm_converter/pcm_converter_generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@

#if CONFIG_FORMAT_S16LE && CONFIG_FORMAT_S24LE

static void pcm_convert_s16_to_s24(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_s16_to_s24(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
uint32_t buff_frag = 0;
int16_t *src;
Expand All @@ -41,11 +41,13 @@ static void pcm_convert_s16_to_s24(const struct audio_stream *source,
*dst = *src << 8;
buff_frag++;
}

return samples;
}

static void pcm_convert_s24_to_s16(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_s24_to_s16(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
uint32_t buff_frag = 0;
int32_t *src;
Expand All @@ -58,15 +60,17 @@ static void pcm_convert_s24_to_s16(const struct audio_stream *source,
*dst = sat_int16(Q_SHIFT_RND(sign_extend_s24(*src), 23, 15));
buff_frag++;
}

return samples;
}

#endif /* CONFIG_FORMAT_S16LE && CONFIG_FORMAT_S24LE */

#if CONFIG_FORMAT_S16LE && CONFIG_FORMAT_S32LE

static void pcm_convert_s16_to_s32(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_s16_to_s32(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
uint32_t buff_frag = 0;
int16_t *src;
Expand All @@ -79,11 +83,13 @@ static void pcm_convert_s16_to_s32(const struct audio_stream *source,
*dst = *src << 16;
buff_frag++;
}

return samples;
}

static void pcm_convert_s32_to_s16(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_s32_to_s16(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
uint32_t buff_frag = 0;
int32_t *src;
Expand All @@ -96,15 +102,17 @@ static void pcm_convert_s32_to_s16(const struct audio_stream *source,
*dst = sat_int16(Q_SHIFT_RND(*src, 31, 15));
buff_frag++;
}

return samples;
}

#endif /* CONFIG_FORMAT_S16LE && CONFIG_FORMAT_S32LE */

#if CONFIG_FORMAT_S24LE && CONFIG_FORMAT_S32LE

static void pcm_convert_s24_to_s32(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_s24_to_s32(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
uint32_t buff_frag = 0;
int32_t *src;
Expand All @@ -117,11 +125,13 @@ static void pcm_convert_s24_to_s32(const struct audio_stream *source,
*dst = *src << 8;
buff_frag++;
}

return samples;
}

static void pcm_convert_s32_to_s24(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_s32_to_s24(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
uint32_t buff_frag = 0;
int32_t *src;
Expand All @@ -134,6 +144,8 @@ static void pcm_convert_s32_to_s24(const struct audio_stream *source,
*dst = sat_int24(Q_SHIFT_RND(*src, 31, 23));
buff_frag++;
}

return samples;
}

#endif /* CONFIG_FORMAT_S24LE && CONFIG_FORMAT_S32LE */
Expand Down Expand Up @@ -272,20 +284,20 @@ static void pcm_convert_f_to_s16_lin(const void *psrc, void *pdst,
dst[i] = sat_int16(_pcm_convert_f_to_i(src[i], 15));
}

static void pcm_convert_s16_to_f(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_s16_to_f(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_s16_to_f_lin);
return pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_s16_to_f_lin);
}

static void pcm_convert_f_to_s16(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_f_to_s16(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_f_to_s16_lin);
return pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_f_to_s16_lin);
}
#endif /* CONFIG_FORMAT_FLOAT && CONFIG_FORMAT_S16LE */

Expand Down Expand Up @@ -316,20 +328,20 @@ static void pcm_convert_f_to_s24_lin(const void *psrc, void *pdst,
dst[i] = sat_int24(_pcm_convert_f_to_i(src[i], 23));
}

static void pcm_convert_s24_to_f(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_s24_to_f(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_s24_to_f_lin);
return pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_s24_to_f_lin);
}

static void pcm_convert_f_to_s24(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_f_to_s24(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_f_to_s24_lin);
return pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_f_to_s24_lin);
}
#endif /* CONFIG_FORMAT_FLOAT && CONFIG_FORMAT_S24LE */

Expand Down Expand Up @@ -360,20 +372,20 @@ static void pcm_convert_f_to_s32_lin(const void *psrc, void *pdst,
dst[i] = _pcm_convert_f_to_i(src[i], 31);
}

static void pcm_convert_s32_to_f(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_s32_to_f(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_s32_to_f_lin);
return pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_s32_to_f_lin);
}

static void pcm_convert_f_to_s32(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
static int pcm_convert_f_to_s32(const struct audio_stream *source,
uint32_t ioffset, struct audio_stream *sink,
uint32_t ooffset, uint32_t samples)
{
pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_f_to_s32_lin);
return pcm_convert_as_linear(source, ioffset, sink, ooffset, samples,
pcm_convert_f_to_s32_lin);
}
#endif /* CONFIG_FORMAT_FLOAT && CONFIG_FORMAT_S32LE */

Expand Down
Loading