Gugen展示版

Fork of MagneWave by kouzi osaki

Committer:
doctorura
Date:
Wed Nov 06 17:52:59 2013 +0000
Revision:
4:8b4be75fd97a
Parent:
3:500b992880b3
Child:
5:a1c57d771887
fifo added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
doctorura 0:5a700113dd87 1 #include "MagneWave.h"
doctorura 0:5a700113dd87 2
doctorura 2:0fc5df933021 3 #define DATA_OFFSET 44
doctorura 3:500b992880b3 4 #define DAC16_CENTER 32768
doctorura 2:0fc5df933021 5
doctorura 0:5a700113dd87 6 MagneWave::MagneWave( SoftMCP4922 *dac )
doctorura 0:5a700113dd87 7 {
doctorura 0:5a700113dd87 8 m_wave_DAC = dac;
doctorura 3:500b992880b3 9 m_wave_DAC->write_u16( DAC16_CENTER );
doctorura 4:8b4be75fd97a 10
doctorura 4:8b4be75fd97a 11 m_wptr = 0;
doctorura 4:8b4be75fd97a 12 m_rptr = 0;
doctorura 4:8b4be75fd97a 13 m_dacOn = false;
doctorura 4:8b4be75fd97a 14 m_fileEnd = false;
doctorura 4:8b4be75fd97a 15
doctorura 4:8b4be75fd97a 16 tick.attach_us( this, &MagneWave::dacOut, 125 );
doctorura 0:5a700113dd87 17 }
doctorura 0:5a700113dd87 18
doctorura 0:5a700113dd87 19 void MagneWave::play( FILE *wavefile )
doctorura 0:5a700113dd87 20 {
doctorura 4:8b4be75fd97a 21 m_dacOn = true;
doctorura 4:8b4be75fd97a 22 m_fileEnd = false;
doctorura 0:5a700113dd87 23
doctorura 0:5a700113dd87 24 // jump to wave data
doctorura 2:0fc5df933021 25 fseek( wavefile, DATA_OFFSET, SEEK_SET );
doctorura 0:5a700113dd87 26
doctorura 4:8b4be75fd97a 27 while( 1 ){
doctorura 4:8b4be75fd97a 28 if( m_rptr != ( m_wptr + 1 ) & 0xff ){
doctorura 4:8b4be75fd97a 29 size_t readSize = fread( (char *)m_fifo[m_wptr], 2, 1, wavefile);
doctorura 4:8b4be75fd97a 30 if( readSize < 2 ){
doctorura 4:8b4be75fd97a 31 m_fileEnd = true;
doctorura 4:8b4be75fd97a 32 break;
doctorura 4:8b4be75fd97a 33 }
doctorura 4:8b4be75fd97a 34 m_wptr = ( m_wptr + 1 ) & 0xff;
doctorura 0:5a700113dd87 35 }
doctorura 0:5a700113dd87 36 }
doctorura 0:5a700113dd87 37 }
doctorura 3:500b992880b3 38
doctorura 4:8b4be75fd97a 39 void MagneWave::dacOut()
doctorura 4:8b4be75fd97a 40 {
doctorura 4:8b4be75fd97a 41 if ( m_dacOn ) {
doctorura 4:8b4be75fd97a 42 if( m_rptr != m_wptr ){
doctorura 4:8b4be75fd97a 43 unsigned short tmpL = 0;
doctorura 4:8b4be75fd97a 44 unsigned short tmpH = 0;
doctorura 4:8b4be75fd97a 45 unsigned short dacVal16 = 0;
doctorura 4:8b4be75fd97a 46 tmpL = ( m_fifo[ m_rptr ] >> 8) & 0x00ff;
doctorura 4:8b4be75fd97a 47 tmpH = ( m_fifo[ m_rptr ] << 8) & 0xff00;
doctorura 4:8b4be75fd97a 48
doctorura 4:8b4be75fd97a 49 dacVal16 = tmpH | tmpL;
doctorura 4:8b4be75fd97a 50 dacVal16 += DAC16_CENTER;
doctorura 4:8b4be75fd97a 51 m_wave_DAC->write_u16( dacVal16 );
doctorura 4:8b4be75fd97a 52 m_rptr = ( m_rptr + 1 ) & 0xff;
doctorura 4:8b4be75fd97a 53 }else{
doctorura 4:8b4be75fd97a 54 if( m_fileEnd ){
doctorura 4:8b4be75fd97a 55 m_wptr = 0;
doctorura 4:8b4be75fd97a 56 m_rptr = 0;
doctorura 4:8b4be75fd97a 57 m_dacOn = false;
doctorura 4:8b4be75fd97a 58 m_fileEnd = false;
doctorura 4:8b4be75fd97a 59 m_wave_DAC->write_u16( DAC16_CENTER );
doctorura 4:8b4be75fd97a 60 }
doctorura 4:8b4be75fd97a 61 }
doctorura 4:8b4be75fd97a 62 }
doctorura 4:8b4be75fd97a 63 }
doctorura 4:8b4be75fd97a 64
doctorura 4:8b4be75fd97a 65