Gugen展示版

Fork of MagneWave by kouzi osaki

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 );
            }
        }
    }
}