mailman.alsa-project.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

Sound-open-firmware

Thread Start a new thread
Download
Threads by month
  • ----- 2025 -----
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
sound-open-firmware@alsa-project.org

January 2017

  • 2 participants
  • 5 discussions
[Sound-open-firmware] [PATCH] volume: fix the L/R channel mixed issue
by Keyon Jie 11 Jan '17

11 Jan '17
The Right channel was assigned with Left channel by mistake in vol_s16_to_s32 and vol_s32_to_s32, here correct it. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/audio/volume.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/audio/volume.c b/src/audio/volume.c index 65c41b9..24a9d11 100644 --- a/src/audio/volume.c +++ b/src/audio/volume.c @@ -91,7 +91,7 @@ static void vol_s16_to_s32(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]; - dest[i + 1] = (int32_t)src[i] * cd->volume[1]; + dest[i + 1] = (int32_t)src[i + 1] * cd->volume[1]; } source->r_ptr = src + i; @@ -127,7 +127,7 @@ static void vol_s32_to_s32(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] = ((int64_t)src[i] * cd->volume[0]) >> 16; - dest[i + 1] = ((int64_t)src[i] * cd->volume[1]) >> 16; + dest[i + 1] = ((int64_t)src[i + 1] * cd->volume[1]) >> 16; } source->r_ptr = src + i; -- 2.5.0
2 1
0 0
[Sound-open-firmware] [PATCH] component: fix comp_update_buffer() when buffer full
by Keyon Jie 10 Jan '17

10 Jan '17
It will treat full buffer as empty one at current comp_update_buffer(), as w_ptr is equal to r_ptr, this will make us missing those datas or at least the buffer->avail/free are not correct. Here spit comp_update_buffer() into consuming one and producing one, for consuming, 'r_ptr == w_ptr' update means buffer is becoming empty, and for producing, 'w_ptr == r_ptr' means buffer is becoming full. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/audio/dai.c | 8 +++++--- src/audio/host.c | 4 ++-- src/audio/mixer.c | 4 ++-- src/audio/volume.c | 4 ++-- src/include/reef/audio/component.h | 18 ++++++++++++++++-- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/audio/dai.c b/src/audio/dai.c index 64e4761..ab0164c 100644 --- a/src/audio/dai.c +++ b/src/audio/dai.c @@ -98,6 +98,8 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next) *dd->dai_pos = dd->dai_pos_blks + dma_buffer->r_ptr - dma_buffer->addr; + /* recalc available buffer space */ + comp_update_buffer_consume(dma_buffer); } else { dma_buffer = list_first_item(&dev->bsink_list, struct comp_buffer, source_list); @@ -119,10 +121,10 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next) if (dd->dai_pos) *dd->dai_pos = dd->dai_pos_blks + dma_buffer->w_ptr - dma_buffer->addr; - } - /* recalc available buffer space */ - comp_update_buffer(dma_buffer); + /* recalc available buffer space */ + comp_update_buffer_produce(dma_buffer); + } /* notify pipeline that DAI needs it's buffer filled */ // if (dev->state == COMP_STATE_RUNNING) diff --git a/src/audio/host.c b/src/audio/host.c index fe43cf8..217ad4f 100644 --- a/src/audio/host.c +++ b/src/audio/host.c @@ -130,7 +130,7 @@ static void host_dma_cb_playback(struct comp_dev *dev, #endif /* recalc available buffer space */ - comp_update_buffer(hd->dma_buffer); + comp_update_buffer_consume(hd->dma_buffer); /* new local period, update host buffer position blks */ hd->host_pos_blks += local_elem->size; @@ -236,7 +236,7 @@ static void host_dma_cb_capture(struct comp_dev *dev, *hd->host_pos = hd->host_pos_blks; /* recalc available buffer space */ - comp_update_buffer(hd->dma_buffer); + comp_update_buffer_produce(hd->dma_buffer); /* send IPC message to driver if needed */ hd->host_period_pos += local_elem->size; diff --git a/src/audio/mixer.c b/src/audio/mixer.c index b996dae..3a8d12f 100644 --- a/src/audio/mixer.c +++ b/src/audio/mixer.c @@ -230,13 +230,13 @@ static int mixer_copy(struct comp_dev *dev) for(; i > 0; i--) { if (sources[i-1]->r_ptr >= sources[i-1]->end_addr) sources[i-1]->r_ptr = sources[i-1]->addr; - comp_update_buffer(sources[i-1]); + comp_update_buffer_consume(sources[i-1]); } if (sink->w_ptr >= sink->end_addr) sink->w_ptr = sink->addr; /* calc new free and available */ - comp_update_buffer(sink); + comp_update_buffer_produce(sink); /* number of frames sent downstream */ return cframes; diff --git a/src/audio/volume.c b/src/audio/volume.c index e2badb8..75a48f9 100644 --- a/src/audio/volume.c +++ b/src/audio/volume.c @@ -460,8 +460,8 @@ static int volume_copy(struct comp_dev *dev) sink->w_ptr = sink->addr; /* calc new free and available */ - comp_update_buffer(sink); - comp_update_buffer(source); + comp_update_buffer_produce(sink); + comp_update_buffer_consume(source); /* number of frames sent downstream */ return cframes; diff --git a/src/include/reef/audio/component.h b/src/include/reef/audio/component.h index fbd29e4..e521753 100644 --- a/src/include/reef/audio/component.h +++ b/src/include/reef/audio/component.h @@ -311,10 +311,24 @@ void sys_comp_mux_init(void); void sys_comp_switch_init(void); void sys_comp_volume_init(void); -static inline void comp_update_buffer(struct comp_buffer *buffer) +static inline void comp_update_buffer_produce(struct comp_buffer *buffer) { - if (buffer->r_ptr <= buffer->w_ptr) + if (buffer->r_ptr < buffer->w_ptr) buffer->avail = buffer->w_ptr - buffer->r_ptr; + else if (buffer->r_ptr == buffer->w_ptr) + buffer->avail = buffer->end_addr - buffer->addr; /* full */ + else + buffer->avail = buffer->end_addr - buffer->r_ptr + + buffer->w_ptr - buffer->addr; + buffer->free = buffer->desc.size - buffer->avail; +} + +static inline void comp_update_buffer_consume(struct comp_buffer *buffer) +{ + if (buffer->r_ptr < buffer->w_ptr) + buffer->avail = buffer->w_ptr - buffer->r_ptr; + else if (buffer->r_ptr == buffer->w_ptr) + buffer->avail = 0; /* empty */ else buffer->avail = buffer->end_addr - buffer->r_ptr + buffer->w_ptr - buffer->addr; -- 2.7.4
2 1
0 0
[Sound-open-firmware] [PATCH] volume: use rzalloc for component new
by Keyon Jie 10 Jan '17

10 Jan '17
Replace rmalloc() with rzalloc() to make sure the new allocated structs are clear to all 0s. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/audio/volume.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/audio/volume.c b/src/audio/volume.c index e2badb8..4b5b2e3 100644 --- a/src/audio/volume.c +++ b/src/audio/volume.c @@ -306,11 +306,11 @@ static struct comp_dev *volume_new(uint32_t type, uint32_t index, struct comp_data *cd; int i; - dev = rmalloc(RZONE_MODULE, RMOD_SYS, sizeof(*dev)); + dev = rzalloc(RZONE_MODULE, RMOD_SYS, sizeof(*dev)); if (dev == NULL) return NULL; - cd = rmalloc(RZONE_MODULE, RMOD_SYS, sizeof(*cd)); + cd = rzalloc(RZONE_MODULE, RMOD_SYS, sizeof(*cd)); if (cd == NULL) { rfree(RZONE_MODULE, RMOD_SYS, dev); return NULL; -- 2.5.0
2 1
0 0
[Sound-open-firmware] [PATCH] dai: rename frame_size in dai_config to sample_size
by Keyon Jie 03 Jan '17

03 Jan '17
The element frame_size in dai_config struct is actually sample size for each channel, e.g. 24 for S24_4LE, so rename it to sample_size to avoid confusion. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/drivers/ssp.c | 12 ++++++------ src/include/reef/dai.h | 2 +- src/ipc/intel-ipc.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/drivers/ssp.c b/src/drivers/ssp.c index c285af3..2b5b89e 100644 --- a/src/drivers/ssp.c +++ b/src/drivers/ssp.c @@ -260,8 +260,8 @@ static inline int ssp_set_config(struct dai *dai, struct dai_config *dai_config) case DAI_FMT_I2S: sscr0 |= SSCR0_PSP; sscr1 |= SSCR1_TRAIL; - sspsp |= SSPSP_SFRMWDTH(dai->config.frame_size + 1); - sspsp |= SSPSP_SFRMDLY((dai->config.frame_size + 1) * 2); + sspsp |= SSPSP_SFRMWDTH(dai->config.sample_size + 1); + sspsp |= SSPSP_SFRMDLY((dai->config.sample_size + 1) * 2); sspsp |= SSPSP_DMYSTRT(1); break; case DAI_FMT_DSP_A: @@ -274,11 +274,11 @@ static inline int ssp_set_config(struct dai *dai, struct dai_config *dai_config) return -EINVAL; } - /* frame size */ - if (dai->config.frame_size > 16) - sscr0 |= (SSCR0_EDSS | SSCR0_DSIZE(dai->config.frame_size - 16)); + /* sample size */ + if (dai->config.sample_size > 16) + sscr0 |= (SSCR0_EDSS | SSCR0_DSIZE(dai->config.sample_size - 16)); else - sscr0 |= SSCR0_DSIZE(dai->config.frame_size); + sscr0 |= SSCR0_DSIZE(dai->config.sample_size); /* watermarks - TODO: do we still need old sscr1 method ?? */ sscr1 |= (SSCR1_TX(4) | SSCR1_RX(4)); diff --git a/src/include/reef/dai.h b/src/include/reef/dai.h index cfcc428..5e301e1 100644 --- a/src/include/reef/dai.h +++ b/src/include/reef/dai.h @@ -100,7 +100,7 @@ struct dai_slot_map { /* DAI runtime hardware configuration */ struct dai_config { uint32_t format; - uint32_t frame_size; /* in BCLKs */ + uint32_t sample_size; /* in BCLKs */ struct dai_slot_map tx_slot_map[DAI_NUM_SLOT_MAPS]; struct dai_slot_map rx_slot_map[DAI_NUM_SLOT_MAPS]; uint32_t bclk; /* BCLK frequency in Hz */ diff --git a/src/ipc/intel-ipc.c b/src/ipc/intel-ipc.c index bfffaf6..127541d 100644 --- a/src/ipc/intel-ipc.c +++ b/src/ipc/intel-ipc.c @@ -565,7 +565,7 @@ static uint32_t ipc_device_set_formats(uint32_t header) dai_dev->dai_config.mclk = config_req.clock_frequency; dai_dev->dai_config.format = DAI_FMT_I2S | DAI_FMT_CONT | DAI_FMT_NB_NF | DAI_FMT_CBS_CFS; - dai_dev->dai_config.frame_size = 24; /* really sample size */ + dai_dev->dai_config.sample_size = 24; dai_dev->dai_config.bclk = 2400000; dai_dev->dai_config.mclk = 19200000; dai_dev->dai_config.clk_src = SSP_CLK_EXT; -- 2.7.4
2 1
0 0
[Sound-open-firmware] [PATCH 1/3] volume: add 24bit<==>32bit scaler and mapping
by Keyon Jie 03 Jan '17

03 Jan '17
As we are using 32 bits data in internal buffer, we need 24bit<==>32bit volume scaler for host<==>processing<==>dai converting. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/audio/volume.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/audio/volume.c b/src/audio/volume.c index d457632..e2badb8 100644 --- a/src/audio/volume.c +++ b/src/audio/volume.c @@ -191,6 +191,44 @@ static void vol_s24_to_s16(struct comp_dev *dev, struct comp_buffer *sink, sink->w_ptr = dest + i; } +/* copy and scale volume from 32 bit source buffer to 24 bit on 32 bit boundary dest buffer */ +static void vol_s32_to_s24(struct comp_dev *dev, struct comp_buffer *sink, + struct comp_buffer *source, uint32_t frames) +{ + struct comp_data *cd = comp_get_drvdata(dev); + int32_t *src = (int32_t*) source->r_ptr; + int32_t i, *dest = (int32_t*) sink->w_ptr; + + /* buffer sizes are always divisible by period frames */ + for (i = 0; i < frames * 2; i += 2) { + dest[i] = ((int64_t)src[i] * cd->volume[0]) >> 24; + dest[i + 1] = ((int64_t)src[i + 1] * cd->volume[1]) >> 24; + } + + source->r_ptr = src + i; + sink->w_ptr = dest + i; +} + +/* copy and scale volume from 16 bit source buffer to 24 bit on 32 bit boundary dest buffer */ +static void vol_s24_to_s32(struct comp_dev *dev, struct comp_buffer *sink, + struct comp_buffer *source, uint32_t frames) +{ + struct comp_data *cd = comp_get_drvdata(dev); + int32_t i, *src = (int32_t*) source->r_ptr; + int32_t *dest = (int32_t*) sink->w_ptr; + + /* buffer sizes are always divisible by period frames */ + for (i = 0; i < frames * 2; i += 2) { + dest[i] = (int32_t)(((int64_t)src[i] * + cd->volume[0]) >> 8); + dest[i + 1] = (int32_t)(((int64_t)src[i + 1] * + cd->volume[1]) >> 8); + } + + source->r_ptr = src + i; + sink->w_ptr = dest + i; +} + /* map of source and sink buffer formats to volume function */ static const struct comp_func_map func_map[] = { {STREAM_FORMAT_S16_LE, STREAM_FORMAT_S16_LE, 2, vol_s16_to_s16}, @@ -199,6 +237,8 @@ static const struct comp_func_map func_map[] = { {STREAM_FORMAT_S32_LE, STREAM_FORMAT_S32_LE, 2, vol_s32_to_s32}, {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}, + {STREAM_FORMAT_S32_LE, STREAM_FORMAT_S24_4LE, 2, vol_s32_to_s24}, + {STREAM_FORMAT_S24_4LE, STREAM_FORMAT_S32_LE, 2, vol_s24_to_s32}, }; static void vol_update(struct comp_data *cd, uint32_t chan) @@ -447,7 +487,7 @@ static int volume_prepare(struct comp_dev *dev) /* 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; + sink_format = sink->params.pcm.format; else sink_format = STREAM_FORMAT_S32_LE; -- 2.7.4
2 3
0 0

HyperKitty Powered by HyperKitty version 1.3.8.