Gugen展示版

Fork of MagneWave by kouzi osaki

Revision:
4:8b4be75fd97a
Parent:
3:500b992880b3
Child:
5:a1c57d771887
--- a/MagneWave.cpp	Sat Nov 02 08:14:03 2013 +0000
+++ b/MagneWave.cpp	Wed Nov 06 17:52:59 2013 +0000
@@ -7,53 +7,59 @@
 {
     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_timer.start();
-    m_timer.reset();
+    m_dacOn = true;
+    m_fileEnd = false;
     
     // jump to wave data
     fseek( wavefile, DATA_OFFSET, SEEK_SET );
     
-    while(1){
-#if 1    //16bit
-        int tmpL = 0;
-        int tmpH = 0;
-        long dacVal16 = 0;
-        tmpL = fgetc( wavefile );
-        if( tmpL == EOF ){
-            break;
-        }
-        tmpH = fgetc( wavefile );
-        if( tmpH == EOF ){
-            break;
+    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;
         }
-        dacVal16 = tmpL;
-        dacVal16 |= ( tmpH << 8 );
-        dacVal16 += DAC16_CENTER;
-        m_wave_DAC->write_u16( dacVal16 );
-
-        // TODO: adjust cycle
-        while( m_timer.read_us()< 125){}
-        m_timer.reset();
-        
-#else    // 8bit
-    
-        int dacVal8 = fgetc( wavefile );
-        
-        if( dacVal8 == EOF ){
-            break;
-        }
-        m_wave_DAC->write_u8( ( unsigned short )dacVal8 );
-        
-        // TODO: adjust cycle
-        while( m_timer.read_us()< 125){}
-        m_timer.reset();
-#endif
-
     }
-    m_timer.stop();
 }
 
+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 );
+            }
+        }
+    }
+}
+
+