12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- #include "MP3Container.h"
- #include <cstring> // for memmove
- #include "StreamInfo.h" // for BitWidth, BitWidth::BW_16, SampleRate, Sampl...
- #include "mp3dec.h" // for MP3FindSyncWord
- using 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;
- }
|