Hirokazu enya / MagneWave

Fork of MagneWave by kouzi osaki

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MagneWave.cpp Source File

MagneWave.cpp

00001 #include "MagneWave.h"
00002 
00003 #define DATA_OFFSET 44
00004 #define DAC16_CENTER  32768
00005 
00006 MagneWave::MagneWave( SoftMCP4922 *dac )
00007 {
00008     m_wave_DAC = dac;
00009     m_wave_DAC->write_u16( DAC16_CENTER );
00010     
00011     m_wptr = 0;
00012     m_rptr = 0;
00013     m_dacOn = false;
00014     m_fileEnd = false;
00015     
00016     NVIC_SetPriority(SysTick_IRQn, 1);
00017     tick.attach_us( this, &MagneWave::dacOut, 125 ); 
00018 }
00019 
00020 void MagneWave::play( FILE *wavefile )
00021 {
00022     // jump to wave data
00023     fseek( wavefile, DATA_OFFSET, SEEK_SET );
00024     
00025     m_dacOn = true;
00026     m_fileEnd = false;
00027     
00028     while( m_dacOn ){
00029         if( m_rptr != ( ( m_wptr + 1 ) & 0x7f ) ){
00030 
00031             short dacVal16 = 0;
00032             unsigned char tmp[2];
00033 
00034             int ret = fread( tmp, 1, 2, wavefile);
00035             if( ret < 2 ){
00036                 printf("eof\n\r");
00037                 m_fileEnd = true;
00038                 break;
00039             }
00040             dacVal16 = tmp[0];
00041             dacVal16 |= ( tmp[1] << 8 );
00042             dacVal16 += DAC16_CENTER;
00043             
00044             m_fifo[m_wptr]= ( unsigned short )dacVal16;
00045             m_wptr = ( m_wptr + 1 ) & 0x7f;
00046         }
00047     }
00048     printf("off\n\r");
00049 }
00050 
00051 void MagneWave::dacOut()
00052 {
00053     if ( m_dacOn ) {
00054         if( m_rptr != m_wptr ){
00055             m_wave_DAC->write_u16( m_fifo[ m_rptr ] );
00056             m_rptr = ( m_rptr + 1 ) & 0x7f;
00057         }else{
00058             //printf("nohit r=%d,w=%d\n", m_rptr, m_wptr);
00059             //printf("nh\n");
00060             if( m_fileEnd ){
00061                 printf("eof\n\r");
00062                 m_wptr = 0;
00063                 m_rptr = 0;
00064                 m_dacOn = false;
00065                 m_fileEnd = false;
00066                 m_wave_DAC->write_u16( DAC16_CENTER );
00067             }
00068         }
00069     }
00070 }
00071 
00072