Gugen展示版
Fork of MagneWave by
MagneWave.cpp
- Committer:
- doctorura
- Date:
- 2013-11-07
- Revision:
- 5:a1c57d771887
- Parent:
- 4:8b4be75fd97a
- Child:
- 6:d3e35dd7bfc5
File content as of revision 5:a1c57d771887:
#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( m_dacOn ){ if( m_rptr != ( m_wptr + 1 ) & 0x7f ){ size_t readSize = fread( (char *)m_fifo[m_wptr], 2, 1, wavefile); if( readSize < 2 ){ m_fileEnd = true; break; } m_wptr = ( m_wptr + 1 ) & 0x7f; } } } void MagneWave::dacOut() { if ( m_dacOn ) { if( m_rptr != m_wptr ){ unsigned short tmpL = ( m_fifo[ m_rptr ] >> 8) & 0x00ff; unsigned short tmpH = ( m_fifo[ m_rptr ] << 8) & 0xff00; short dacVal16 = tmpH | tmpL; dacVal16 += DAC16_CENTER; m_wave_DAC->write_u16( dacVal16 ); m_rptr = ( m_rptr + 1 ) & 0x7f; }else{ if( m_fileEnd ){ m_wptr = 0; m_rptr = 0; m_dacOn = false; m_fileEnd = false; m_wave_DAC->write_u16( DAC16_CENTER ); } } } }