@@ -48,7 +48,7 @@ I2S::I2S(PinMode direction) {
48
48
_freq = 48000 ;
49
49
_arb = nullptr ;
50
50
_cb = nullptr ;
51
- _buffers = 8 ;
51
+ _buffers = 6 ;
52
52
_bufferWords = 0 ;
53
53
_silenceSample = 0 ;
54
54
_isLSBJ = false ;
@@ -163,7 +163,7 @@ bool I2S::begin() {
163
163
_silenceSample = (a << 16 ) | a;
164
164
}
165
165
if (!_bufferWords) {
166
- _bufferWords = 16 * (_bps == 32 ? 2 : 1 );
166
+ _bufferWords = 64 * (_bps == 32 ? 2 : 1 );
167
167
}
168
168
_arb = new AudioBufferManager (_buffers, _bufferWords, _silenceSample, _isOutput ? OUTPUT : INPUT);
169
169
_arb->begin (pio_get_dreq (_pio, _sm, _isOutput), _isOutput ? &_pio->txf [_sm] : (volatile void *)&_pio->rxf [_sm]);
@@ -187,10 +187,32 @@ void I2S::end() {
187
187
int I2S::available () {
188
188
if (!_running) {
189
189
return 0 ;
190
- } else if (_isOutput) {
191
- return availableForWrite (); // Do what I mean, not what I say
192
190
} else {
193
- return _arb->available ();
191
+ auto avail = _arb->available ();
192
+ switch (_bps) {
193
+ case 8 :
194
+ avail *= 4 ; // 4 samples per 32-bits
195
+ if (_isOutput) {
196
+ avail += (32 - _isHolding) / 8 ;
197
+ } else {
198
+ avail += _isHolding / 8 ;
199
+ }
200
+ break ;
201
+ case 16 :
202
+ avail *= 2 ; // 2 samples per 32-bits
203
+ if (_isOutput) {
204
+ avail += (32 - _isHolding) / 16 ;
205
+ } else {
206
+ avail += _isHolding / 16 ;
207
+ }
208
+ break ;
209
+ case 24 :
210
+ case 32 :
211
+ default :
212
+ // All stored in 32-bit words and no holding required
213
+ break ;
214
+ }
215
+ return avail;
194
216
}
195
217
}
196
218
@@ -219,7 +241,7 @@ int I2S::read() {
219
241
case 16 :
220
242
ret = _holdWord >> 16 ;
221
243
_holdWord <<= 16 ;
222
- _isHolding -= 32 ;
244
+ _isHolding -= 16 ;
223
245
return ret;
224
246
case 24 :
225
247
case 32 :
@@ -399,5 +421,5 @@ int I2S::availableForWrite() {
399
421
if (!_running || !_isOutput) {
400
422
return 0 ;
401
423
}
402
- return _arb-> available ();
424
+ return available ();
403
425
}
0 commit comments