MP3Container.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "MP3Container.h"
  2. using namespace bell;
  3. MP3Container::MP3Container(std::istream& istr) : bell::AudioContainer(istr) {}
  4. bool MP3Container::fillBuffer() {
  5. if (this->bytesInBuffer < MP3_MAX_FRAME_SIZE * 2) {
  6. this->istr.read((char*)buffer.data() + bytesInBuffer,
  7. buffer.size() - bytesInBuffer);
  8. this->bytesInBuffer += istr.gcount();
  9. }
  10. return this->bytesInBuffer >= MP3_MAX_FRAME_SIZE * 2;
  11. }
  12. std::byte* MP3Container::readSample(uint32_t& len) {
  13. if (!this->fillBuffer()) {
  14. len = 0;
  15. return nullptr;
  16. }
  17. // Align the data if previous read was offseted
  18. if (toConsume > 0 && toConsume <= bytesInBuffer) {
  19. memmove(buffer.data(), buffer.data() + toConsume,
  20. buffer.size() - toConsume);
  21. bytesInBuffer = bytesInBuffer - toConsume;
  22. toConsume = 0;
  23. }
  24. int startOffset =
  25. MP3FindSyncWord((uint8_t*)this->buffer.data(), bytesInBuffer);
  26. if (startOffset < 0) {
  27. // Discard word
  28. toConsume = MP3_MAX_FRAME_SIZE;
  29. return nullptr;
  30. }
  31. len = bytesInBuffer - startOffset;
  32. return this->buffer.data() + startOffset;
  33. }
  34. void MP3Container::parseSetupData() {
  35. channels = 2;
  36. sampleRate = bell::SampleRate::SR_44100;
  37. bitWidth = bell::BitWidth::BW_16;
  38. }