A library which allows the playing of Wav files using the TLV320

Dependents:   RSALB_hbridge_helloworld RSALB_lobster WavPlayer_test AudioCODEC_HelloWorld

Revision:
0:3695886f3495
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WavPlayer.h	Wed Sep 19 10:58:16 2012 +0000
@@ -0,0 +1,159 @@
+/**
+* @author Giles Barton-Owen
+*
+* @section LICENSE
+*
+* Copyright (c) 2012 mbed
+*
+* 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.
+*
+* @section DESCRIPTION
+*    A WAV player library for the TLV320 and the LPC1768's built in I2S peripheral
+*
+*/ 
+
+#ifndef WAVPLAYER_H
+#define WAVPLAYER_H
+
+#include "mbed.h"
+#include "WavPlayerConfig.h"
+#include "RingBuffer.h"
+#include "TLV320.h"
+#include "I2S.h"
+
+/** A class to play WAV files from a file system, tested with USB
+ *
+ * Example (note, this has requires the USB MSC library to be imported):
+ * @code
+ *
+ * #include "mbed.h"
+ * #include "WavPlayer.h"
+ * #include "MSCFileSystem.h"
+ * 
+ * MSCFileSystem msc("msc"); // Mount flash drive under the name "msc"
+ * WavPlayer player;
+ * 
+ * int main() {
+ *    FILE *fp = fopen("/msc/test.wav", "r");  // Open "out.txt" on the local file system for writing
+ *     player.open(&fp);
+ *     player.play();
+ *     fclose(fp);
+ * }
+ * @endcode
+ */
+
+
+class WavPlayer
+{
+public:
+      /** Create a WavPlayer instance
+     * 
+     */
+    WavPlayer();
+    
+    /** Create a WavPlayer instance
+     * 
+     * @param fpp A pointer to a file pointer to read out of
+     */
+    WavPlayer(FILE **fpp);
+    
+    /** Set the file to read out of
+     * 
+     * @param fpp A pointer to a file pointer to read out of
+     */
+    void open(FILE **fpp);
+    
+    /** Extract the header infomation, automatically called by open
+     */
+    int getConfig();
+    
+    /** Play the entire file. Blocking
+     */
+    float play();
+    
+    /** Play the file for a certain number of seconds. Blocking
+     *
+     * @param time The number of seconds to play the file for.
+     */
+    float play(float time);
+    
+    /** Play the file for a certain number of seconds, from a certain start point. Blocking
+     *
+     * @param start        The start time
+     * @param timefor     The number of seconds to play the file for.
+     */
+    float play(float start, float timefor);
+
+
+
+private:
+    WavPlayerConfig config;
+    FILE ** filepp;
+    RingBuffer rbuf;
+
+    I2S i2s;
+    TLV320 codec;
+    static void i2sisr();
+    void i2sisr_();
+    static WavPlayer* instance;
+
+    int fseekread(FILE *fp, char* str, int offset, int len);
+    uint32_t getu32(char str[], int len);
+    uint16_t getu16(char str[], int len);
+    int32_t get32(char str[], int len);
+    int16_t get16(char str[], int len);
+    uint32_t fsru32(FILE *fp, int offset, int len = 4);
+    uint16_t fsru16(FILE *fp, int offset, int len = 2);
+    void clear(char* str, int len);
+
+    int findChunk(FILE *fp, char* match, int len, int fileSize, int startOffset = 12);
+    int findChunk(FILE *fp, char* match, int len, int startOffset = 12);
+    void fgets_m(char* str, int num, FILE* fp);
+
+    float sine_gen(int16_t* buf, int len, float div, float phase);
+
+    bool flag_vol;
+    double volume;
+
+    bool stereo;
+
+    bool flag_play;
+
+    Timer timer;
+    
+    int isr_underrun;
+
+    float read_time;
+    int read_time_div;
+
+    float isr_time;
+    int isr_time_div;
+    
+    float current_time;
+    
+    int slow_count;
+
+    //Timer isrtimer;
+
+    //DigitalOut ext_flag;
+    //DigitalOut run_flag;
+
+};
+
+#endif