Mercurial > audlegacy
diff Plugins/Input/console/Spc_Emu.h @ 493:c04dff121e1d trunk
[svn] hostile merge, phase 2: reimport based on new plugin code
author | nenolod |
---|---|
date | Tue, 24 Jan 2006 20:19:01 -0800 |
parents | |
children | 61d78065b630 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/Input/console/Spc_Emu.h Tue Jan 24 20:19:01 2006 -0800 @@ -0,0 +1,86 @@ + +// Super Nintendo (SNES) SPC music file emulator + +// Game_Music_Emu 0.3.0 + +#ifndef SPC_EMU_H +#define SPC_EMU_H + +#include "Fir_Resampler.h" +#include "Music_Emu.h" +#include "Snes_Spc.h" + +class Spc_Emu : public Music_Emu { + enum { trailer_offset = 0x10200 }; +public: + // A gain of 1.0 results in almost no clamping. Default gain roughly + // matches volume of other emulators. + Spc_Emu( double gain = 1.4 ); + + // The Super Nintendo hardware samples at 32kHz. Other sample rates are + // handled by resampling the 32kHz output; emulation accuracy is not affected. + enum { native_sample_rate = 32000 }; + + // SPC file header + struct header_t + { + char tag [35]; + byte format; + byte version; + byte pc [2]; + byte a, x, y, psw, sp; + byte unused [2]; + char song [32]; + char game [32]; + char dumper [16]; + char comment [32]; + byte date [11]; + char len_secs [3]; + byte fade_msec [5]; + char author [32]; + byte mute_mask; + byte emulator; + byte unused2 [45]; + + enum { track_count = 1 }; + enum { copyright = 0 }; // no copyright field + }; + BOOST_STATIC_ASSERT( sizeof (header_t) == 0x100 ); + + // Load SPC data + blargg_err_t load( Data_Reader& ); + + // Load SPC using already-loaded header and remaining data + blargg_err_t load( header_t const&, Data_Reader& ); + + // Header for currently loaded SPC + header_t const& header() const { return *(header_t*) spc_data.begin(); } + + // Pointer and size for trailer data + byte const* trailer() const { return &spc_data [trailer_offset]; } + long trailer_size() const { return spc_data.size() - trailer_offset; } + + // If true, prevents channels and global volumes from being phase-negated + void disable_surround( bool disable = true ); + +public: + ~Spc_Emu(); + blargg_err_t set_sample_rate( long ); + void mute_voices( int ); + void start_track( int ); + void play( long, sample_t* ); + void skip( long ); + const char** voice_names() const; +public: + // deprecated + blargg_err_t init( long r, double gain = 1.4 ) { return set_sample_rate( r ); } +private: + blargg_vector<byte> spc_data; + Fir_Resampler<24> resampler; + Snes_Spc apu; +}; + +inline void Spc_Emu::disable_surround( bool b ) { apu.disable_surround( b ); } + +#endif +