| 1 | |
|---|---|
| 2 | // NES non-linear audio output handling. | 
| 3 | |
| 4 | // Nes_Snd_Emu 0.1.7. Copyright (C) 2003-2005 Shay Green. GNU LGPL license. | 
| 5 | |
| 6 | #ifndef NONLINEAR_BUFFER_H | 
| 7 | #define NONLINEAR_BUFFER_H | 
| 8 | |
| 9 | #include "Multi_Buffer.h" | 
| 10 | class Nes_Apu; | 
| 11 | |
| 12 | // Use to make samples non-linear in Blip_Buffer used for triangle, noise, and DMC only | 
| 13 | class Nes_Nonlinearizer { | 
| 14 | public: | 
| 15 | Nes_Nonlinearizer(); | 
| 16 | |
| 17 | // Must be called when buffer is cleared | 
| 18 | void clear() { accum = 0x8000; } | 
| 19 | |
| 20 | // Enable/disable non-linear output | 
| 21 | void enable( Nes_Apu&, bool = true ); | 
| 22 | |
| 23 | // Make at most 'count' samples in buffer non-linear and return number | 
| 24 | // of samples modified. This many samples must then be read out of the buffer. | 
| 25 | long make_nonlinear( Blip_Buffer&, long count ); | 
| 26 | |
| 27 | private: | 
| 28 | enum { shift = 5 }; | 
| 29 | enum { half = 0x8000 >> shift }; | 
| 30 | enum { entry_mask = half * 2 - 1 }; | 
| 31 | BOOST::uint16_t table [half * 2]; | 
| 32 | long accum; | 
| 33 | bool nonlinear; | 
| 34 | }; | 
| 35 | |
| 36 | class Nonlinear_Buffer : public Multi_Buffer { | 
| 37 | public: | 
| 38 | Nonlinear_Buffer(); | 
| 39 | ~Nonlinear_Buffer(); | 
| 40 | |
| 41 | // Enable/disable non-linear output | 
| 42 | void enable_nonlinearity( Nes_Apu&, bool = true ); | 
| 43 | |
| 44 | // Blip_Buffer to output other sound chips to | 
| 45 | Blip_Buffer* buffer() { return &buf; } | 
| 46 | |
| 47 | // See Multi_Buffer.h | 
| 48 | blargg_err_t sample_rate( long rate, int msec = blip_default_length ); | 
| 49 | using Multi_Buffer::sample_rate; | 
| 50 | void clock_rate( long ); | 
| 51 | void bass_freq( int ); | 
| 52 | void clear(); | 
| 53 | channel_t channel( int ); | 
| 54 | void end_frame( blip_time_t, bool unused = true ); | 
| 55 | long samples_avail() const; | 
| 56 | long read_samples( blip_sample_t*, long ); | 
| 57 | |
| 58 | private: | 
| 59 | Blip_Buffer buf; | 
| 60 | Blip_Buffer tnd; | 
| 61 | Nes_Nonlinearizer nonlinearizer; | 
| 62 | }; | 
| 63 | |
| 64 | #endif | 
| 65 | |
| 66 | 
