Skip to content

Commit e145464

Browse files
authored
Merge pull request arduino-libraries#7 from arduino-libraries/i2s-mono-support
Add mono input support for I2S playback
2 parents f206a0b + 26ea72b commit e145464

File tree

3 files changed

+58
-3
lines changed

3 files changed

+58
-3
lines changed

src/AudioOut.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,46 @@ void AudioOut::endInput(AudioIn* input)
6262
return input->end();
6363
}
6464

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+
65105
void AudioOut::adjustVolume(void* buffer, size_t size, int bitsPerSample)
66106
{
67107
int samples = size / (bitsPerSample / 8);

src/AudioOut.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ class AudioOut
4646
int resetInput(AudioIn* input);
4747
void endInput(AudioIn* input);
4848

49+
void monoToStereo(void* buffer, size_t size, int bitsPerSample);
50+
4951
private:
5052
void adjustVolume(void* buffer, size_t size, int bitsPerSample);
5153

src/AudioOutI2S.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ int AudioOutI2SClass::canPlay(AudioIn& input)
4141
return 0;
4242
}
4343

44-
if (channels != 2) {
44+
if (channels != 1 && channels != 2) {
4545
return 0;
4646
}
4747

@@ -146,9 +146,16 @@ void AudioOutI2SClass::onTransmit()
146146
return;
147147
}
148148

149+
int channels = _input->channels();
150+
149151
uint8_t data[512];
152+
size_t length = sizeof(data);
153+
154+
if (channels == 1) {
155+
length /= 2;
156+
}
150157

151-
int n = readInput(_input, data, sizeof(data));
158+
int n = readInput(_input, data, length);
152159

153160
if (n == 0) {
154161
if (!_loop) {
@@ -164,7 +171,13 @@ void AudioOutI2SClass::onTransmit()
164171
}
165172

166173
// 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;
168181
}
169182

170183
I2S.write(data, n);

0 commit comments

Comments
 (0)