arduino-audio-tools
Loading...
Searching...
No Matches
AnalogDriverMBED.h
1
2#pragma once
3
4#include "AudioToolsConfig.h"
5#if defined(IS_MBED) && defined(USE_ANALOG) || defined(DOXYGEN)
6
7namespace audio_tools {
8
17 public:
19 AnalogDriverMBED() = default;
20
22 virtual ~AnalogDriverMBED() { end(); }
23
25 bool begin(AnalogConfig cfg) {
26 TRACEI();
27 if (cfg.bits_per_sample != 16) {
28 LOGE("Only 16 bits_per_sample supported");
29 return false;
30 }
31 if (cfg.channels > 2) {
32 LOGE("max channels: 2");
33 return false;
34 }
35 if (cfg.channels <= 0) {
36 LOGE("no channels");
37 return false;
38 }
39 info = cfg;
40 auto_center.begin(cfg.channels, cfg.bits_per_sample);
41 int n_samples = cfg.buffer_size / (cfg.bits_per_sample / 8);
42 ring_buffer.resize(n_samples);
43 switch (info.channels) {
44 case 1:
45 dac1.begin(AN_RESOLUTION_12, info.sample_rate, n_samples,
46 cfg.buffer_count);
47 break;
48 case 2:
49 dac1.begin(AN_RESOLUTION_12, info.sample_rate, n_samples / 2,
50 cfg.buffer_count);
51 dac2.begin(AN_RESOLUTION_12, info.sample_rate, n_samples / 2,
52 cfg.buffer_count);
53 break;
54 }
55 return true;
56 }
57
59 void end() override {
60 active = false;
61 dac1.stop();
62 dac2.stop();
63 adc1.stop();
64 adc2.stop();
65 }
66
67 int availableForWrite() { return dac1.available() ? info.buffer_size : 0; }
68
70 size_t write(const uint8_t *src, size_t size_bytes) override {
71 TRACED();
72 if (!dac1.available()) return 0;
73
74 // collect data in ringbuffer
75 size_t result = 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]);
80 // process ringbuffer when it is full
81 if (ring_buffer.isFull()) {
82 result += writeBuffer();
83 }
84 }
85 return result;
86 }
87
88 void flush() {
89 const int size = info.buffer_size;
90 const uint8_t data[size] = {0};
91 write(data, size);
92 ring_buffer.reset();
93 }
94
95 size_t readBytes(uint8_t *dest, size_t size_bytes) override {
96 TRACED();
97 size_t result = 0;
98 int16_t *data = (int16_t *)dest;
99 size_t samples = size_bytes / 2;
100 switch (info.channels) {
101 case 1:
102 for (int j = 0; j < samples; j++) {
103 data[j] = adc1.read();
104 result += 2;
105 }
106 break;
107 case 2:
108 for (int j = 0; j < samples; j += 2) {
109 data[j] = adc1.read();
110 data[j + 1] =adc2.read();
111 result += 4;
112 }
113 break;
114 }
115
116 // make sure that the center is at 0
117 if (info.is_auto_center_read) {
118 auto_center.convert(dest, result);
119 }
120
121 return result;
122 }
123
124 virtual int available() override { return info.buffer_size; }
125
126 protected:
127 audio_tools::RingBuffer<Sample> ring_buffer{0};
128 AnalogConfig info;
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};
134 bool active = false;
135
137 size_t writeBuffer() {
138 size_t result = 0;
139 switch (info.channels) {
140 case 1: {
141 SampleBuffer buf = dac1.dequeue();
142 for (size_t i = 0; i < buf.size(); i++) {
143 ring_buffer.read(buf[i]);
144 result += 2;
145 }
146 dac1.write(buf);
147 } break;
148 case 2: {
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] );
154 result += 4;
155 }
156 dac1.write(buf1);
157 dac2.write(buf2);
158 } break;
159 }
160 assert(ring_buffer.isEmpty());
161 return result;
162 }
163};
164
166using AnalogDriver = AnalogDriverMBED;
167
168} // namespace audio_tools
169
170#endif // USE_ANALOG
ESP32 specific configuration for i2s input via adc. The default input pin is GPIO34....
Definition AnalogConfigESP32.h:22
Definition AnalogDriverBase.h:13
Please use AnalogAudioStream: A ADC and DAC API for the Arduino Giga.
Definition AnalogDriverMBED.h:16
size_t write(const uint8_t *src, size_t size_bytes) override
writes the data to the I2S interface
Definition AnalogDriverMBED.h:70
bool begin(AnalogConfig cfg)
starts the DAC
Definition AnalogDriverMBED.h:25
void end() override
stops the I2S and unistalls the driver
Definition AnalogDriverMBED.h:59
virtual ~AnalogDriverMBED()
Destructor.
Definition AnalogDriverMBED.h:22
size_t writeBuffer()
The ringbuffer is used to make sure that we can write full SampleBuffers.
Definition AnalogDriverMBED.h:137
AnalogDriverMBED()=default
Default constructor.
Implements a typed Ringbuffer.
Definition Buffers.h:339
bool read(T &result) override
reads a single value
Definition Buffers.h:346
virtual bool write(T data) override
write add an entry to the buffer
Definition Buffers.h:389
virtual void reset() override
clears the buffer
Definition Buffers.h:401
virtual bool isFull() override
checks if the buffer is full
Definition Buffers.h:384
virtual bool resize(int len)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:416
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
AnalogDriverArduino AnalogDriver
AnalogAudioStream.
Definition AnalogDriverArduino.h:48
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:55
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:57
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:59