From 0b7a90722a7bf9ffe5cd75eb3990c57af17098d1 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Mon, 3 Feb 2014 12:43:05 +0100 Subject: [PATCH] talk: On hwcodec disabling DMA interrupt is required during buflib move Even though the DMA buffer itself does not move the ISR copies from a movable buffer into the static commit buffer. To ensure this copying yields consistent data it must not be interrupted by this ISR.. Also bump the commit buffer size to 2k, this should reduce the overhead considerably because many clips are smaller than that (especially on swcodec/speex). Change-Id: I4e1ab83074f31fc91b51a58baa1df55ce659ac73 --- apps/talk.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/talk.c b/apps/talk.c index 13f323f4b6..910f355ff9 100644 --- a/apps/talk.c +++ b/apps/talk.c @@ -207,6 +207,14 @@ static void sync_callback(int handle, bool sync_on) mutex_lock(&read_buffer_mutex); else mutex_unlock(&read_buffer_mutex); +#if CONFIG_CPU == SH7034 + /* DMA must not interrupt during buffer move or commit_buffer copies + * from inconsistent buflib buffer */ + if (sync_on) + CHCR3 &= ~0x0001; /* disable the DMA (and therefore the interrupt also) */ + else + CHCR3 |= 0x0001; /* re-enable the DMA */ +#endif } static ssize_t read_to_handle_ex(int fd, struct buflib_context *ctx, int handle, @@ -641,7 +649,7 @@ static bool load_voicefile_data(int fd) /* Use a static buffer to avoid difficulties with buflib during DMA * (hwcodec)/buffer passing to the voice_thread (swcodec). Clips * can be played in chunks so the size is not that important */ -static unsigned char commit_buffer[1<<10]; +static unsigned char commit_buffer[2<<10]; static void* commit_transfer(struct queue_entry *qe, size_t *size) {