Skip to content

Commit b6cb2e7

Browse files
Avoid race condition in I2S/PWMAudio delete (#1163)
Fixes #1162 Disable DMA interrupts while we're tearing down an AudioBufferManager and explicitly clear any potential leftover IRQs to avoid hangs.
1 parent bedcbf5 commit b6cb2e7

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

libraries/AudioBufferManager/src/AudioBufferManager.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,15 @@ AudioBufferManager::AudioBufferManager(size_t bufferCount, size_t bufferWords, i
6969
}
7070

7171
AudioBufferManager::~AudioBufferManager() {
72+
noInterrupts();
7273
if (_running) {
7374
_running = false;
7475
for (auto i = 0; i < 2; i++) {
7576
dma_channel_set_irq0_enabled(_channelDMA[i], false);
7677
__channelMap[_channelDMA[i]] = nullptr;
7778
dma_channel_abort(_channelDMA[i]);
7879
dma_channel_unclaim(_channelDMA[i]);
80+
dma_channel_acknowledge_irq0(_channelDMA[i]);
7981
}
8082
__channelCount--;
8183
if (!__channelCount) {
@@ -84,6 +86,7 @@ AudioBufferManager::~AudioBufferManager() {
8486
irq_remove_handler(DMA_IRQ_0, _irq);
8587
}
8688
}
89+
interrupts();
8790
for (int i = 0; i < 2; i++) {
8891
if (_active[i] != _silence) {
8992
_deleteAudioBuffer(_active[i]);

0 commit comments

Comments
 (0)