| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | #include "MP3Container.h"#include <cstring>  // for memmove#include "StreamInfo.h"  // for BitWidth, BitWidth::BW_16, SampleRate, Sampl...#include "mp3dec.h"      // for MP3FindSyncWordusing namespace bell;MP3Container::MP3Container(std::istream& istr) : bell::AudioContainer(istr) {}bool MP3Container::fillBuffer() {  if (this->bytesInBuffer < MP3_MAX_FRAME_SIZE * 2) {    this->istr.read((char*)buffer.data() + bytesInBuffer,                    buffer.size() - bytesInBuffer);    this->bytesInBuffer += istr.gcount();  }  return this->bytesInBuffer >= MP3_MAX_FRAME_SIZE * 2;}std::byte* MP3Container::readSample(uint32_t& len) {  if (!this->fillBuffer()) {    len = 0;    return nullptr;  }  // Align the data if previous read was offseted  if (toConsume > 0 && toConsume <= bytesInBuffer) {    memmove(buffer.data(), buffer.data() + toConsume,            buffer.size() - toConsume);    bytesInBuffer = bytesInBuffer - toConsume;    toConsume = 0;  }  int startOffset =      MP3FindSyncWord((uint8_t*)this->buffer.data(), bytesInBuffer);  if (startOffset < 0) {    // Discard word    toConsume = MP3_MAX_FRAME_SIZE;    return nullptr;  }  len = bytesInBuffer - startOffset;  return this->buffer.data() + startOffset;}void MP3Container::parseSetupData() {  channels = 2;  sampleRate = bell::SampleRate::SR_44100;  bitWidth = bell::BitWidth::BW_16;}
 |