cog/Frameworks/GME/gme/Vgm_Emu.h

70 lines
2.2 KiB
C
Raw Normal View History

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