Horus audio stall fix. The buffer->state value was set too late.

This commit is contained in:
Damjan Adamic
2016-04-03 23:07:55 +02:00
parent 018fec4863
commit 3ef7326756
6 changed files with 15 additions and 14 deletions
+1 -1
View File
@@ -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();
}
}
+4 -2
View File
@@ -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();
+3 -3
View File
@@ -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;
}
}
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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()
+3 -4
View File
@@ -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;
}
}