@@ -35,12 +35,14 @@ class R2ROutput : public AudioOutput {
35
35
}
36
36
37
37
bool begin (R2RConfig c) {
38
+ TRACED ();
38
39
cfg = c;
39
40
rcfg = c;
40
41
return begin ();
41
42
}
42
43
43
44
bool begin () override {
45
+ TRACED ();
44
46
if (cfg.channels == 0 || cfg.channels > 2 ) {
45
47
LOGE (" channels is %d" , cfg.channels );
46
48
return false ;
@@ -56,28 +58,34 @@ class R2ROutput : public AudioOutput {
56
58
}
57
59
setupPins ();
58
60
timer.setCallbackParameter (this );
61
+ timer.setIsSave (true );
59
62
return timer.begin (r2r_timer_callback, cfg.sample_rate , HZ);
60
63
}
61
64
62
65
size_t write (const uint8_t *data, size_t len) override {
63
66
size_t result = buffer.writeArray (data, len);
64
67
// activate output when buffer is full
65
68
if (!is_active && buffer.isFull ()) {
69
+ LOGI (" is_active = true" );
66
70
is_active = true ;
67
71
}
68
72
return result;
69
73
}
70
74
71
75
protected:
72
76
TimerAlarmRepeating timer;
73
- NBuffer<uint8_t > buffer{1024 , 2 };
77
+ // Double buffer
78
+ NBuffer<uint8_t > buffer{DEFAULT_BUFFER_SIZE, 2 };
74
79
R2RConfig rcfg;
75
80
76
81
void setupPins () {
82
+ TRACED ();
77
83
for (int j = 0 ; j < rcfg.channel1_pins .size (); j++) {
84
+ LOGI (" Setup pin %d" , rcfg.channel1_pins [j]);
78
85
pinMode (rcfg.channel1_pins [j], OUTPUT);
79
86
}
80
87
for (int j = 0 ; j < rcfg.channel2_pins .size (); j++) {
88
+ LOGI (" Setup pin %d" , rcfg.channel1_pins [j]);
81
89
pinMode (rcfg.channel2_pins [j], OUTPUT);
82
90
}
83
91
}
@@ -98,7 +106,7 @@ class R2ROutput : public AudioOutput {
98
106
template <typename T>
99
107
void writeValueT (int channel) {
100
108
// don't do anything if we do not have enough data
101
- if (buffer.available ()< sizeof (T)) return ;
109
+ if (buffer.available () < sizeof (T)) return ;
102
110
103
111
// get next value from buffer
104
112
T value = 0 ;
@@ -107,16 +115,20 @@ class R2ROutput : public AudioOutput {
107
115
unsigned uvalue = (int )value + NumberConverter::maxValueT<T>() + 1 ;
108
116
// scale value
109
117
uvalue = uvalue >> ((sizeof (T) * 8 ) - rcfg.channel1_pins .size ());
118
+ // Serial.println(uvalue);
119
+
110
120
// output pins
111
121
switch (channel) {
112
122
case 0 :
113
123
for (int j = 0 ; j < rcfg.channel1_pins .size (); j++) {
114
- digitalWrite (rcfg.channel1_pins [j], (uvalue >> j) & 1 );
124
+ int pin = rcfg.channel1_pins [j];
125
+ if (pin >= 0 ) digitalWrite (pin, (uvalue >> j) & 1 );
115
126
}
116
127
break ;
117
128
case 1 :
118
129
for (int j = 0 ; j < rcfg.channel2_pins .size (); j++) {
119
- digitalWrite (rcfg.channel2_pins [j], (uvalue >> j) & 1 );
130
+ int pin = rcfg.channel2_pins [j];
131
+ if (pin >= 0 ) digitalWrite (pin, (uvalue >> j) & 1 );
120
132
}
121
133
break ;
122
134
}
0 commit comments