[Sound-open-firmware] [PATCH 2/4] volume: Fix R channel and select correct conversion.
Liam Girdwood
liam.r.girdwood at linux.intel.com
Wed Dec 28 17:29:12 CET 2016
The conversion should up/down convert only if source/sink is host or dai.
Volume should be 32 bit at all other times
Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
src/audio/volume.c | 28 +++++++++++++++++++++-------
1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/src/audio/volume.c b/src/audio/volume.c
index d797796..d457632 100644
--- a/src/audio/volume.c
+++ b/src/audio/volume.c
@@ -164,7 +164,7 @@ static void vol_s16_to_s24(struct comp_dev *dev, struct comp_buffer *sink,
/* buffer sizes are always divisible by period frames */
for (i = 0; i < frames * 2; i += 2) {
dest[i] = ((int32_t)src[i] * cd->volume[0]) >> 8;
- dest[i + 1] = ((int32_t)src[i + 1] * cd->volume[0]) >> 8;
+ dest[i + 1] = ((int32_t)src[i + 1] * cd->volume[1]) >> 8;
}
source->r_ptr = src + i;
@@ -184,7 +184,7 @@ static void vol_s24_to_s16(struct comp_dev *dev, struct comp_buffer *sink,
dest[i] = (int16_t)((((int32_t)src[i] >> 8) *
cd->volume[0]) >> 16);
dest[i + 1] = (int16_t)((((int32_t)src[i + 1] >> 8) *
- cd->volume[0]) >> 16);
+ cd->volume[1]) >> 16);
}
source->r_ptr = src + i;
@@ -197,8 +197,8 @@ static const struct comp_func_map func_map[] = {
{STREAM_FORMAT_S16_LE, STREAM_FORMAT_S32_LE, 2, vol_s16_to_s32},
{STREAM_FORMAT_S32_LE, STREAM_FORMAT_S16_LE, 2, vol_s32_to_s16},
{STREAM_FORMAT_S32_LE, STREAM_FORMAT_S32_LE, 2, vol_s32_to_s32},
- {STREAM_FORMAT_S16_LE, STREAM_FORMAT_S24_3LE, 2, vol_s16_to_s24},
- {STREAM_FORMAT_S24_3LE, STREAM_FORMAT_S16_LE, 2, vol_s24_to_s16},
+ {STREAM_FORMAT_S16_LE, STREAM_FORMAT_S24_4LE, 2, vol_s16_to_s24},
+ {STREAM_FORMAT_S24_4LE, STREAM_FORMAT_S16_LE, 2, vol_s24_to_s16},
};
static void vol_update(struct comp_data *cd, uint32_t chan)
@@ -397,7 +397,7 @@ static int volume_copy(struct comp_dev *dev)
{
struct comp_data *cd = comp_get_drvdata(dev);
struct comp_buffer *sink, *source;
- uint32_t cframes = PIPELINE_LL_FRAMES;
+ uint32_t cframes = PLAT_INT_PERIOD_FRAMES;
trace_comp("Vol");
@@ -431,18 +431,32 @@ static int volume_prepare(struct comp_dev *dev)
{
struct comp_data *cd = comp_get_drvdata(dev);
struct comp_buffer *sink, *source;
+ uint32_t source_format, sink_format;
int i;
/* volume components will only ever have 1 source and 1 sink buffer */
source = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list);
sink = list_first_item(&dev->bsink_list, struct comp_buffer, source_list);
+ /* is source a host or DAI ? */
+ if (source->source->is_host || source->source->is_dai)
+ source_format = source->params.pcm.format;
+ else
+ source_format = STREAM_FORMAT_S32_LE;
+
+ /* TODO tmp hard coded for 24 bit - need fixed for capture*/
+ /* is sink a host or DAI ? */
+ if (sink->sink->is_host || sink->sink->is_dai)
+ sink_format = STREAM_FORMAT_S24_4LE;//sink->params.pcm.format;
+ else
+ sink_format = STREAM_FORMAT_S32_LE;
+
/* map the volume function for source and sink buffers */
for (i = 0; i < ARRAY_SIZE(func_map); i++) {
- if (source->params.pcm.format != func_map[i].source)
+ if (source_format != func_map[i].source)
continue;
- if (sink->params.pcm.format != func_map[i].sink)
+ if (sink_format != func_map[i].sink)
continue;
if (sink->params.channels != func_map[i].channels)
continue;
--
2.9.3
More information about the Sound-open-firmware
mailing list