| SIM_SCGC2 |= SIM_SCGC2_DAC0; | SIM_SCGC2 |= SIM_SCGC2_DAC0; | ||||
| DAC0_C0 = DAC_C0_DACEN; // 1.2V VDDA is DACREF_2 | DAC0_C0 = DAC_C0_DACEN; // 1.2V VDDA is DACREF_2 | ||||
| // slowly ramp up to DC voltage, approx 1/4 second | // slowly ramp up to DC voltage, approx 1/4 second | ||||
| for (int16_t i=0; i<2048; i+=8) { | |||||
| for (int16_t i=0; i<=2048; i+=8) { | |||||
| *(int16_t *)&(DAC0_DAT0L) = i; | *(int16_t *)&(DAC0_DAT0L) = i; | ||||
| delay(1); | delay(1); | ||||
| } | } | ||||
| src = block->data; | src = block->data; | ||||
| do { | do { | ||||
| // TODO: this should probably dither | // TODO: this should probably dither | ||||
| *dest++ = ((*src++) + 32767) >> 4; | |||||
| *dest++ = ((*src++) + 32768) >> 4; | |||||
| } while (dest < end); | } while (dest < end); | ||||
| AudioStream::release(block); | AudioStream::release(block); | ||||
| AudioOutputAnalog::block_left_1st = AudioOutputAnalog::block_left_2nd; | AudioOutputAnalog::block_left_1st = AudioOutputAnalog::block_left_2nd; | ||||
| AudioOutputAnalog::block_left_2nd = NULL; | AudioOutputAnalog::block_left_2nd = NULL; | ||||
| } else { | } else { | ||||
| do { | do { | ||||
| *dest++ = 2047; | |||||
| *dest++ = 2048; | |||||
| } while (dest < end); | } while (dest < end); | ||||
| } | } | ||||
| if (AudioOutputAnalog::update_responsibility) AudioStream::update_all(); | if (AudioOutputAnalog::update_responsibility) AudioStream::update_all(); |
| memset(&block_silent, 0, sizeof(block_silent)); | memset(&block_silent, 0, sizeof(block_silent)); | ||||
| // slowly ramp up to DC voltage, approx 1/4 second | // slowly ramp up to DC voltage, approx 1/4 second | ||||
| for (int16_t i=0; i<2048; i+=8) { | |||||
| for (int16_t i=0; i<=2048; i+=8) { | |||||
| *(int16_t *)&(DAC0_DAT0L) = i; | *(int16_t *)&(DAC0_DAT0L) = i; | ||||
| *(int16_t *)&(DAC1_DAT0L) = i; | *(int16_t *)&(DAC1_DAT0L) = i; | ||||
| delay(1); | delay(1); | ||||
| // TODO: can this be optimized? | // TODO: can this be optimized? | ||||
| uint32_t left = *src_left++; | uint32_t left = *src_left++; | ||||
| uint32_t right = *src_right++; | uint32_t right = *src_right++; | ||||
| uint32_t out1 = ((left & 0xFFFF) + 32767) >> 4; | |||||
| out1 |= (((right & 0xFFFF) + 32767) >> 4) << 16; | |||||
| uint32_t out2 = ((left >> 16) + 32767) >> 4; | |||||
| out2 |= (((right >> 16) + 32767) >> 4) << 16; | |||||
| uint32_t out1 = ((left & 0xFFFF) + 32768) >> 4; | |||||
| out1 |= (((right & 0xFFFF) + 32768) >> 4) << 16; | |||||
| uint32_t out2 = ((left >> 16) + 32768) >> 4; | |||||
| out2 |= (((right >> 16) + 32768) >> 4) << 16; | |||||
| *dest++ = out1; | *dest++ = out1; | ||||
| *dest++ = out2; | *dest++ = out2; | ||||
| } while (dest < end); | } while (dest < end); |