Gugen展示版
Fork of MagneWave by
MagneWave.cpp@9:486d9fde3e64, 2013-11-16 (annotated)
- Committer:
- doctorura
- Date:
- Sat Nov 16 05:27:07 2013 +0000
- Revision:
- 9:486d9fde3e64
- Parent:
- 8:34dc92a836a3
- Child:
- 10:8b31cb1e385b
playback speed bugfix
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 | 8:34dc92a836a3 | 16 | NVIC_SetPriority(SysTick_IRQn, 1); |
doctorura | 8:34dc92a836a3 | 17 | tick.attach_us( this, &MagneWave::dacOut, 125 ); |
doctorura | 0:5a700113dd87 | 18 | } |
doctorura | 0:5a700113dd87 | 19 | |
doctorura | 0:5a700113dd87 | 20 | void MagneWave::play( FILE *wavefile ) |
doctorura | 0:5a700113dd87 | 21 | { |
doctorura | 0:5a700113dd87 | 22 | // jump to wave data |
doctorura | 2:0fc5df933021 | 23 | fseek( wavefile, DATA_OFFSET, SEEK_SET ); |
doctorura | 0:5a700113dd87 | 24 | |
doctorura | 7:b0bb700d8383 | 25 | m_dacOn = true; |
doctorura | 7:b0bb700d8383 | 26 | m_fileEnd = false; |
doctorura | 7:b0bb700d8383 | 27 | |
doctorura | 5:a1c57d771887 | 28 | while( m_dacOn ){ |
doctorura | 9:486d9fde3e64 | 29 | if( m_rptr != ( ( m_wptr + 1 ) & 0x7f ) ){ |
doctorura | 9:486d9fde3e64 | 30 | |
doctorura | 9:486d9fde3e64 | 31 | short dacVal16 = 0; |
doctorura | 9:486d9fde3e64 | 32 | unsigned char tmp[2]; |
doctorura | 9:486d9fde3e64 | 33 | |
doctorura | 9:486d9fde3e64 | 34 | int ret = fread( tmp, 1, 2, wavefile); |
doctorura | 9:486d9fde3e64 | 35 | if( ret < 2 ){ |
doctorura | 9:486d9fde3e64 | 36 | printf("eof\n."); |
doctorura | 4:8b4be75fd97a | 37 | m_fileEnd = true; |
doctorura | 4:8b4be75fd97a | 38 | break; |
doctorura | 4:8b4be75fd97a | 39 | } |
doctorura | 9:486d9fde3e64 | 40 | dacVal16 = tmp[0]; |
doctorura | 9:486d9fde3e64 | 41 | dacVal16 |= ( tmp[1] << 8 ); |
doctorura | 6:d3e35dd7bfc5 | 42 | dacVal16 += DAC16_CENTER; |
doctorura | 9:486d9fde3e64 | 43 | |
doctorura | 6:d3e35dd7bfc5 | 44 | m_fifo[m_wptr]= ( unsigned short )dacVal16; |
doctorura | 5:a1c57d771887 | 45 | m_wptr = ( m_wptr + 1 ) & 0x7f; |
doctorura | 0:5a700113dd87 | 46 | } |
doctorura | 0:5a700113dd87 | 47 | } |
doctorura | 7:b0bb700d8383 | 48 | printf("off\n"); |
doctorura | 0:5a700113dd87 | 49 | } |
doctorura | 3:500b992880b3 | 50 | |
doctorura | 4:8b4be75fd97a | 51 | void MagneWave::dacOut() |
doctorura | 4:8b4be75fd97a | 52 | { |
doctorura | 4:8b4be75fd97a | 53 | if ( m_dacOn ) { |
doctorura | 4:8b4be75fd97a | 54 | if( m_rptr != m_wptr ){ |
doctorura | 6:d3e35dd7bfc5 | 55 | m_wave_DAC->write_u16( m_fifo[ m_rptr ] ); |
doctorura | 5:a1c57d771887 | 56 | m_rptr = ( m_rptr + 1 ) & 0x7f; |
doctorura | 4:8b4be75fd97a | 57 | }else{ |
doctorura | 8:34dc92a836a3 | 58 | //printf("nohit r=%d,w=%d\n", m_rptr, m_wptr); |
doctorura | 7:b0bb700d8383 | 59 | //printf("nh\n"); |
doctorura | 4:8b4be75fd97a | 60 | if( m_fileEnd ){ |
doctorura | 6:d3e35dd7bfc5 | 61 | printf("eof\n"); |
doctorura | 4:8b4be75fd97a | 62 | m_wptr = 0; |
doctorura | 4:8b4be75fd97a | 63 | m_rptr = 0; |
doctorura | 4:8b4be75fd97a | 64 | m_dacOn = false; |
doctorura | 4:8b4be75fd97a | 65 | m_fileEnd = false; |
doctorura | 4:8b4be75fd97a | 66 | m_wave_DAC->write_u16( DAC16_CENTER ); |
doctorura | 4:8b4be75fd97a | 67 | } |
doctorura | 4:8b4be75fd97a | 68 | } |
doctorura | 4:8b4be75fd97a | 69 | } |
doctorura | 4:8b4be75fd97a | 70 | } |
doctorura | 4:8b4be75fd97a | 71 | |
doctorura | 4:8b4be75fd97a | 72 |