/ src / Adafruit_MP3.h
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