Horus audio stall fix. The buffer->state value was set too late.
This commit is contained in:
@@ -781,7 +781,7 @@ void AudioQueue::wakeup()
|
||||
// TRACE("pushing buffer %d\n", bufferWIdx);
|
||||
bufferWIdx = nextBufferIdx(bufferWIdx);
|
||||
buffer->size = size;
|
||||
buffer->state = audioPushBuffer(buffer) ? AUDIO_BUFFER_PLAYING : AUDIO_BUFFER_FILLED;
|
||||
audioPushBuffer(buffer);
|
||||
__enable_irq();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ class MixedContext {
|
||||
int mixBuffer(AudioBuffer *buffer, int volume, unsigned int fade);
|
||||
};
|
||||
|
||||
bool audioPushBuffer(AudioBuffer * buffer);
|
||||
void audioPushBuffer(AudioBuffer * buffer);
|
||||
|
||||
class AudioQueue {
|
||||
|
||||
@@ -174,7 +174,9 @@ class AudioQueue {
|
||||
#if defined(SIMU_AUDIO)
|
||||
friend void *audioThread(void *);
|
||||
#endif
|
||||
|
||||
#if defined(CLI)
|
||||
friend void printAudioVars();
|
||||
#endif
|
||||
public:
|
||||
|
||||
AudioQueue();
|
||||
|
||||
@@ -396,15 +396,15 @@ void audioConsumeCurrentBuffer()
|
||||
}
|
||||
}
|
||||
|
||||
bool audioPushBuffer(AudioBuffer * buffer)
|
||||
void audioPushBuffer(AudioBuffer * buffer)
|
||||
{
|
||||
if (!currentBuffer) {
|
||||
buffer->state = AUDIO_BUFFER_PLAYING;
|
||||
audioSetCurrentBuffer(buffer);
|
||||
audioConsumeCurrentBuffer();
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
buffer->state = AUDIO_BUFFER_FILLED;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -416,9 +416,9 @@ struct SimulatorAudio {
|
||||
pthread_t threadPid;
|
||||
} simuAudio;
|
||||
|
||||
bool audioPushBuffer(AudioBuffer * buffer)
|
||||
void audioPushBuffer(AudioBuffer * buffer)
|
||||
{
|
||||
return false;
|
||||
buffer->state = AUDIO_BUFFER_FILLED;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -93,10 +93,10 @@ void dacInit()
|
||||
NVIC_EnableIRQ(DACC_IRQn) ;
|
||||
}
|
||||
|
||||
bool audioPushBuffer(AudioBuffer *buffer)
|
||||
void audioPushBuffer(AudioBuffer *buffer)
|
||||
{
|
||||
buffer->state = AUDIO_BUFFER_FILLED;
|
||||
dacStart();
|
||||
return false;
|
||||
}
|
||||
|
||||
extern "C" void DAC_IRQHandler()
|
||||
|
||||
@@ -71,10 +71,11 @@ void dacInit()
|
||||
NVIC_SetPriority(AUDIO_DMA_Stream_IRQn, 7);
|
||||
}
|
||||
|
||||
bool audioPushBuffer(AudioBuffer * buffer)
|
||||
void audioPushBuffer(AudioBuffer * buffer)
|
||||
{
|
||||
if (dacIdle) {
|
||||
dacIdle = false;
|
||||
buffer->state = AUDIO_BUFFER_PLAYING;
|
||||
AUDIO_DMA_Stream->CR &= ~DMA_SxCR_EN ; // Disable DMA channel
|
||||
AUDIO_DMA->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5 ; // Write ones to clear bits
|
||||
AUDIO_DMA_Stream->M0AR = CONVERT_PTR_UINT(buffer->data);
|
||||
@@ -82,10 +83,8 @@ bool audioPushBuffer(AudioBuffer * buffer)
|
||||
AUDIO_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE ; // Enable DMA channel and interrupt
|
||||
DAC->SR = DAC_SR_DMAUDR1 ; // Write 1 to clear flag
|
||||
DAC->CR |= DAC_CR_EN1 | DAC_CR_DMAEN1 ; // Enable DAC
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
buffer->state = AUDIO_BUFFER_FILLED;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user