committed by
Bertrand Songis
parent
a19f4c78bf
commit
44133b595d
@@ -364,7 +364,7 @@ uint8_t * currentBuffer = NULL;
|
||||
uint32_t currentSize = 0;
|
||||
int16_t newVolume = -1;
|
||||
|
||||
void audioSetCurrentBuffer(AudioBuffer * buffer)
|
||||
void audioSetCurrentBuffer(const AudioBuffer * buffer)
|
||||
{
|
||||
currentBuffer = (uint8_t *)buffer->data;
|
||||
currentSize = buffer->size * 2;
|
||||
@@ -379,35 +379,22 @@ void audioConsumeCurrentBuffer()
|
||||
newVolume = -1;
|
||||
}
|
||||
|
||||
if (!currentBuffer) {
|
||||
audioSetCurrentBuffer(audioQueue.buffersFifo.getNextFilledBuffer());
|
||||
}
|
||||
|
||||
if (currentBuffer) {
|
||||
uint32_t written = audioSpiWriteData(currentBuffer, currentSize);
|
||||
currentBuffer += written;
|
||||
currentSize -= written;
|
||||
if (currentSize == 0) {
|
||||
AudioBuffer * buffer = audioQueue.getNextFilledBuffer();
|
||||
if (buffer) {
|
||||
audioSetCurrentBuffer(buffer);
|
||||
}
|
||||
else {
|
||||
currentBuffer = NULL;
|
||||
currentSize = 0;
|
||||
}
|
||||
audioQueue.buffersFifo.freeNextFilledBuffer();
|
||||
currentBuffer = NULL;
|
||||
currentSize = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void audioPushBuffer(AudioBuffer * buffer)
|
||||
{
|
||||
if (!currentBuffer) {
|
||||
buffer->state = AUDIO_BUFFER_PLAYING;
|
||||
audioSetCurrentBuffer(buffer);
|
||||
audioConsumeCurrentBuffer();
|
||||
}
|
||||
else {
|
||||
buffer->state = AUDIO_BUFFER_FILLED;
|
||||
}
|
||||
}
|
||||
|
||||
// adjust this value for a volume level just above the silence
|
||||
// values is attenuation in dB, higher value - less volume
|
||||
// max value is 126
|
||||
|
||||
@@ -364,18 +364,11 @@ struct SimulatorAudio {
|
||||
bool threadRunning;
|
||||
pthread_t threadPid;
|
||||
} simuAudio;
|
||||
|
||||
void audioPushBuffer(AudioBuffer * buffer)
|
||||
{
|
||||
buffer->state = AUDIO_BUFFER_FILLED;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCBHORUS)
|
||||
void audioConsumeCurrentBuffer()
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(MASTER_VOLUME)
|
||||
void setScaledVolume(uint8_t volume)
|
||||
@@ -395,7 +388,7 @@ int32_t getVolume()
|
||||
#endif
|
||||
|
||||
#if defined(SIMU_AUDIO) && defined(CPUARM)
|
||||
void copyBuffer(uint8_t * dest, uint16_t * buff, unsigned int samples)
|
||||
void copyBuffer(uint8_t * dest, const uint16_t * buff, unsigned int samples)
|
||||
{
|
||||
for(unsigned int i=0; i<samples; i++) {
|
||||
int sample = ((int32_t)(uint32_t)(buff[i]) - 0x8000); // conversion from uint16_t
|
||||
@@ -409,22 +402,25 @@ void fillAudioBuffer(void *udata, Uint8 *stream, int len)
|
||||
SDL_memset(stream, 0, len);
|
||||
|
||||
if (simuAudio.leftoverLen) {
|
||||
copyBuffer(stream, simuAudio.leftoverData, simuAudio.leftoverLen);
|
||||
len -= simuAudio.leftoverLen*2;
|
||||
stream += simuAudio.leftoverLen*2;
|
||||
simuAudio.leftoverLen = 0;
|
||||
int len1 = min(len/2, simuAudio.leftoverLen);
|
||||
copyBuffer(stream, simuAudio.leftoverData, len1);
|
||||
len -= len1*2;
|
||||
stream += len1*2;
|
||||
simuAudio.leftoverLen -= len1;
|
||||
// putchar('l');
|
||||
if (simuAudio.leftoverLen) return; // buffer fully filled
|
||||
}
|
||||
|
||||
if (audioQueue.filledAtleast(len/(AUDIO_BUFFER_SIZE*2)+1) ) {
|
||||
if (audioQueue.buffersFifo.filledAtleast(len/(AUDIO_BUFFER_SIZE*2)+1) ) {
|
||||
while(true) {
|
||||
AudioBuffer *nextBuffer = audioQueue.getNextFilledBuffer();
|
||||
const AudioBuffer * nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer();
|
||||
if (nextBuffer) {
|
||||
if (len >= nextBuffer->size*2) {
|
||||
copyBuffer(stream, nextBuffer->data, nextBuffer->size);
|
||||
stream += nextBuffer->size*2;
|
||||
len -= nextBuffer->size*2;
|
||||
// putchar('+');
|
||||
audioQueue.buffersFifo.freeNextFilledBuffer();
|
||||
}
|
||||
else {
|
||||
//partial
|
||||
@@ -433,6 +429,7 @@ void fillAudioBuffer(void *udata, Uint8 *stream, int len)
|
||||
memcpy(simuAudio.leftoverData, &nextBuffer->data[len/2], simuAudio.leftoverLen*2);
|
||||
len = 0;
|
||||
// putchar('p');
|
||||
audioQueue.buffersFifo.freeNextFilledBuffer();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include "opentx.h"
|
||||
const AudioBuffer * nextBuffer = 0;
|
||||
|
||||
const int8_t volumeScale[VOLUME_LEVEL_MAX+1] =
|
||||
{
|
||||
@@ -93,17 +94,24 @@ void dacInit()
|
||||
NVIC_EnableIRQ(DACC_IRQn) ;
|
||||
}
|
||||
|
||||
void audioPushBuffer(AudioBuffer *buffer)
|
||||
void audioConsumeCurrentBuffer()
|
||||
{
|
||||
buffer->state = AUDIO_BUFFER_FILLED;
|
||||
dacStart();
|
||||
if (nextBuffer == 0) {
|
||||
nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer();
|
||||
if (nextBuffer) {
|
||||
dacStart();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extern "C" void DAC_IRQHandler()
|
||||
{
|
||||
uint32_t sr = DACC->DACC_ISR;
|
||||
if (sr & DACC_ISR_ENDTX) {
|
||||
AudioBuffer *nextBuffer = audioQueue.getNextFilledBuffer();
|
||||
if (nextBuffer) audioQueue.buffersFifo.freeNextFilledBuffer();
|
||||
|
||||
nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer();
|
||||
if (nextBuffer) {
|
||||
// Try the first PDC buffer
|
||||
if ((DACC->DACC_TCR == 0) && (DACC->DACC_TNCR == 0)) {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
void audioInit( void ) ;
|
||||
void audioEnd( void ) ;
|
||||
#define audioConsumeCurrentBuffer()
|
||||
void audioConsumeCurrentBuffer();
|
||||
#define audioDisableIrq() __disable_irq()
|
||||
#define audioEnableIrq() __enable_irq()
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include "opentx.h"
|
||||
|
||||
#if !defined(SIMU)
|
||||
bool dacIdle = true;
|
||||
const AudioBuffer * nextBuffer = 0;
|
||||
|
||||
void setSampleRate(uint32_t frequency)
|
||||
{
|
||||
@@ -77,22 +77,22 @@ void dacInit()
|
||||
NVIC_SetPriority(AUDIO_DMA_Stream_IRQn, 7);
|
||||
}
|
||||
|
||||
void audioPushBuffer(AudioBuffer * buffer)
|
||||
void audioConsumeCurrentBuffer()
|
||||
{
|
||||
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);
|
||||
AUDIO_DMA_Stream->NDTR = buffer->size;
|
||||
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
|
||||
}
|
||||
else {
|
||||
buffer->state = AUDIO_BUFFER_FILLED;
|
||||
if (nextBuffer == 0) {
|
||||
|
||||
nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer();
|
||||
if (nextBuffer) {
|
||||
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(nextBuffer->data);
|
||||
AUDIO_DMA_Stream->NDTR = nextBuffer->size;
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void dacStart()
|
||||
@@ -140,7 +140,9 @@ extern "C" void AUDIO_DMA_Stream_IRQHandler()
|
||||
AUDIO_DMA->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5 ; // Write ones to clear flags
|
||||
AUDIO_DMA_Stream->CR &= ~DMA_SxCR_EN ; // Disable DMA channel
|
||||
|
||||
AudioBuffer * nextBuffer = audioQueue.getNextFilledBuffer();
|
||||
if (nextBuffer) audioQueue.buffersFifo.freeNextFilledBuffer();
|
||||
|
||||
nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer();
|
||||
if (nextBuffer) {
|
||||
AUDIO_DMA_Stream->M0AR = CONVERT_PTR_UINT(nextBuffer->data);
|
||||
AUDIO_DMA_Stream->NDTR = nextBuffer->size;
|
||||
@@ -148,8 +150,5 @@ extern "C" void AUDIO_DMA_Stream_IRQHandler()
|
||||
AUDIO_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE ; // Enable DMA channel
|
||||
DAC->SR = DAC_SR_DMAUDR1; // Write 1 to clear flag
|
||||
}
|
||||
else {
|
||||
dacIdle = true;
|
||||
}
|
||||
}
|
||||
#endif // #if !defined(SIMU)
|
||||
|
||||
+570
-570
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user