Add the RTOS processing. for the Network radio streaming receiver.
Fork of VS1053b by
VS1053.h
- Committer:
- ban4jp
- Date:
- 2015-02-22
- Revision:
- 10:114ac02a3875
- Parent:
- 9:0d76f559a151
File content as of revision 10:114ac02a3875:
/* mbed VLSI VS1053b library * Copyright (c) 2010 Christian Schmiljun * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* This code based on: * mbeduino_MP3_Shield_MP3Player * http://mbed.org/users/xshige/programs/mbeduino_MP3_Shield_MP3Player/lgcx63 * 2010-10-16 */ #ifndef _VS1053_H #define _VS1053_H // ---------------------------------------------------------------------------- // Extended settings // ---------------------------------------------------------------------------- // Enable debug output (Output -> printf ...) // -------------------------------------------------------------------------- // #define DEBUG // #define DEBUGOUT (x,y...) printf(x, ##y); // Patches, Addons // -------------------------------------------------------------------------- // #define VS1053_PATCH_1_4_FLAC // #define VS1053_PATCH_1_5 // #define VS1053_PATCH_1_5_FLAC // #define VS1053_SPECANA // #define VS1053B_PCM_RECORDER_0_9 // ---------------------------------------------------------------------------- #include "defines.h" #include "mbed.h" #ifdef VS1053_RTOS #include "rtos.h" #define START_THREAD 1 #endif #if defined(VS1053_PATCH_1_4_FLAC) && defined(VS1053_PATCH_1_5) && defined(VS1053_PATCH_1_5_FLAC) && defined(VS1053_SPECANA) && defined(VS1053B_PCM_RECORDER_0_9) #error "VS1053: Exclusive use of patch and app versions." #endif #if defined(VS1053_PATCH_1_4_FLAC) || defined(VS1053_PATCH_1_5) || defined(VS1053_PATCH_1_5_FLAC) || defined(VS1053_SPECANA) || defined(VS1053B_PCM_RECORDER_0_9) #define VS_PATCH #endif #ifndef DEBUGOUT #define DEBUGOUT(x,y...) #endif #define DEFAULT_BALANCE_DIFERENCE_LEFT_RIGHT 0.0f #define DEFAULT_VOLUME -40.0f #define DEFAULT_BASS_AMPLITUDE 5 // 0 - 15 dB #define DEFAULT_BASS_FREQUENCY 100 // 20 - 150 Hz #define DEFAULT_TREBLE_AMPLITUDE 0 // -8 - 7 dB #define DEFAULT_TREBLE_FREQUENCY 15000 //1000 - 15000 Hz // SCI register address assignment #define SCI_MODE 0x00 #define SCI_STATUS 0x01 #define SCI_BASS 0x02 #define SCI_CLOCKF 0x03 #define SCI_DECODE_TIME 0x04 #define SCI_AUDATA 0x05 #define SCI_WRAM 0x06 #define SCI_WRAMADDR 0x07 #define SCI_HDAT0 0x08 #define SCI_HDAT1 0x09 #define SCI_AIADDR 0x0A #define SCI_VOL 0x0B #define SCI_AICTRL0 0x0C #define SCI_AICTRL1 0x0D #define SCI_AICTRL2 0x0E #define SCI_AICTRL3 0x0F //SCI_MODE register bits as of p.38 of the datasheet #define SM_DIFF 0x0001 #define SM_LAYER12 0x0002 #define SM_RESET 0x0004 #define SM_CANCEL 0x0008 #define SM_EARSPEAKER_LO 0x0010 #define SM_TESTS 0x0020 #define SM_STREAM 0x0040 #define SM_EARSPEAKER_HI 0x0080 #define SM_DACT 0x0100 #define SM_SDIORD 0x0200 #define SM_SDISHARE 0x0400 #define SM_SDINEW 0x0800 #define SM_ADPCM 0x1000 #define SM_B13 0x2000 #define SM_LINE1 0x4000 #define SM_CLK_RANGE 0x8000 //SCI_CLOCKF register bits as of p.42 of the datasheet #define SC_ADD_NOMOD 0x0000 #define SC_ADD_10x 0x0800 #define SC_ADD_15x 0x1000 #define SC_ADD_20x 0x1800 #define SC_MULT_XTALI 0x0000 #define SC_MULT_XTALIx20 0x2000 #define SC_MULT_XTALIx25 0x4000 #define SC_MULT_XTALIx30 0x6000 #define SC_MULT_XTALIx35 0x8000 #define SC_MULT_XTALIx40 0xA000 #define SC_MULT_XTALIx45 0xC000 #define SC_MULT_XTALIx50 0xE000 // Extra Parameter in X memory (refer to p.58 of the datasheet) #define para_chipID_0 0x1E00 #define para_chipID_1 0x1E01 #define para_version 0x1E02 #define para_config1 0x1E03 #define para_playSpeed 0x1E04 #define para_byteRate 0x1E05 #define para_endFillByte 0x1E06 // #define para_positionMsec_0 0x1E27 #define para_positionMsec_1 0x1E28 #define para_resync 0x1E29 #ifdef VS1053_RTOS #define INTERRUPT_HANDLER_ENABLE _isPlay = true #define INTERRUPT_HANDLER_DISABLE _isPlay = false #else #define INTERRUPT_HANDLER_ENABLE _DREQ_INTERUPT_IN.rise(this, &VS1053::dataRequestHandler); timer.attach_us(this, &VS1053::dataRequestHandler, 1000) #define INTERRUPT_HANDLER_DISABLE _DREQ_INTERUPT_IN.rise(NULL); timer.detach() #endif /** Types of audio streams * */ enum AudioType { WAV, /*!< WAVE audio stream */ AAC, /*!< AAC audio stream (ADTS (.aac), MPEG2 ADIF (.aac) and MPEG4 AUDIO (.mp4 / .m4a / .3gp / .3g2)) */ WMA, /*!< Windows Media Audio (WMA) stream */ MIDI, /*!< Midi audio stream */ OGG_VORBIS, /*!< Ogg Vorbis audio stream */ MP3, /*!< MPEG Audio Layer */ UNKNOWN /*!< Unknown */ }; typedef enum AudioType AudioType; /** Types of MPEG Audio Layer stream IDs. * */ enum MP3_ID { MPG2_5a = 0, /*!< MPG 2.5, nonstandard, proprietary */ MPG2_5b = 1, /*!< MPG 2.5, nonstandard, proprietary */ MPG2_0 = 2, /*!< ISO 13818-3 MPG 2.0 */ MPG1_0 = 3 /*!< ISO 11172-3 MPG 1.0 */ }; typedef enum MP3_ID MP3_ID; /** Types of MPEG Audio Layer channel modes. * */ enum MP3_MODE { STEREO = 0, /*!< Stereo */ JOINT_STEREO = 1, /*!< Joint Stereo */ DUAL_CHANNEL = 2, /*!< Dual Channel */ MONO = 3 /*!< Mono */ }; typedef enum MP3_MODE MP3_MODE; /** Struct for informations about audio streams. * */ typedef struct AudioInfo { AudioType type : 4; /*!< Type of the audio stream - important for the interpretation of the lower union */ unsigned short kBitRate; /*!< Average bitrate of the audio stream - in kBit/s */ unsigned short decodeTime; /*!< Decode time */ union { struct { MP3_ID id : 2; /*!< ID */ char layer : 2; /*!< Layer */ char protrectBit : 1; /*!< Protect bit, see p.44 of the datasheet */ char padBit : 1; /*!< Pad bit, see p.44 of the datasheet */ MP3_MODE mode : 2; /*!< Channel mode */ char extension : 2; /*!< Extension, see p.44 of the datasheet */ char copyright : 1; /*!< Copyright, see p.44 of the datasheet */ char original : 1; /*!< Original, see p.44 of the datasheet */ char emphasis : 2; /*!< Emphasis, see p.44 of the datasheet */ char kSampleRate : 6; /*!< Samplerate - in kHz (rounded) */ } mp3; /*!< MPEG Audio Layer */ struct { } wma; /*!< Windows Media Audio (WMA) stream */ struct { } aac; /*!< AAC audio stream */ struct { } other; /*!< Other */ } ext; } AudioInfo; /** Class for VS1053 - Ogg Vorbis / MP3 / AAC / WMA / FLAC / MIDI Audio Codec Chip. * Datasheet, see http://www.vlsi.fi/fileadmin/datasheets/vlsi/vs1053.pdf * * This code based on: * mbeduino_MP3_Shield_MP3Player * http://mbed.org/users/xshige/programs/mbeduino_MP3_Shield_MP3Player/lgcx63 * 2010-10-16 * * For the use of this class, a file "defines.h" must be created. * It controls debug output and vs1053 patches. * * defines.h: *@code * #ifndef _DEFINES_H * #define _DEFINES_H * // ---------------------------------------------------------------------------- * // debug output * // ---------------------------------------------------------------------------- * // optional * #define DEBUG * #ifdef DEBUG * # define DEBUGOUT(x,y...) printf(x, ##y); * #else * # define DEBUGOUT(x,y...) * #endif * // ---------------------------------------------------------------------------- * // VLSI VS1053b library, patch, apps * // ---------------------------------------------------------------------------- * // optional, ONLY ONE * //#define VS1053_PATCH_1_4_FLAC * //#define VS1053_PATCH_1_5 * #define VS1053_PATCH_1_5_FLAC * //#define VS1053_SPECANA * //#define VS1053B_PCM_RECORDER_0_9 * * #endif //_DEFINES_H *@endcode * * For a complete sample, see http://mbed.org/users/christi_s/programs/Lib_VS1053b * */ class VS1053 { public: /** Create a vs1053b object. * * @param mosi * SPI Master Out, Slave In pin to vs1053b. * @param miso * SPI Master In, Slave Out pin to vs1053b. * @param sck * SPI Clock pin to vs1053b. * @param cs * Pin to vs1053b control chip select. * @param rst * Pin to vs1053b reset. * @param dreq * Pin to vs1053b data request. * @param dcs * Pin to vs1053b data chip select. * @param buffer * Array to cache audio data. * @param buffer_size * Length of the array. */ VS1053( PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst, PinName dreq, PinName dcs, char* buffer, int buffer_size ); /** Reset the vs1053b. (hardware reset) * */ void reset(void); /** Stop the playback if the song is completed. * You must call this function for default playback. * */ void terminateStream(void); /** Initialize the vs1053b device. * * @return * TRUE on success, FALSE on failure. */ bool initialize(void); /** Set the volume. * * @param volume * Volume -0.5dB, -1.0dB, .. -64.0dB. */ void setVolume(float volume = DEFAULT_VOLUME); /** Get the volume. * * @return * Return the volume in dB. */ float getVolume(); /** Set the balance - volume difference between left-right. * * @param balance * Difference in dB. */ void setBalance(float balance = DEFAULT_BALANCE_DIFERENCE_LEFT_RIGHT); /** Get the balance - volume difference between left-right. * * @return * Difference in dB. */ float getBalance(); /** Get the treble frequency limit. * * @return * Frequenzy 1000, 2000 .. 15000Hz. */ int getTrebleFrequency(void); /** Set the treble frequency limit. * * @param frequency * Frequenzy 1000, 2000, .. 15000Hz. */ void setTrebleFrequency(int frequency = DEFAULT_TREBLE_FREQUENCY); /** Get the treble amplitude. * * @return * Amplitude -8 .. 7dB (in 1.5dB steps); 0 = off. */ int getTrebleAmplitude(void); /** Set the treble amplitude. * * @param amplitude * Amplitude -8 .. 7dB (in 1.5dB steps); 0 = off. */ void setTrebleAmplitude(int amplitude = DEFAULT_TREBLE_AMPLITUDE); /** Get the bass frequency limit. * * @return * Frequenzy 20, 30, .. 150Hz. */ int getBassFrequency(void); /** Set the bass frequency limit. * * @param frequency * Frequenzy 20, 30, .. 150Hz. */ void setBassFrequency(int frequency= DEFAULT_BASS_FREQUENCY); /** Get the bass amplitude. * * @return * Amplitude 0 .. 15dB (in 1dB steps); 0 = off. */ int getBassAmplitude(void); /** Set the bass amplitude. * * @param amplitude * Amplitude 0 .. 15dB (in 1dB steps); 0 = off. */ void setBassAmplitude(int amplitude = DEFAULT_BASS_AMPLITUDE); /** Set the speed of a playback. * * @param speed * Speed 0, 1, .. (0, 1 normal speed). * Speeds greater 2 are not recommended, buffer must be filled quickly enough. */ void setPlaySpeed(unsigned short speed); /** Copy a byte into the audio data buffer. * * @param c * Data for the buffer. * * @return * TRUE on success; FALSE on failure, c isn't copied in the buffer. */ bool bufferSetByte(char c); /** Copy a array of bytes into the audio data buffer. * * @param s * Data for the buffer. * * @param length * Size of data array. * * @return * TRUE on success; FALSE on failure, s isn't copied in the buffer. */ bool bufferPutStream(const char *s, unsigned int length); /** Get the free space of the audio data buffer. * * @return * Space 0 .. BUFFER_SIZE - 1. */ unsigned int bufferFree(void); /** Get the busy space of the audio data buffer. * * @return * Space 0 .. BUFFER_SIZE - 1. */ unsigned int bufferCount(void); /** Complete length of the audio buffer. * * @return * Buffer length. */ unsigned int bufferLength(void); /** Start playing audio from buffer. * */ void play(void); /** Interrupt the playback. * */ void pause(void); /** Stop the playback in the middle of a song. * After this call, you can now send the next audio file to buffer. * */ void stop(void); /** Get information about played audio stream. * * @param aInfo * Return value for the informations. * */ void getAudioInfo(AudioInfo* aInfo); protected: unsigned short int wram_read(unsigned short int); void wram_write(unsigned short int, unsigned short int); void write_plugin(const unsigned short* , unsigned int); void cs_low(void); void cs_high(void); void dcs_low(void); void dcs_high(void); void sci_en(void); void sci_dis(void); void sdi_en(void); void sdi_dis(void); void spi_initialise(void); void sdi_initialise(void); void sci_write(unsigned char, unsigned short int); void sdi_write(unsigned char); unsigned short int sci_read(unsigned short int); void sine_test_activate(unsigned char); void sine_test_deactivate(void); void changeVolume(void); // TODO void power_down(void); void changeBass(void); unsigned char bufferGetByte(void); void bufferReset(void); #ifdef VS1053_RTOS static void dataRequestHandler_start(const void *args); #endif void dataRequestHandler(void); SPI _spi; DigitalOut _CS; DigitalOut _RST; DigitalOut _DCS; DigitalIn _DREQ; #ifdef DEBUG DigitalOut _led; #endif #ifdef VS1053_RTOS Thread _thread; #else InterruptIn _DREQ_INTERUPT_IN; #endif char* _buffer; char* _bufferReadPointer; char* _bufferWritePointer; int BUFFER_SIZE; bool _isIdle; bool _isPlay; // variables to save // volume, values in db float _balance; float _volume; // bass enhancer settings int _sb_amplitude; int _sb_freqlimit; int _st_amplitude; int _st_freqlimit; Ticker timer; static const char _sampleRateTable[4][4]; // _sampleRateTable[id][srate] }; #endif