Edited version of the wave player class that uses the MODDMA library to handle transfers to the DAC.

Dependencies:   MODDMA

Dependents:   WavePlayer_MODDMA wave_player_DMA_mbed

Committer:
ebradley6
Date:
Wed Mar 16 19:58:55 2016 +0000
Revision:
1:11a670498598
Parent:
0:286582877314
Updated comments.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ebradley6 0:286582877314 1 #include <mbed.h>
ebradley6 0:286582877314 2 #include "MODDMA.h"
ebradley6 0:286582877314 3
ebradley6 0:286582877314 4 #define BUF_SIZE 1000
ebradley6 0:286582877314 5
ebradley6 0:286582877314 6 typedef struct uFMT_STRUCT {
ebradley6 0:286582877314 7 short comp_code;
ebradley6 0:286582877314 8 short num_channels;
ebradley6 0:286582877314 9 unsigned sample_rate;
ebradley6 0:286582877314 10 unsigned avg_Bps;
ebradley6 0:286582877314 11 short block_align;
ebradley6 0:286582877314 12 short sig_bps;
ebradley6 0:286582877314 13 } FMT_STRUCT;
ebradley6 0:286582877314 14
ebradley6 0:286582877314 15
ebradley6 0:286582877314 16 /** wave file player class.
ebradley6 0:286582877314 17 *
ebradley6 0:286582877314 18 * Example:
ebradley6 0:286582877314 19 * @code
ebradley6 0:286582877314 20 * #include <mbed.h>
ebradley6 0:286582877314 21 * #include <wave_player.h>
ebradley6 0:286582877314 22 *
ebradley6 0:286582877314 23 * AnalogOut DACout(p18);
ebradley6 0:286582877314 24 * wave_player waver(&DACout);
ebradley6 0:286582877314 25 *
ebradley6 0:286582877314 26 * int main() {
ebradley6 0:286582877314 27 * FILE *wave_file;
ebradley6 0:286582877314 28 *
ebradley6 0:286582877314 29 * printf("\n\n\nHello, wave world!\n");
ebradley6 0:286582877314 30 * wave_file=fopen("/sd/44_8_st.wav","r");
ebradley6 0:286582877314 31 * waver.play(wave_file);
ebradley6 0:286582877314 32 * fclose(wave_file);
ebradley6 0:286582877314 33 * }
ebradley6 0:286582877314 34 * @endcode
ebradley6 0:286582877314 35 */
ebradley6 0:286582877314 36 class wave_player {
ebradley6 0:286582877314 37
ebradley6 0:286582877314 38 public:
ebradley6 0:286582877314 39 /** Create a wave player using a pointer to the given AnalogOut object.
ebradley6 0:286582877314 40 *
ebradley6 0:286582877314 41 * @param _dac pointer to an AnalogOut object to which the samples are sent.
ebradley6 0:286582877314 42 */
ebradley6 0:286582877314 43 wave_player(AnalogOut *_dac);
ebradley6 0:286582877314 44
ebradley6 0:286582877314 45 /** the player function.
ebradley6 0:286582877314 46 *
ebradley6 0:286582877314 47 * @param wavefile A pointer to an opened wave file
ebradley6 0:286582877314 48 */
ebradley6 0:286582877314 49 void play(FILE *wavefile);
ebradley6 0:286582877314 50
ebradley6 0:286582877314 51 /** Set the printf verbosity of the wave player. A nonzero verbosity level
ebradley6 0:286582877314 52 * will put wave_player in a mode where the complete contents of the wave
ebradley6 0:286582877314 53 * file are echoed to the screen, including header values, and including
ebradley6 0:286582877314 54 * all of the sample values placed into the DAC FIFO, and the sample values
ebradley6 0:286582877314 55 * removed from the DAC FIFO by the ISR. The sample output frequency is
ebradley6 0:286582877314 56 * fixed at 2 Hz in this mode, so it's all very slow and the DAC output isn't
ebradley6 0:286582877314 57 * very useful, but it lets you see what's going on and may help for debugging
ebradley6 0:286582877314 58 * wave files that don't play correctly.
ebradley6 0:286582877314 59 *
ebradley6 0:286582877314 60 * @param v the verbosity level
ebradley6 0:286582877314 61 */
ebradley6 0:286582877314 62 void set_verbosity(int v);
ebradley6 0:286582877314 63
ebradley6 0:286582877314 64 private:
ebradley6 0:286582877314 65 int verbosity;
ebradley6 0:286582877314 66 AnalogOut *wave_DAC;
ebradley6 0:286582877314 67 MODDMA dma;
ebradley6 0:286582877314 68 MODDMA_Config *conf0;
ebradley6 0:286582877314 69 MODDMA_Config *conf1;
ebradley6 0:286582877314 70 short DAC_on;
ebradley6 0:286582877314 71 uint32_t DAC_buf0[BUF_SIZE];
ebradley6 0:286582877314 72 uint32_t DAC_buf1[BUF_SIZE];
ebradley6 0:286582877314 73 void TC0_callback(void);
ebradley6 0:286582877314 74 void ERR0_callback(void);
ebradley6 0:286582877314 75 void TC1_callback(void);
ebradley6 0:286582877314 76 void ERR1_callback(void);
ebradley6 0:286582877314 77 bool dma0_fin_flag;
ebradley6 0:286582877314 78 bool dma1_fin_flag;
ebradley6 0:286582877314 79 };
ebradley6 0:286582877314 80
ebradley6 0:286582877314 81