aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/lib/mp3/src/Adafruit_MP3.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--circuitpython/lib/mp3/src/Adafruit_MP3.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/circuitpython/lib/mp3/src/Adafruit_MP3.h b/circuitpython/lib/mp3/src/Adafruit_MP3.h
new file mode 100644
index 0000000..6f524ad
--- /dev/null
+++ b/circuitpython/lib/mp3/src/Adafruit_MP3.h
@@ -0,0 +1,110 @@
+#ifndef LIB_ADAFRUIT_MP3_H
+#define LIB_ADAFRUIT_MP3_H
+
+#include "Arduino.h"
+
+#if defined(__MK66FX1M0__) || defined(__MK64FX512__) || defined(__MK20DX256__)|| defined(NRF52) // teensy 3.6, 3.5, 3.1/2, or Adafruit Feather nRF52
+#define ARM_MATH_CM4
+#endif
+
+#include "arm_math.h"
+#include "mp3dec.h"
+
+//TODO: decide on a reasonable buffer size
+#if defined(NRF52)
+#define MP3_OUTBUF_SIZE (4 * 1024)
+#define MP3_INBUF_SIZE (2 * 1024)
+
+#define BUFFER_LOWER_THRESH (1 * 1024)
+#else
+#define MP3_OUTBUF_SIZE (4 * 1024)
+#define MP3_INBUF_SIZE (2 * 1024)
+
+#define BUFFER_LOWER_THRESH (1 * 1024)
+#endif
+
+#define MP3_SAMPLE_RATE_DEFAULT 44100
+
+#if defined(__SAMD51__) // feather/metro m4
+
+#define MP3_TC TC2
+#define MP3_IRQn TC2_IRQn
+#define MP3_Handler TC2_Handler
+#define MP3_GCLK_ID TC2_GCLK_ID
+#define MP3_DMA_TRIGGER TC2_DMAC_ID_MC_0
+
+#elif defined(NRF52)
+
+#define MP3_TIMER NRF_TIMER1
+#define MP3_IRQn TIMER1_IRQn
+#define MP3_Handler TIMER1_IRQHandler
+
+#endif
+
+struct Adafruit_MP3_outbuf {
+ volatile int count;
+ int16_t buffer[MP3_OUTBUF_SIZE];
+};
+
+class Adafruit_MP3 {
+public:
+ Adafruit_MP3() : hMP3Decoder() { inbufend = (inBuf + MP3_INBUF_SIZE); }
+ ~Adafruit_MP3() { MP3FreeDecoder(hMP3Decoder); };
+ bool begin();
+ void setBufferCallback(int (*fun_ptr)(uint8_t *, int));
+ void setSampleReadyCallback(void (*fun_ptr)(int16_t, int16_t));
+
+ void play();
+ void pause();
+ void resume();
+
+ int tick();
+
+#if defined(__MK66FX1M0__) || defined(__MK64FX512__) || defined(__MK20DX256__) // teensy 3.6, 3.5, or 3.1/2
+ static IntervalTimer _MP3Timer;
+ static uint32_t currentPeriod;
+#endif
+
+ static uint8_t numChannels;
+
+protected:
+#if defined(__SAMD51__) // feather/metro m4
+ Tc *_tc;
+#endif
+ HMP3Decoder hMP3Decoder;
+
+ volatile int bytesLeft;
+ uint8_t *readPtr;
+ uint8_t *writePtr;
+ uint8_t inBuf[MP3_INBUF_SIZE];
+ uint8_t *inbufend;
+ bool playing = false;
+
+ int (*bufferCallback)(uint8_t *, int);
+ int findID3Offset(uint8_t *readPtr);
+
+};
+
+class Adafruit_MP3_DMA : public Adafruit_MP3 {
+public:
+ Adafruit_MP3_DMA() : Adafruit_MP3() {
+ framebuf = NULL;
+ decodeCallback = NULL;
+ }
+ ~Adafruit_MP3_DMA() {
+ if(framebuf != NULL) free(framebuf);
+ }
+
+ void getBuffers(int16_t **ping, int16_t **pong);
+ void setDecodeCallback(void (*fun_ptr)(int16_t *, int)) { decodeCallback = fun_ptr; }
+
+ void play();
+ int fill();
+private:
+ int16_t *framebuf, *leftover;
+ int leftoverSamples;
+ MP3FrameInfo frameInfo;
+ void (*decodeCallback)(int16_t *, int);
+};
+
+#endif