Gugen展示版
Fork of MagneWave by
MagneWave.cpp@5:a1c57d771887, 2013-11-07 (annotated)
- Committer:
- doctorura
- Date:
- Thu Nov 07 11:17:35 2013 +0000
- Revision:
- 5:a1c57d771887
- Parent:
- 4:8b4be75fd97a
- Child:
- 6:d3e35dd7bfc5
bug fix
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
doctorura | 0:5a700113dd87 | 1 | #include "MagneWave.h" |
doctorura | 0:5a700113dd87 | 2 | |
doctorura | 2:0fc5df933021 | 3 | #define DATA_OFFSET 44 |
doctorura | 3:500b992880b3 | 4 | #define DAC16_CENTER 32768 |
doctorura | 2:0fc5df933021 | 5 | |
doctorura | 0:5a700113dd87 | 6 | MagneWave::MagneWave( SoftMCP4922 *dac ) |
doctorura | 0:5a700113dd87 | 7 | { |
doctorura | 0:5a700113dd87 | 8 | m_wave_DAC = dac; |
doctorura | 3:500b992880b3 | 9 | m_wave_DAC->write_u16( DAC16_CENTER ); |
doctorura | 4:8b4be75fd97a | 10 | |
doctorura | 4:8b4be75fd97a | 11 | m_wptr = 0; |
doctorura | 4:8b4be75fd97a | 12 | m_rptr = 0; |
doctorura | 4:8b4be75fd97a | 13 | m_dacOn = false; |
doctorura | 4:8b4be75fd97a | 14 | m_fileEnd = false; |
doctorura | 4:8b4be75fd97a | 15 | |
doctorura | 4:8b4be75fd97a | 16 | tick.attach_us( this, &MagneWave::dacOut, 125 ); |
doctorura | 0:5a700113dd87 | 17 | } |
doctorura | 0:5a700113dd87 | 18 | |
doctorura | 0:5a700113dd87 | 19 | void MagneWave::play( FILE *wavefile ) |
doctorura | 0:5a700113dd87 | 20 | { |
doctorura | 4:8b4be75fd97a | 21 | m_dacOn = true; |
doctorura | 4:8b4be75fd97a | 22 | m_fileEnd = false; |
doctorura | 0:5a700113dd87 | 23 | |
doctorura | 0:5a700113dd87 | 24 | // jump to wave data |
doctorura | 2:0fc5df933021 | 25 | fseek( wavefile, DATA_OFFSET, SEEK_SET ); |
doctorura | 0:5a700113dd87 | 26 | |
doctorura | 5:a1c57d771887 | 27 | while( m_dacOn ){ |
doctorura | 5:a1c57d771887 | 28 | if( m_rptr != ( m_wptr + 1 ) & 0x7f ){ |
doctorura | 4:8b4be75fd97a | 29 | size_t readSize = fread( (char *)m_fifo[m_wptr], 2, 1, wavefile); |
doctorura | 4:8b4be75fd97a | 30 | if( readSize < 2 ){ |
doctorura | 4:8b4be75fd97a | 31 | m_fileEnd = true; |
doctorura | 4:8b4be75fd97a | 32 | break; |
doctorura | 4:8b4be75fd97a | 33 | } |
doctorura | 5:a1c57d771887 | 34 | m_wptr = ( m_wptr + 1 ) & 0x7f; |
doctorura | 0:5a700113dd87 | 35 | } |
doctorura | 0:5a700113dd87 | 36 | } |
doctorura | 0:5a700113dd87 | 37 | } |
doctorura | 3:500b992880b3 | 38 | |
doctorura | 4:8b4be75fd97a | 39 | void MagneWave::dacOut() |
doctorura | 4:8b4be75fd97a | 40 | { |
doctorura | 4:8b4be75fd97a | 41 | if ( m_dacOn ) { |
doctorura | 4:8b4be75fd97a | 42 | if( m_rptr != m_wptr ){ |
doctorura | 5:a1c57d771887 | 43 | unsigned short tmpL = ( m_fifo[ m_rptr ] >> 8) & 0x00ff; |
doctorura | 5:a1c57d771887 | 44 | unsigned short tmpH = ( m_fifo[ m_rptr ] << 8) & 0xff00; |
doctorura | 5:a1c57d771887 | 45 | short dacVal16 = tmpH | tmpL; |
doctorura | 5:a1c57d771887 | 46 | |
doctorura | 4:8b4be75fd97a | 47 | dacVal16 += DAC16_CENTER; |
doctorura | 4:8b4be75fd97a | 48 | m_wave_DAC->write_u16( dacVal16 ); |
doctorura | 5:a1c57d771887 | 49 | m_rptr = ( m_rptr + 1 ) & 0x7f; |
doctorura | 4:8b4be75fd97a | 50 | }else{ |
doctorura | 4:8b4be75fd97a | 51 | if( m_fileEnd ){ |
doctorura | 4:8b4be75fd97a | 52 | m_wptr = 0; |
doctorura | 4:8b4be75fd97a | 53 | m_rptr = 0; |
doctorura | 4:8b4be75fd97a | 54 | m_dacOn = false; |
doctorura | 4:8b4be75fd97a | 55 | m_fileEnd = false; |
doctorura | 4:8b4be75fd97a | 56 | m_wave_DAC->write_u16( DAC16_CENTER ); |
doctorura | 4:8b4be75fd97a | 57 | } |
doctorura | 4:8b4be75fd97a | 58 | } |
doctorura | 4:8b4be75fd97a | 59 | } |
doctorura | 4:8b4be75fd97a | 60 | } |
doctorura | 4:8b4be75fd97a | 61 | |
doctorura | 4:8b4be75fd97a | 62 |