2013-09-28 03:24:23 +00:00
|
|
|
// Sega VGM music file emulator
|
2007-10-11 23:11:58 +00:00
|
|
|
|
2013-09-28 03:24:23 +00:00
|
|
|
// Game_Music_Emu $vers
|
2007-10-11 23:11:58 +00:00
|
|
|
#ifndef VGM_EMU_H
|
|
|
|
#define VGM_EMU_H
|
|
|
|
|
2013-09-28 03:24:23 +00:00
|
|
|
#include "Classic_Emu.h"
|
|
|
|
#include "Dual_Resampler.h"
|
|
|
|
#include "Vgm_Core.h"
|
2007-10-11 23:11:58 +00:00
|
|
|
|
2013-09-28 03:24:23 +00:00
|
|
|
/* Emulates VGM music using SN76489/SN76496 PSG, and YM2612 and YM2413 FM sound chips.
|
|
|
|
Supports custom sound buffer and frequency equalization when VGM uses just the PSG. FM
|
|
|
|
sound chips can be run at their proper rates, or slightly higher to reduce aliasing on
|
|
|
|
high notes. A YM2413 is supported but not provided separately from the library. */
|
|
|
|
class Vgm_Emu : public Classic_Emu {
|
2007-10-11 23:11:58 +00:00
|
|
|
public:
|
2013-09-28 03:24:23 +00:00
|
|
|
|
2007-10-11 23:11:58 +00:00
|
|
|
// True if custom buffer and custom equalization are supported
|
|
|
|
// TODO: move into Music_Emu and rename to something like supports_custom_buffer()
|
2013-09-28 03:24:23 +00:00
|
|
|
bool is_classic_emu() const { return !core.uses_fm(); }
|
2007-10-11 23:11:58 +00:00
|
|
|
|
2013-09-28 03:24:23 +00:00
|
|
|
// Disables running FM chips at higher than normal rate. Will result in slightly
|
2007-10-11 23:11:58 +00:00
|
|
|
// more aliasing of high notes.
|
2013-09-28 03:24:23 +00:00
|
|
|
void disable_oversampling( bool disable = true ) { disable_oversampling_ = disable; }
|
2007-10-11 23:11:58 +00:00
|
|
|
|
2013-09-28 03:24:23 +00:00
|
|
|
// VGM file header (see Vgm_Core.h)
|
|
|
|
typedef Vgm_Core::header_t header_t;
|
2007-10-11 23:11:58 +00:00
|
|
|
|
|
|
|
// Header for currently loaded file
|
2013-09-28 03:24:23 +00:00
|
|
|
header_t const& header() const { return core.header(); }
|
|
|
|
|
|
|
|
blargg_err_t hash_( Hash_Function& ) const;
|
|
|
|
|
|
|
|
// Gd3 tag for currently loaded file
|
|
|
|
blargg_err_t gd3_data( const unsigned char ** data, int * size );
|
2007-10-11 23:11:58 +00:00
|
|
|
|
2013-09-28 03:24:23 +00:00
|
|
|
static gme_type_t static_type() { return gme_vgm_type; }
|
2007-10-11 23:11:58 +00:00
|
|
|
|
2013-09-28 03:24:23 +00:00
|
|
|
// Implementation
|
2007-10-11 23:11:58 +00:00
|
|
|
public:
|
|
|
|
Vgm_Emu();
|
|
|
|
~Vgm_Emu();
|
2013-09-28 03:24:23 +00:00
|
|
|
|
2007-10-11 23:11:58 +00:00
|
|
|
protected:
|
|
|
|
blargg_err_t track_info_( track_info_t*, int track ) const;
|
2013-09-28 03:24:23 +00:00
|
|
|
blargg_err_t load_mem_( byte const [], int );
|
|
|
|
blargg_err_t set_sample_rate_( int sample_rate );
|
2007-10-11 23:11:58 +00:00
|
|
|
blargg_err_t start_track_( int );
|
2013-09-28 03:24:23 +00:00
|
|
|
blargg_err_t play_( int count, sample_t []);
|
2007-10-11 23:11:58 +00:00
|
|
|
blargg_err_t run_clocks( blip_time_t&, int );
|
2013-09-28 03:24:23 +00:00
|
|
|
virtual void set_tempo_( double );
|
|
|
|
virtual void mute_voices_( int mask );
|
|
|
|
virtual void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
|
|
|
|
virtual void update_eq( blip_eq_t const& );
|
|
|
|
virtual void unload();
|
|
|
|
|
2007-10-11 23:11:58 +00:00
|
|
|
private:
|
|
|
|
bool disable_oversampling_;
|
2013-09-28 03:24:23 +00:00
|
|
|
unsigned muted_voices;
|
|
|
|
Dual_Resampler resampler;
|
|
|
|
Vgm_Core core;
|
|
|
|
|
|
|
|
void check_end();
|
|
|
|
void check_warning();
|
|
|
|
int play_frame( blip_time_t blip_time, int sample_count, sample_t buf [] );
|
|
|
|
static int play_frame_( void*, blip_time_t, int, sample_t [] );
|
2007-10-11 23:11:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|