Unverified Commit 3c408dab authored by Earle F. Philhower, III's avatar Earle F. Philhower, III Committed by GitHub

AudioBufferManager(I2s, PWMAudio, ADCInput) clicking fix (#1500)

The ABM had an off-by-one error in the DMA buffer swapover.  Instead of
setting the DMA address to the newly added buffer in active[], it set it
to the buffer that was currently running.

This would effectively disable the ping-pong and cause clicks/lost data.

Fixes #1491
parent 2888f4d0
...@@ -257,7 +257,7 @@ void __not_in_flash_func(AudioBufferManager::_dmaIRQ)(int channel) { ...@@ -257,7 +257,7 @@ void __not_in_flash_func(AudioBufferManager::_dmaIRQ)(int channel) {
_active[1] = _takeFromList(&_filled); _active[1] = _takeFromList(&_filled);
} }
_overunderflow = _overunderflow | (_active[1] == _silence); _overunderflow = _overunderflow | (_active[1] == _silence);
dma_channel_set_read_addr(channel, _active[0]->buff, false); dma_channel_set_read_addr(channel, _active[1]->buff, false);
} else { } else {
if (_empty) { if (_empty) {
_addToList(&_filled, _active[0]); _addToList(&_filled, _active[0]);
...@@ -266,7 +266,7 @@ void __not_in_flash_func(AudioBufferManager::_dmaIRQ)(int channel) { ...@@ -266,7 +266,7 @@ void __not_in_flash_func(AudioBufferManager::_dmaIRQ)(int channel) {
} else { } else {
_overunderflow = true; _overunderflow = true;
} }
dma_channel_set_write_addr(channel, _active[0]->buff, false); dma_channel_set_write_addr(channel, _active[1]->buff, false);
} }
dma_channel_set_trans_count(channel, _wordsPerBuffer * (_dmaSize == DMA_SIZE_16 ? 2 : 1), false); dma_channel_set_trans_count(channel, _wordsPerBuffer * (_dmaSize == DMA_SIZE_16 ? 2 : 1), false);
dma_channel_acknowledge_irq0(channel); dma_channel_acknowledge_irq0(channel);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment