summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/export/pcm_mixer.h4
-rw-r--r--firmware/target/mips/ingenic_jz47xx/codec-jz4740.c1
-rw-r--r--firmware/target/mips/ingenic_jz47xx/codec-jz4760.c1
-rw-r--r--firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c2
-rw-r--r--firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c2
5 files changed, 10 insertions, 0 deletions
diff --git a/firmware/export/pcm_mixer.h b/firmware/export/pcm_mixer.h
index b418a5d347..3d255a7345 100644
--- a/firmware/export/pcm_mixer.h
+++ b/firmware/export/pcm_mixer.h
@@ -30,6 +30,10 @@
#if CONFIG_CPU == PP5002
/* There's far less time to do mixing because HW FIFOs are short */
#define MIX_FRAME_SAMPLES 64
+#elif (CONFIG_CPU == JZ4760B) || (CONFIG_CPU == JZ4732)
+/* These MIPS32r1 targets have a very high interrupt latency, which
+ unfortunately causes a lot of audio underruns under even moderate load */
+#define MIX_FRAME_SAMPLES 2048
#elif (CONFIG_PLATFORM & PLATFORM_MAEMO5) || defined(DX50) || defined(DX90)
/* Maemo 5 needs 2048 samples for decent performance.
Otherwise the locking overhead inside gstreamer costs too much */
diff --git a/firmware/target/mips/ingenic_jz47xx/codec-jz4740.c b/firmware/target/mips/ingenic_jz47xx/codec-jz4740.c
index 702f3bb50e..a41f047026 100644
--- a/firmware/target/mips/ingenic_jz47xx/codec-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/codec-jz4740.c
@@ -267,6 +267,7 @@ void audiohw_postinit(void)
void audiohw_init(void)
{
+ __aic_play_lastsample(); /* on FIFO underflow */
i2s_codec_init();
}
diff --git a/firmware/target/mips/ingenic_jz47xx/codec-jz4760.c b/firmware/target/mips/ingenic_jz47xx/codec-jz4760.c
index bc4286fd6a..60bfecb08c 100644
--- a/firmware/target/mips/ingenic_jz47xx/codec-jz4760.c
+++ b/firmware/target/mips/ingenic_jz47xx/codec-jz4760.c
@@ -115,6 +115,7 @@ void audiohw_init(void)
__cpm_start_aic();
/* Init AIC */
+ __aic_play_lastsample(); /* on FIFO underflow. Versus 0.. */
__i2s_enable_sclk();
__i2s_external_codec();
__i2s_select_msbjustified();
diff --git a/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c b/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
index 00a2b22591..ef2597ae69 100644
--- a/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
@@ -137,6 +137,8 @@ void DMA_CALLBACK(DMA_AIC_TX_CHANNEL)(void)
void pcm_play_dma_start(const void *addr, size_t size)
{
+ pcm_play_dma_stop();
+
dma_enable();
set_dma(addr, size);
diff --git a/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c b/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c
index 59b086e4f8..098c28ecf5 100644
--- a/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c
+++ b/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c
@@ -128,6 +128,8 @@ void DMA_CALLBACK(DMA_AIC_TX_CHANNEL)(void)
void pcm_play_dma_start(const void *addr, size_t size)
{
+ pcm_play_dma_stop();
+
__dmac_channel_enable_clk(DMA_AIC_TX_CHANNEL);
set_dma(addr, size);