File tree Expand file tree Collapse file tree 3 files changed +58
-3
lines changed Expand file tree Collapse file tree 3 files changed +58
-3
lines changed Original file line number Diff line number Diff line change @@ -62,6 +62,46 @@ void AudioOut::endInput(AudioIn* input)
62
62
return input->end ();
63
63
}
64
64
65
+ void AudioOut::monoToStereo (void * buffer, size_t size, int bitsPerSample)
66
+ {
67
+ int samples = size / (bitsPerSample / 8 );
68
+
69
+ if (bitsPerSample == 8 ) {
70
+ uint8_t * s = &((uint8_t *)buffer)[samples - 1 ];
71
+ uint8_t * d = &((uint8_t *)buffer)[samples * 2 - 1 ];
72
+
73
+ for (int i = 0 ; i < samples; i++) {
74
+ *d = *s;
75
+ d--;
76
+ *d = *s;
77
+ d--;
78
+ s--;
79
+ }
80
+ } else if (bitsPerSample == 16 ) {
81
+ int16_t * s = &((int16_t *)buffer)[samples - 1 ];
82
+ int16_t * d = &((int16_t *)buffer)[samples * 2 - 1 ];
83
+
84
+ for (int i = 0 ; i < samples; i++) {
85
+ *d = *s;
86
+ d--;
87
+ *d = *s;
88
+ d--;
89
+ s--;
90
+ }
91
+ } else if (bitsPerSample == 32 ) {
92
+ int32_t * s = &((int32_t *)buffer)[samples - 1 ];
93
+ int32_t * d = &((int32_t *)buffer)[samples * 2 - 1 ];
94
+
95
+ for (int i = 0 ; i < samples; i++) {
96
+ *d = *s;
97
+ d--;
98
+ *d = *s;
99
+ d--;
100
+ s--;
101
+ }
102
+ }
103
+ }
104
+
65
105
void AudioOut::adjustVolume (void * buffer, size_t size, int bitsPerSample)
66
106
{
67
107
int samples = size / (bitsPerSample / 8 );
Original file line number Diff line number Diff line change @@ -46,6 +46,8 @@ class AudioOut
46
46
int resetInput (AudioIn* input);
47
47
void endInput (AudioIn* input);
48
48
49
+ void monoToStereo (void * buffer, size_t size, int bitsPerSample);
50
+
49
51
private:
50
52
void adjustVolume (void * buffer, size_t size, int bitsPerSample);
51
53
Original file line number Diff line number Diff line change @@ -41,7 +41,7 @@ int AudioOutI2SClass::canPlay(AudioIn& input)
41
41
return 0 ;
42
42
}
43
43
44
- if (channels != 2 ) {
44
+ if (channels != 1 && channels != 2 ) {
45
45
return 0 ;
46
46
}
47
47
@@ -146,9 +146,16 @@ void AudioOutI2SClass::onTransmit()
146
146
return ;
147
147
}
148
148
149
+ int channels = _input->channels ();
150
+
149
151
uint8_t data[512 ];
152
+ size_t length = sizeof (data);
153
+
154
+ if (channels == 1 ) {
155
+ length /= 2 ;
156
+ }
150
157
151
- int n = readInput (_input, data, sizeof (data) );
158
+ int n = readInput (_input, data, length );
152
159
153
160
if (n == 0 ) {
154
161
if (!_loop) {
@@ -164,7 +171,13 @@ void AudioOutI2SClass::onTransmit()
164
171
}
165
172
166
173
// read the input (again)
167
- n = readInput (_input, data, sizeof (data));
174
+ n = readInput (_input, data, length);
175
+ }
176
+
177
+ if (channels == 1 ) {
178
+ monoToStereo (data, n, _input->bitsPerSample ());
179
+
180
+ n *= 2 ;
168
181
}
169
182
170
183
I2S.write (data, n);
You can’t perform that action at this time.
0 commit comments