| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | #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, const std::byte* headingBytes) : bell::AudioContainer(istr) {  if (headingBytes != nullptr) {    memcpy(buffer.data(), headingBytes, 7);    bytesInBuffer = 7;  }}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;}void MP3Container::consumeBytes(uint32_t len) {  dataOffset += len;}std::byte* MP3Container::readSample(uint32_t& len) {  // Align data if previous read was offseted  if (dataOffset > 0 && bytesInBuffer > 0) {    size_t toConsume = std::min(dataOffset, bytesInBuffer);    memmove(buffer.data(), buffer.data() + toConsume,            buffer.size() - toConsume);    dataOffset -= toConsume;    bytesInBuffer -= toConsume;  }    if (!this->fillBuffer()) {    len = 0;    return nullptr;  }  int startOffset =      MP3FindSyncWord((uint8_t*)this->buffer.data(), bytesInBuffer);  if (startOffset < 0) {    // Discard word    dataOffset = MP3_MAX_FRAME_SIZE;    return nullptr;  }  dataOffset += startOffset;  len = bytesInBuffer - dataOffset;  return this->buffer.data() + dataOffset;}void MP3Container::parseSetupData() {  channels = 2;  sampleRate = bell::SampleRate::SR_44100;  bitWidth = bell::BitWidth::BW_16;}
 |