Gugen展示版

Fork of MagneWave by kouzi osaki

Committer:
doctorura
Date:
Thu Nov 07 11:17:35 2013 +0000
Revision:
5:a1c57d771887
Parent:
4:8b4be75fd97a
Child:
6:d3e35dd7bfc5
bug fix

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 5:a1c57d771887 27 while( m_dacOn ){
doctorura 5:a1c57d771887 28 if( m_rptr != ( m_wptr + 1 ) & 0x7f ){
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 5:a1c57d771887 34 m_wptr = ( m_wptr + 1 ) & 0x7f;
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 5:a1c57d771887 43 unsigned short tmpL = ( m_fifo[ m_rptr ] >> 8) & 0x00ff;
doctorura 5:a1c57d771887 44 unsigned short tmpH = ( m_fifo[ m_rptr ] << 8) & 0xff00;
doctorura 5:a1c57d771887 45 short dacVal16 = tmpH | tmpL;
doctorura 5:a1c57d771887 46
doctorura 4:8b4be75fd97a 47 dacVal16 += DAC16_CENTER;
doctorura 4:8b4be75fd97a 48 m_wave_DAC->write_u16( dacVal16 );
doctorura 5:a1c57d771887 49 m_rptr = ( m_rptr + 1 ) & 0x7f;
doctorura 4:8b4be75fd97a 50 }else{
doctorura 4:8b4be75fd97a 51 if( m_fileEnd ){
doctorura 4:8b4be75fd97a 52 m_wptr = 0;
doctorura 4:8b4be75fd97a 53 m_rptr = 0;
doctorura 4:8b4be75fd97a 54 m_dacOn = false;
doctorura 4:8b4be75fd97a 55 m_fileEnd = false;
doctorura 4:8b4be75fd97a 56 m_wave_DAC->write_u16( DAC16_CENTER );
doctorura 4:8b4be75fd97a 57 }
doctorura 4:8b4be75fd97a 58 }
doctorura 4:8b4be75fd97a 59 }
doctorura 4:8b4be75fd97a 60 }
doctorura 4:8b4be75fd97a 61
doctorura 4:8b4be75fd97a 62