1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- #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) : 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;
- }
|