From 3d792ea4dfd7dffab9bf35a66fd838b47772a7da Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 8 Aug 2015 10:58:52 +0200 Subject: [PATCH] [9XR-PRO] HiFi audio now :) --- radio/src/targets/sky9x/audio_driver.cpp | 46 ++++++++++++++++-------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/radio/src/targets/sky9x/audio_driver.cpp b/radio/src/targets/sky9x/audio_driver.cpp index e92142af7..d21c1e531 100644 --- a/radio/src/targets/sky9x/audio_driver.cpp +++ b/radio/src/targets/sky9x/audio_driver.cpp @@ -111,33 +111,51 @@ void dacInit() bool dacQueue(AudioBuffer *buffer) { - dacStart(); - return false; + if (DACC->DACC_TCR == 0 && DACC->DACC_TNCR == 0) { + DACC->DACC_TPR = CONVERT_PTR_UINT(buffer->data); + DACC->DACC_TCR = buffer->size/2; + DACC->DACC_PTCR = DACC_PTCR_TXTEN; + dacStart(); + return true; + } + else if (DACC->DACC_TNCR == 0) { + DACC->DACC_TNPR = CONVERT_PTR_UINT(buffer->data); + DACC->DACC_TNCR = buffer->size/2; + DACC->DACC_PTCR = DACC_PTCR_TXTEN; + dacStart(); + return true; + } + else { + dacStart(); + return false; + } } extern "C" void DAC_IRQHandler() { uint32_t sr = DACC->DACC_ISR; if (sr & DACC_ISR_ENDTX) { - AudioBuffer *nextBuffer = audioQueue.getNextFilledBuffer(); - if (nextBuffer) { - // Try the first PDC buffer - if ((DACC->DACC_TCR == 0) && (DACC->DACC_TNCR == 0)) { + // Try the first PDC buffer + if (DACC->DACC_TCR == 0 && DACC->DACC_TNCR == 0) { + AudioBuffer * nextBuffer = audioQueue.getNextFilledBuffer(); + if (nextBuffer) { DACC->DACC_TPR = CONVERT_PTR_UINT(nextBuffer->data); DACC->DACC_TCR = nextBuffer->size/2; DACC->DACC_PTCR = DACC_PTCR_TXTEN; - return; } - // Try the second PDC buffer - if (DACC->DACC_TNCR == 0) { - DACC->DACC_TNPR = CONVERT_PTR_UINT(nextBuffer->data); - DACC->DACC_TNCR = nextBuffer->size/2; - DACC->DACC_PTCR = DACC_PTCR_TXTEN; + else { + dacStop(); return; } } - else { - dacStop(); + // Try the second PDC buffer + if (DACC->DACC_TNCR == 0) { + AudioBuffer * nextBuffer = audioQueue.getNextFilledBuffer(); + if (nextBuffer) { + DACC->DACC_TNPR = CONVERT_PTR_UINT(nextBuffer->data); + DACC->DACC_TNCR = nextBuffer->size/2; + DACC->DACC_PTCR = DACC_PTCR_TXTEN; + } } } }