summaryrefslogtreecommitdiff
path: root/shared-module/audiomp3
AgeCommit message (Collapse)Author
2020-07-15MP3Decoder: take advantage of background callbackJeff Epler
Before this, the mp3 file would be read into the in-memory buffer only when new samples were actually needed. This meant that the time to read mp3 content always counted against the ~22ms audio buffer length. Now, when there's at least 1 full disk block of free space in the input buffer, we can request that the buffer be filled _after_ returning from audiomp3_mp3file_get_buffer and actually filling the DMA pointers. In this way, the time taken for reading MP3 data from flash/SD is less likely to cause an underrun of audio DMA. The existing calls to fill the inbuf remain, but in most cases during streaming these become no-ops because the buffer will be over half full.
2020-01-06Fix more build problemsJeff Epler
2020-01-06audiomp3: rename to MP3DecoderJeff Epler
2020-01-02MP3File: Add rms_level propertyJeff Epler
This lets a music player show it vu-meter style
2019-12-24MP3File: tweak buffer handlingJeff Epler
After adding the ability to change files in an existing MP3File object, it became apparent that at the beginning of a track some part of an existing buffer was playing first. I noticed that in get_buffer, the just-populated buffer wasn't being returned, but the other one was. But still after fixing this, I heard wrong audio at the beginning of a track, so I took the heavy duty approach and zeroed the buffers out. That means there's a remaining bug to chase, which is merely hidden by the memset()s.
2019-12-23MP3File: whitespaceJeff Epler
2019-12-23MP3File: Add a settable ".file" propertyJeff Epler
This enables jeplayer to allocate just one MP3File at startup, rather than have to make repeated large allocations while the application is running. The buffers have to be allocated their theoretical maximum, but that doesn't matter much as all the real-life MP3 files I checked needed that much allocation anyway.
2019-12-13MP3: look harder for frame infoJeff Epler
Apparently sometimes, a proper "frame info" block is not found after a "sync word". Keep looking for one as needed, instead of giving up after one try. This was one reason that the "bartlebeats" mp3s would not play.
2019-12-13MP3: skip ID3V2 metadataJeff Epler
This was one reason that the "bartlebeats" mp3s would not play.
2019-12-12MP3File: Fix stereo playback on samd AudioOutJeff Epler
There were several problems with the way this worked -- the read_count approach was too complicated and I made a mistake "simplifying" it from WaveFile. And when the right channel was returned, it was off by 1 byte, making it into static. Instead, directly track which is the "other" channel that has data available, and by using the right data type make the "+ channel" arithmetic give the right result. This requires a double cast (int16_t*)(void*) due to an alignment warning; the alignment is now ensured manually, but the compiler doesn't make the necessary inference that the low address bit must be clear.
2019-12-11MP3File: Avoid crash in get_buffer when deinittedJeff Epler
When a playing mp3 is deinitted, it's possible to reach get_buffer, but all the internal pointers are NULL. This would lead to a hard fault. Avoid it by returning GET_BUFFER_ERROR instead.
2019-12-10audiocore: Add MP3File using Adafruit_MP3 libraryJeff Epler