4#include "AudioToolsConfig.h"
5#if defined(IS_MBED) && defined(USE_ANALOG) || defined(DOXYGEN)
28 LOGE(
"Only 16 bits_per_sample supported");
32 LOGE(
"max channels: 2");
42 ring_buffer.
resize(n_samples);
45 dac1.begin(AN_RESOLUTION_12, info.
sample_rate, n_samples,
49 dac1.begin(AN_RESOLUTION_12, info.
sample_rate, n_samples / 2,
51 dac2.begin(AN_RESOLUTION_12, info.
sample_rate, n_samples / 2,
67 int availableForWrite() {
return dac1.available() ? info.buffer_size : 0; }
70 size_t write(
const uint8_t *src,
size_t size_bytes)
override {
72 if (!dac1.available())
return 0;
76 int sample_count = size_bytes / 2;
77 Sample *data = (Sample *)src;
78 for (
int j = 0; j < sample_count; j++) {
79 ring_buffer.
write(data[j]);
81 if (ring_buffer.
isFull()) {
89 const int size = info.buffer_size;
90 const uint8_t data[size] = {0};
95 size_t readBytes(uint8_t *dest,
size_t size_bytes)
override {
98 int16_t *data = (int16_t *)dest;
99 size_t samples = size_bytes / 2;
102 for (
int j = 0; j < samples; j++) {
103 data[j] = adc1.read();
108 for (
int j = 0; j < samples; j += 2) {
109 data[j] = adc1.read();
110 data[j + 1] =adc2.read();
117 if (info.is_auto_center_read) {
118 auto_center.convert(dest, result);
124 virtual int available()
override {
return info.buffer_size; }
129 ConverterAutoCenter auto_center;
130 AdvancedDAC dac1{PIN_DAC_1};
131 AdvancedDAC dac2{PIN_DAC_2};
132 AdvancedADC adc1{PIN_ANALOG_START};
133 AdvancedADC adc2{PIN_ANALOG_START + 1};
139 switch (info.channels) {
141 SampleBuffer buf = dac1.dequeue();
142 for (
size_t i = 0; i < buf.size(); i++) {
143 ring_buffer.
read(buf[i]);
149 SampleBuffer buf1 = dac1.dequeue();
150 SampleBuffer buf2 = dac2.dequeue();
151 for (
size_t i = 0; i < buf1.size(); i += 2) {
152 ring_buffer.
read(buf1[i]);
153 ring_buffer.
read(buf2[i] );
160 assert(ring_buffer.isEmpty());