Gugen展示版

Fork of MagneWave by kouzi osaki

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