@@ -47,6 +47,7 @@ class AnalogAudioArduino : public AudioStream {
47
47
48
48
bool begin (AnalogConfigStd cfg) {
49
49
TRACED ();
50
+
50
51
config = cfg;
51
52
if (config.rx_tx_mode == RXTX_MODE) {
52
53
LOGE (" RXTX not supported" );
@@ -56,6 +57,8 @@ class AnalogAudioArduino : public AudioStream {
56
57
frame_size = config.channels * (config.bits_per_sample / 8 );
57
58
result_factor = 1 ;
58
59
60
+ if (!setupPins ()) return false ;
61
+
59
62
if (!setupTx ()) return false ;
60
63
61
64
if (!setupBuffer ()) return false ;
@@ -112,10 +115,53 @@ class AnalogAudioArduino : public AudioStream {
112
115
}
113
116
}
114
117
118
+ size_t result = 0 ;;
119
+ switch (config.bits_per_sample ){
120
+ case 8 : {
121
+ result = buffer->writeArray (data, len);
122
+ } break ;
123
+ case 16 : {
124
+ size_t samples = len / 2 ;
125
+ int16_t *p16 = (int16_t *)data;
126
+ for (int j=0 ;j<samples;j++){
127
+ uint8_t sample = map (p16[j],-32768 , 32767 ,0 ,255 );
128
+ if (buffer->write (sample)){
129
+ result += 2 ;
130
+ } else {
131
+ break ;
132
+ }
133
+ }
134
+ } break ;
135
+ case 24 : {
136
+ size_t samples = len / 3 ;
137
+ int24_t *p24 = (int24_t *)data;
138
+ for (int j=0 ;j<samples;j++){
139
+ uint8_t sample = map (p24[j],-8388608 , 8388607 ,0 ,255 );
140
+ if (buffer->write (sample)){
141
+ result += 3 ;
142
+ } else {
143
+ break ;
144
+ }
145
+ }
146
+
147
+ } break ;
148
+ case 32 : {
149
+ size_t samples = len / 4 ;
150
+ int32_t *p32 = (int32_t *)data;
151
+ for (int j=0 ;j<samples;j++){
152
+ uint8_t sample = map (p32[j],-2147483648 , 2147483647 ,0 ,255 );
153
+ if (buffer->write (sample)){
154
+ result += 4 ;
155
+ } else {
156
+ break ;
157
+ }
158
+ }
159
+
160
+ } break ;
161
+ }
162
+
115
163
// write data
116
- size_t result = buffer->writeArray (data, len) * result_factor;
117
- LOGD (" write: -> %d / factor: %d" , (int )result, result_factor);
118
- return result;
164
+ return result * result_factor;
119
165
}
120
166
121
167
protected:
@@ -128,6 +174,7 @@ class AnalogAudioArduino : public AudioStream {
128
174
int result_factor = 1 ;
129
175
int decim = 1 ;
130
176
177
+
131
178
bool setupTx () {
132
179
if (config.rx_tx_mode == TX_MODE) {
133
180
// check channels
@@ -156,14 +203,11 @@ class AnalogAudioArduino : public AudioStream {
156
203
bool setupBuffer () {
157
204
if (buffer == nullptr ) {
158
205
// allocate buffer_count
159
- buffer =
160
- new RingBuffer<uint8_t >(config.buffer_size * config.buffer_count );
206
+ buffer = new RingBuffer<uint8_t >(config.buffer_size * config.buffer_count );
161
207
if (buffer == nullptr ) {
162
208
LOGE (" Not enough memory for buffer" );
163
209
return false ;
164
210
}
165
- // setup pins
166
- setupPins ();
167
211
}
168
212
return true ;
169
213
}
@@ -188,7 +232,7 @@ class AnalogAudioArduino : public AudioStream {
188
232
int channels = self->config .channels ;
189
233
for (int j = 0 ; j < channels; j++) {
190
234
// provides value in range 0…4095
191
- value = analogRead (self->config .start_pin + j );
235
+ value = analogRead (self->config .pins_data [j] );
192
236
if (self->config .is_auto_center_read ) {
193
237
self->updateMinMax (value);
194
238
}
@@ -200,42 +244,50 @@ class AnalogAudioArduino : public AudioStream {
200
244
int channels = self->config .channels ;
201
245
for (int j = 0 ; j < channels; j++) {
202
246
int16_t sample = self->buffer ->read ();
203
- sample = map (sample, -32768 , 32767 , 0 , 255 );
204
- int pin = self->config .start_pin + j;
247
+ int pin = self->config .pins_data [j];
205
248
analogWrite (pin, sample);
206
- // LOGI ("analogWrite(%d, %d)", pin, sample);
249
+ // LOGW ("analogWrite(%d, %d)", pin, sample);
207
250
}
208
251
}
209
252
}
210
253
211
254
// / pinmode input for defined analog pins
212
- void setupPins () {
255
+ bool setupPins () {
213
256
TRACED ();
257
+
258
+ Pins& pins = config.pins ();
259
+ if (pins.size ()<config.channels ){
260
+ LOGE (" Only pins %d of %d defined" , pins.size (), config.channels );
261
+ return false ;
262
+ }
263
+
264
+
214
265
if (config.rx_tx_mode == RX_MODE) {
215
266
LOGI (" rx start_pin: %d" , config.start_pin );
216
267
// setup pins for read
217
268
for (int j = 0 ; j < config.channels ; j++) {
218
- int pin = config.start_pin + j ;
269
+ int pin = config.pins_data [j] ;
219
270
pinMode (pin, INPUT);
220
271
LOGD (" pinMode(%d, INPUT)" , pin);
221
272
}
222
273
223
274
if (config.is_auto_center_read ) {
224
275
// calculate the avarage value to center the signal
225
276
for (int j = 0 ; j < 1024 ; j++) {
226
- updateMinMax (analogRead (config.start_pin ));
277
+ updateMinMax (analogRead (config.pins_data [ 0 ] ));
227
278
}
228
279
LOGI (" Avg Signal was %d" , avg_value);
229
280
}
230
281
} else if (config.rx_tx_mode == TX_MODE) {
231
- LOGI (" tx start_pin: %d" , config.start_pin );
232
282
// setup pins for read
233
283
for (int j = 0 ; j < config.channels ; j++) {
234
- int pin = config.start_pin + j;
284
+ int pin = config.pins_data [j];
285
+ LOGI (" tx pin %d: %d" , j, pin);
235
286
pinMode (pin, OUTPUT);
236
287
LOGD (" pinMode(%d, OUTPUT)" , pin);
237
288
}
238
289
}
290
+ return true ;
239
291
}
240
292
241
293
void updateMinMax (int value) {
@@ -254,7 +306,7 @@ class AnalogAudioArduino : public AudioStream {
254
306
// / The requested sampling rate is too hight: we only process half of the
255
307
// / samples so we can half the sampling rate
256
308
bool isDecimateActive () {
257
- return config.sample_rate >= ANALOG_MAX_SAMPLE_RATE ;
309
+ return config.sample_rate >= config. max_sample_rate ;
258
310
}
259
311
260
312
// combined stereo channel to mono
@@ -264,9 +316,9 @@ class AnalogAudioArduino : public AudioStream {
264
316
int effectiveOutputSampleRate () { return config.sample_rate / decimation (); }
265
317
266
318
int decimation () {
267
- if (config.sample_rate <= ANALOG_MAX_SAMPLE_RATE ) return 1 ;
319
+ if (config.sample_rate <= config. max_sample_rate ) return 1 ;
268
320
for (int j = 2 ; j < 6 ; j += 2 ) {
269
- if (config.sample_rate / j <= ANALOG_MAX_SAMPLE_RATE ) {
321
+ if (config.sample_rate / j <= config. max_sample_rate ) {
270
322
return j;
271
323
}
272
324
}
0 commit comments