250 {
252 return false;
253 }
254
255
258
259 if (bytes_left == 0) {
260 return false;
261 }
262
263
266
268 return false;
269 }
270
274
275
276 const fl::u8* decode_ptr = inptr;
277 fl::size decode_bytes = bytes_left;
278
280
281
282 fl::size consumed = (decode_ptr - inptr);
285
287
288 Mp3Frame frame;
289 frame.pcm =
mDecoder->mPcmBuffer.get();
290 frame.samples =
mDecoder->mFrameInfo.outputSamps /
mDecoder->mFrameInfo.nChans;
291 frame.channels =
mDecoder->mFrameInfo.nChans;
292 frame.sample_rate =
mDecoder->mFrameInfo.samprate;
293 frame.bitrate =
mDecoder->mFrameInfo.bitrate;
294 frame.version =
mDecoder->mFrameInfo.version;
295 frame.layer =
mDecoder->mFrameInfo.layer;
296
297
299 mInfo.sampleRate = frame.sample_rate;
300 mInfo.channels =
static_cast<fl::u8>(frame.channels);
301 mInfo.bitrate = frame.bitrate;
302 mInfo.version =
static_cast<fl::u8>(frame.version);
304 mInfo.isValid =
true;
306 }
307
308
309 if (frame.channels == 2) {
310 fl::vector<fl::i16> mono_pcm;
311 mono_pcm.
reserve(frame.samples);
312
313 for (int i = 0; i < frame.samples; i++) {
314 fl::i32 left = frame.pcm[i * 2];
315 fl::i32 right = frame.pcm[i * 2 + 1];
316 fl::i32 avg = (left + right) / 2;
317 mono_pcm.
push_back(
static_cast<fl::i16
>(avg));
318 }
319
320 *out_sample = audio::Sample(mono_pcm);
321 } else {
322
323 *out_sample = audio::Sample(fl::span<const fl::i16>(frame.pcm, frame.samples));
324 }
325
326 return true;
327 }
328
329 return false;
330}
bool mHasDecodedFirstFrame
fl::unique_ptr< Mp3HelixDecoder > mDecoder
fl::vector< fl::u8 > mBuffer
void reserve(fl::size n) FL_NOEXCEPT
void push_back(const T &value) FL_NOEXCEPT
fl::UISlider offset("Offset", 0.0f, 0.0f, 1.0f, 0.01f)
expected< T, E > result
Alias for expected (Rust-style naming)