diff --git a/src/cppmain.cc b/src/cppmain.cc index 78e7e24..173e37f 100644 --- a/src/cppmain.cc +++ b/src/cppmain.cc @@ -10,14 +10,20 @@ #define SAMPLE_FREQ 44200 #define SAMPLE_MAX 4096 -#define DOUBLE_BUFFER_SIZE 16 -#define BUFFER_SIZE 8 +#define BUFFER_SIZE 16 +#define BLOCK_SIZE 8 const double pi{ std::acos(-1) }; -static u32 double_buffer[DOUBLE_BUFFER_SIZE]; + +// Buffer and block +static u32 audio_buffer[BUFFER_SIZE]; +static u32* block = &audio_buffer[0]; +static volatile bool process_block{ false }; + +// time static u64 time{ 0 }; -static volatile bool dma_to_dac_half_complete{ false }; -static volatile bool dma_to_dac_complete{ false }; + +// misc static volatile int freq = 100; namespace Heck { @@ -37,11 +43,6 @@ namespace Heck { CDC_Transmit_FS((uint8_t *)out.data(), out.size()); } - - // DAC - // --- - - // LED // --- void led_green_toggle() @@ -59,7 +60,6 @@ namespace Heck { HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET); } - // CALLBACKS void irq1_cb() { @@ -93,46 +93,46 @@ namespace Heck { ret %= max; return ret; } - // - // void buffer_init_noise() - // { - // log("buffer_init_noise()"); - // for (int i = 0; i < DOUBLE_BUFFER_SIZE; i++) { - // u32 val = random(SAMPLE_MAX); - // double_buffer[i] = val; - // log(std::to_string(val)); - // } - // } - // - // void buffer_init_sin() - // { - // log("buffer_init_sin()"); - // for (int i = 0; i < DOUBLE_BUFFER_SIZE; i++) { - // float p = float(i) / (float)DOUBLE_BUFFER_SIZE - 0.5; - // u32 val = sin(p) * SAMPLE_MAX; - // double_buffer[i] = val; - // log(std::to_string(val)); - // } - // } - // - // void buffer_div(int div) - // { - // log("init_scale()"); - // for (int i = 0; i < DOUBLE_BUFFER_SIZE; i++) { - // u32 val = double_buffer[i] / div; - // double_buffer[i] = val; - // log(std::to_string(val)); - // } - // } - // - // void buffer_randomize(int max) - // { - // log("buffer_randomize()"); - // u32 buf_index = random(DOUBLE_BUFFER_SIZE); - // u32 buf_val = random(max); - // double_buffer[buf_index] = buf_val; - // log("i:" + std::to_string(buf_index) + " v:" + std::to_string(buf_val)); - // } + + void buffer_init_noise() + { + log("buffer_init_noise()"); + for (int i = 0; i < BUFFER_SIZE; i++) { + u32 val = random(SAMPLE_MAX); + audio_buffer[i] = val; + log(std::to_string(val)); + } + } + + void buffer_init_sin() + { + log("buffer_init_sin()"); + for (int i = 0; i < BUFFER_SIZE; i++) { + float p = float(i) / (float)BUFFER_SIZE - 0.5; + u32 val = sin(p) * SAMPLE_MAX; + audio_buffer[i] = val; + log(std::to_string(val)); + } + } + + void buffer_div(int div) + { + log("init_scale()"); + for (int i = 0; i < BUFFER_SIZE; i++) { + u32 val = audio_buffer[i] / div; + audio_buffer[i] = val; + log(std::to_string(val)); + } + } + + void buffer_randomize(int max) + { + log("buffer_randomize()"); + u32 buf_index = random(BUFFER_SIZE); + u32 buf_val = random(max); + audio_buffer[buf_index] = buf_val; + log("i:" + std::to_string(buf_index) + " v:" + std::to_string(buf_val)); + } std::string reg_to_string(uint32_t val) { @@ -150,14 +150,14 @@ namespace Heck { } - void calculate_audio(u32 *buffer) + void calculate_audio() { - log("calculate_audio time: "); +// log("calculate_audio time: "); u64 t = time; u32 samps = hz_to_samps(freq); - for (int i = 0; i < BUFFER_SIZE; i++) { - buffer[i] = t % samps; + for (int i = 0; i < BLOCK_SIZE; i++) { + block[i] = t % samps; t++; } } @@ -168,21 +168,15 @@ namespace Heck { log("Starting..."); HAL_TIM_Base_Start_IT(&htim_blinky_led); - HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (u32 *)double_buffer, DOUBLE_BUFFER_SIZE, DAC_ALIGN_12B_R); + HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (u32 *)audio_buffer, BUFFER_SIZE, DAC_ALIGN_12B_R); HAL_TIM_Base_Start_IT(&htim_dac1); log("Entering MainLoop..."); while (true) { - if (dma_to_dac_half_complete) { - calculate_audio(&double_buffer[0]); - time += BUFFER_SIZE; - dma_to_dac_half_complete = false; - } - if (dma_to_dac_complete) { - - calculate_audio(&double_buffer[BUFFER_SIZE]); - time += BUFFER_SIZE; - dma_to_dac_complete = false; + if (process_block) { + calculate_audio(); + time += BLOCK_SIZE; + process_block = false; } } } @@ -232,13 +226,15 @@ extern "C" void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) extern "C" void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef *hdac) { Heck::log("HAL_DAC_ConvHalfCpltCallbackCh1"); - dma_to_dac_half_complete = true; + block = &audio_buffer[0]; + process_block = true; } extern "C" void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac) { Heck::log("HAL_DAC_ConvCpltCallbackCh1"); - dma_to_dac_complete = true; + block = &audio_buffer[BUFFER_SIZE]; + process_block = true; }