Adafruit_MP3.h
1 #ifndef LIB_ADAFRUIT_MP3_H 2 #define LIB_ADAFRUIT_MP3_H 3 4 #include "Arduino.h" 5 6 #if defined(__MK66FX1M0__) || defined(__MK64FX512__) || defined(__MK20DX256__)|| defined(NRF52) // teensy 3.6, 3.5, 3.1/2, or Adafruit Feather nRF52 7 #define ARM_MATH_CM4 8 #endif 9 10 #include "arm_math.h" 11 #include "mp3dec.h" 12 13 //TODO: decide on a reasonable buffer size 14 #if defined(NRF52) 15 #define MP3_OUTBUF_SIZE (4 * 1024) 16 #define MP3_INBUF_SIZE (2 * 1024) 17 18 #define BUFFER_LOWER_THRESH (1 * 1024) 19 #else 20 #define MP3_OUTBUF_SIZE (4 * 1024) 21 #define MP3_INBUF_SIZE (2 * 1024) 22 23 #define BUFFER_LOWER_THRESH (1 * 1024) 24 #endif 25 26 #define MP3_SAMPLE_RATE_DEFAULT 44100 27 28 #if defined(__SAMD51__) // feather/metro m4 29 30 #define MP3_TC TC2 31 #define MP3_IRQn TC2_IRQn 32 #define MP3_Handler TC2_Handler 33 #define MP3_GCLK_ID TC2_GCLK_ID 34 #define MP3_DMA_TRIGGER TC2_DMAC_ID_MC_0 35 36 #elif defined(NRF52) 37 38 #define MP3_TIMER NRF_TIMER1 39 #define MP3_IRQn TIMER1_IRQn 40 #define MP3_Handler TIMER1_IRQHandler 41 42 #endif 43 44 struct Adafruit_MP3_outbuf { 45 volatile int count; 46 int16_t buffer[MP3_OUTBUF_SIZE]; 47 }; 48 49 class Adafruit_MP3 { 50 public: 51 Adafruit_MP3() : hMP3Decoder() { inbufend = (inBuf + MP3_INBUF_SIZE); } 52 ~Adafruit_MP3() { MP3FreeDecoder(hMP3Decoder); }; 53 bool begin(); 54 void setBufferCallback(int (*fun_ptr)(uint8_t *, int)); 55 void setSampleReadyCallback(void (*fun_ptr)(int16_t, int16_t)); 56 57 void play(); 58 void pause(); 59 void resume(); 60 61 int tick(); 62 63 #if defined(__MK66FX1M0__) || defined(__MK64FX512__) || defined(__MK20DX256__) // teensy 3.6, 3.5, or 3.1/2 64 static IntervalTimer _MP3Timer; 65 static uint32_t currentPeriod; 66 #endif 67 68 static uint8_t numChannels; 69 70 protected: 71 #if defined(__SAMD51__) // feather/metro m4 72 Tc *_tc; 73 #endif 74 HMP3Decoder hMP3Decoder; 75 76 volatile int bytesLeft; 77 uint8_t *readPtr; 78 uint8_t *writePtr; 79 uint8_t inBuf[MP3_INBUF_SIZE]; 80 uint8_t *inbufend; 81 bool playing = false; 82 83 int (*bufferCallback)(uint8_t *, int); 84 int findID3Offset(uint8_t *readPtr); 85 86 }; 87 88 class Adafruit_MP3_DMA : public Adafruit_MP3 { 89 public: 90 Adafruit_MP3_DMA() : Adafruit_MP3() { 91 framebuf = NULL; 92 decodeCallback = NULL; 93 } 94 ~Adafruit_MP3_DMA() { 95 if(framebuf != NULL) free(framebuf); 96 } 97 98 void getBuffers(int16_t **ping, int16_t **pong); 99 void setDecodeCallback(void (*fun_ptr)(int16_t *, int)) { decodeCallback = fun_ptr; } 100 101 void play(); 102 int fill(); 103 private: 104 int16_t *framebuf, *leftover; 105 int leftoverSamples; 106 MP3FrameInfo frameInfo; 107 void (*decodeCallback)(int16_t *, int); 108 }; 109 110 #endif