Gugen展示版
Fork of MagneWave by
MagneWave.cpp
- Committer:
- doctorura
- Date:
- 2013-11-06
- Revision:
- 4:8b4be75fd97a
- Parent:
- 3:500b992880b3
- Child:
- 5:a1c57d771887
File content as of revision 4:8b4be75fd97a:
#include "MagneWave.h" #define DATA_OFFSET 44 #define DAC16_CENTER 32768 MagneWave::MagneWave( SoftMCP4922 *dac ) { m_wave_DAC = dac; m_wave_DAC->write_u16( DAC16_CENTER ); m_wptr = 0; m_rptr = 0; m_dacOn = false; m_fileEnd = false; tick.attach_us( this, &MagneWave::dacOut, 125 ); } void MagneWave::play( FILE *wavefile ) { m_dacOn = true; m_fileEnd = false; // jump to wave data fseek( wavefile, DATA_OFFSET, SEEK_SET ); while( 1 ){ if( m_rptr != ( m_wptr + 1 ) & 0xff ){ size_t readSize = fread( (char *)m_fifo[m_wptr], 2, 1, wavefile); if( readSize < 2 ){ m_fileEnd = true; break; } m_wptr = ( m_wptr + 1 ) & 0xff; } } } void MagneWave::dacOut() { if ( m_dacOn ) { if( m_rptr != m_wptr ){ unsigned short tmpL = 0; unsigned short tmpH = 0; unsigned short dacVal16 = 0; tmpL = ( m_fifo[ m_rptr ] >> 8) & 0x00ff; tmpH = ( m_fifo[ m_rptr ] << 8) & 0xff00; dacVal16 = tmpH | tmpL; dacVal16 += DAC16_CENTER; m_wave_DAC->write_u16( dacVal16 ); m_rptr = ( m_rptr + 1 ) & 0xff; }else{ if( m_fileEnd ){ m_wptr = 0; m_rptr = 0; m_dacOn = false; m_fileEnd = false; m_wave_DAC->write_u16( DAC16_CENTER ); } } } }