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
This commit is contained in:
Thomas Martitz 2014-02-03 12:43:05 +01:00
parent 10b3bc78f6
commit 0b7a90722a

View file

@ -207,6 +207,14 @@ static void sync_callback(int handle, bool sync_on)
mutex_lock(&read_buffer_mutex); mutex_lock(&read_buffer_mutex);
else else
mutex_unlock(&read_buffer_mutex); 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, 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 /* Use a static buffer to avoid difficulties with buflib during DMA
* (hwcodec)/buffer passing to the voice_thread (swcodec). Clips * (hwcodec)/buffer passing to the voice_thread (swcodec). Clips
* can be played in chunks so the size is not that important */ * 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) static void* commit_transfer(struct queue_entry *qe, size_t *size)
{ {