Gugen展示版
Fork of MagneWave by
MagneWave.cpp@6:d3e35dd7bfc5, 2013-11-08 (annotated)
- Committer:
- doctorura
- Date:
- Fri Nov 08 06:45:53 2013 +0000
- Revision:
- 6:d3e35dd7bfc5
- Parent:
- 5:a1c57d771887
- Child:
- 7:b0bb700d8383
change irq setting.
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 | 6:d3e35dd7bfc5 | 3 | |
doctorura | 2:0fc5df933021 | 4 | #define DATA_OFFSET 44 |
doctorura | 3:500b992880b3 | 5 | #define DAC16_CENTER 32768 |
doctorura | 6:d3e35dd7bfc5 | 6 | #define NEW_CODE |
doctorura | 2:0fc5df933021 | 7 | |
doctorura | 0:5a700113dd87 | 8 | MagneWave::MagneWave( SoftMCP4922 *dac ) |
doctorura | 0:5a700113dd87 | 9 | { |
doctorura | 0:5a700113dd87 | 10 | m_wave_DAC = dac; |
doctorura | 3:500b992880b3 | 11 | m_wave_DAC->write_u16( DAC16_CENTER ); |
doctorura | 4:8b4be75fd97a | 12 | |
doctorura | 4:8b4be75fd97a | 13 | m_wptr = 0; |
doctorura | 4:8b4be75fd97a | 14 | m_rptr = 0; |
doctorura | 4:8b4be75fd97a | 15 | m_dacOn = false; |
doctorura | 4:8b4be75fd97a | 16 | m_fileEnd = false; |
doctorura | 4:8b4be75fd97a | 17 | |
doctorura | 6:d3e35dd7bfc5 | 18 | NVIC_SetPriority(SysTick_IRQn, 1); |
doctorura | 4:8b4be75fd97a | 19 | tick.attach_us( this, &MagneWave::dacOut, 125 ); |
doctorura | 0:5a700113dd87 | 20 | } |
doctorura | 0:5a700113dd87 | 21 | |
doctorura | 0:5a700113dd87 | 22 | void MagneWave::play( FILE *wavefile ) |
doctorura | 0:5a700113dd87 | 23 | { |
doctorura | 6:d3e35dd7bfc5 | 24 | m_wptr = 0; |
doctorura | 6:d3e35dd7bfc5 | 25 | m_rptr = 0; |
doctorura | 4:8b4be75fd97a | 26 | m_dacOn = true; |
doctorura | 4:8b4be75fd97a | 27 | m_fileEnd = false; |
doctorura | 0:5a700113dd87 | 28 | |
doctorura | 0:5a700113dd87 | 29 | // jump to wave data |
doctorura | 2:0fc5df933021 | 30 | fseek( wavefile, DATA_OFFSET, SEEK_SET ); |
doctorura | 0:5a700113dd87 | 31 | |
doctorura | 5:a1c57d771887 | 32 | while( m_dacOn ){ |
doctorura | 5:a1c57d771887 | 33 | if( m_rptr != ( m_wptr + 1 ) & 0x7f ){ |
doctorura | 6:d3e35dd7bfc5 | 34 | #ifdef NEW_CODE |
doctorura | 6:d3e35dd7bfc5 | 35 | int tmpL = 0; |
doctorura | 6:d3e35dd7bfc5 | 36 | int tmpH = 0; |
doctorura | 6:d3e35dd7bfc5 | 37 | long dacVal16 = 0; |
doctorura | 6:d3e35dd7bfc5 | 38 | tmpL = fgetc( m_wavefile ); |
doctorura | 6:d3e35dd7bfc5 | 39 | if( tmpL == EOF ){ |
doctorura | 4:8b4be75fd97a | 40 | m_fileEnd = true; |
doctorura | 4:8b4be75fd97a | 41 | break; |
doctorura | 4:8b4be75fd97a | 42 | } |
doctorura | 6:d3e35dd7bfc5 | 43 | tmpH = fgetc( m_wavefile ); |
doctorura | 6:d3e35dd7bfc5 | 44 | if( tmpH == EOF ){ |
doctorura | 6:d3e35dd7bfc5 | 45 | m_fileEnd = true; |
doctorura | 6:d3e35dd7bfc5 | 46 | break; |
doctorura | 6:d3e35dd7bfc5 | 47 | } |
doctorura | 6:d3e35dd7bfc5 | 48 | dacVal16 = tmpL; |
doctorura | 6:d3e35dd7bfc5 | 49 | dacVal16 |= ( tmpH << 8 ); |
doctorura | 6:d3e35dd7bfc5 | 50 | dacVal16 += DAC16_CENTER; |
doctorura | 6:d3e35dd7bfc5 | 51 | m_fifo[m_wptr]= ( unsigned short )dacVal16; |
doctorura | 6:d3e35dd7bfc5 | 52 | #else |
doctorura | 6:d3e35dd7bfc5 | 53 | size_t readSize = fread( (char *)m_fifo[m_wptr], 2, 1, wavefile); |
doctorura | 6:d3e35dd7bfc5 | 54 | if( readSize < 1 ){ |
doctorura | 6:d3e35dd7bfc5 | 55 | m_fileEnd = true; |
doctorura | 6:d3e35dd7bfc5 | 56 | break; |
doctorura | 6:d3e35dd7bfc5 | 57 | } |
doctorura | 6:d3e35dd7bfc5 | 58 | #endif |
doctorura | 5:a1c57d771887 | 59 | m_wptr = ( m_wptr + 1 ) & 0x7f; |
doctorura | 0:5a700113dd87 | 60 | } |
doctorura | 0:5a700113dd87 | 61 | } |
doctorura | 0:5a700113dd87 | 62 | } |
doctorura | 3:500b992880b3 | 63 | |
doctorura | 4:8b4be75fd97a | 64 | void MagneWave::dacOut() |
doctorura | 4:8b4be75fd97a | 65 | { |
doctorura | 4:8b4be75fd97a | 66 | if ( m_dacOn ) { |
doctorura | 4:8b4be75fd97a | 67 | if( m_rptr != m_wptr ){ |
doctorura | 6:d3e35dd7bfc5 | 68 | #ifdef NEW_CODE |
doctorura | 6:d3e35dd7bfc5 | 69 | m_wave_DAC->write_u16( m_fifo[ m_rptr ] ); |
doctorura | 6:d3e35dd7bfc5 | 70 | #else |
doctorura | 5:a1c57d771887 | 71 | unsigned short tmpL = ( m_fifo[ m_rptr ] >> 8) & 0x00ff; |
doctorura | 5:a1c57d771887 | 72 | unsigned short tmpH = ( m_fifo[ m_rptr ] << 8) & 0xff00; |
doctorura | 5:a1c57d771887 | 73 | short dacVal16 = tmpH | tmpL; |
doctorura | 5:a1c57d771887 | 74 | |
doctorura | 4:8b4be75fd97a | 75 | dacVal16 += DAC16_CENTER; |
doctorura | 4:8b4be75fd97a | 76 | m_wave_DAC->write_u16( dacVal16 ); |
doctorura | 6:d3e35dd7bfc5 | 77 | #endif |
doctorura | 5:a1c57d771887 | 78 | m_rptr = ( m_rptr + 1 ) & 0x7f; |
doctorura | 4:8b4be75fd97a | 79 | }else{ |
doctorura | 6:d3e35dd7bfc5 | 80 | printf("nohit\n"); |
doctorura | 4:8b4be75fd97a | 81 | if( m_fileEnd ){ |
doctorura | 6:d3e35dd7bfc5 | 82 | printf("eof\n"); |
doctorura | 4:8b4be75fd97a | 83 | m_wptr = 0; |
doctorura | 4:8b4be75fd97a | 84 | m_rptr = 0; |
doctorura | 4:8b4be75fd97a | 85 | m_dacOn = false; |
doctorura | 4:8b4be75fd97a | 86 | m_fileEnd = false; |
doctorura | 4:8b4be75fd97a | 87 | m_wave_DAC->write_u16( DAC16_CENTER ); |
doctorura | 4:8b4be75fd97a | 88 | } |
doctorura | 4:8b4be75fd97a | 89 | } |
doctorura | 4:8b4be75fd97a | 90 | } |
doctorura | 4:8b4be75fd97a | 91 | } |
doctorura | 4:8b4be75fd97a | 92 | |
doctorura | 4:8b4be75fd97a | 93 |