Mercurial > audlegacy-plugins
diff src/console/Nsfe_Emu.h @ 12:3da1b8942b8b trunk
[svn] - remove src/Input src/Output src/Effect src/General src/Visualization src/Container
author | nenolod |
---|---|
date | Mon, 18 Sep 2006 03:14:20 -0700 |
parents | src/Input/console/Nsfe_Emu.h@13389e613d67 |
children | fb513e10174e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/console/Nsfe_Emu.h Mon Sep 18 03:14:20 2006 -0700 @@ -0,0 +1,103 @@ + +// Nintendo Entertainment System (NES) NSFE-format game music file emulator + +// Game_Music_Emu 0.3.0 + +#ifndef NSFE_EMU_H +#define NSFE_EMU_H + +#include "blargg_common.h" +#include "Nsf_Emu.h" + +// to do: eliminate dependence on bloated std vector +#include <vector> + +class Nsfe_Info { +public: + struct header_t + { + char tag [4]; // 'N', 'S', 'F', 'E' + }; + BOOST_STATIC_ASSERT( sizeof (header_t) == 4 ); + + // Load NSFE info and optionally load file into Nsf_Emu + blargg_err_t load_file( const char* path, Nsf_Emu* = 0 ); + + // Load NSFE info and optionally load file into Nsf_Emu + blargg_err_t load( Data_Reader&, Nsf_Emu* = 0 ); + + // Load NSFE info and optionally load file into Nsf_Emu + blargg_err_t load( header_t const&, Data_Reader&, Nsf_Emu* = 0 ); + + // Information about current file + struct info_t : Nsf_Emu::header_t + { + // These (longer) fields hide those in Nsf_Emu::header_t + char game [256]; + char author [256]; + char copyright [256]; + char ripper [256]; + }; + const info_t& info() const { return info_; } + + // All track indicies are 0-based + + // Name of track [i], or "" if none available + const char* track_name( unsigned i ) const; + + // Duration of track [i] in milliseconds, negative if endless, or 0 if none available + long track_time( unsigned i ) const; + + // Optional playlist consisting of track indicies + int playlist_size() const { return playlist.size(); } + int playlist_entry( int i ) const { return playlist [i]; } + + // If true and playlist is present in NSFE file, remap track numbers using it + void enable_playlist( bool = true ); + +public: + Nsfe_Info(); + ~Nsfe_Info(); + int track_count() const { return info_.track_count; } +private: + std::vector<char> track_name_data; + std::vector<const char*> track_names; + std::vector<unsigned char> playlist; + std::vector<long> track_times; + int track_count_; + info_t info_; + bool playlist_enabled; + + int remap_track( int i ) const; + friend class Nsfe_Emu; +}; + +class Nsfe_Emu : public Nsf_Emu, public Nsfe_Info { +public: + // See Nsf_Emu.h for further information + + Nsfe_Emu( double gain = 1.4 ) : Nsf_Emu( gain ) { } + + typedef Nsfe_Info::header_t header_t; + + // Load NSFE data + blargg_err_t load( Emu_Reader& r ) { return Nsfe_Info::load( r, this ); } + + // Load NSFE using already-loaded header and remaining data + blargg_err_t load( header_t const& h, Emu_Reader& r ) { return Nsfe_Info::load( h, r, this ); } + +public: + Nsf_Emu::track_count; + Nsf_Emu::load_file; + void start_track( int ); + void enable_playlist( bool = true ); +}; + +inline void Nsfe_Emu::enable_playlist( bool b ) +{ + Nsfe_Info::enable_playlist( b ); + set_track_count( info().track_count ); +} + +#endif +