2015-11-27 10:02:41 +00:00
|
|
|
// Sega VGM music file emulator core
|
|
|
|
|
|
|
|
// Game_Music_Emu $vers
|
|
|
|
#ifndef VGM_CORE_H
|
|
|
|
#define VGM_CORE_H
|
|
|
|
|
|
|
|
#include "Gme_Loader.h"
|
|
|
|
|
|
|
|
#include "../vgmplay/VGMPlay.h"
|
|
|
|
|
|
|
|
class Vgm_Core : public Gme_Loader {
|
|
|
|
public:
|
|
|
|
typedef VGM_HEADER header_t;
|
|
|
|
|
|
|
|
// VGM file header
|
|
|
|
// Header for currently loaded file
|
|
|
|
header_t const& header() const { return _header; }
|
|
|
|
|
|
|
|
// Raw file data, for parsing GD3 tags
|
|
|
|
byte const* file_begin() const { return Gme_Loader::file_begin(); }
|
|
|
|
byte const* file_end () const { return Gme_Loader::file_end(); }
|
|
|
|
|
|
|
|
// Adjusts music tempo, where 1.0 is normal. Can be changed while playing.
|
|
|
|
// Loading a file resets tempo to 1.0.
|
|
|
|
void set_tempo( double );
|
|
|
|
|
|
|
|
void set_sample_rate( int r ) { sample_rate = r; }
|
|
|
|
|
|
|
|
// Starts track
|
|
|
|
void start_track();
|
|
|
|
|
|
|
|
// Plays FM for at most count samples into *out, and returns number of
|
|
|
|
// samples actually generated (always even).
|
|
|
|
int play_( int count, short out [] );
|
|
|
|
|
|
|
|
// True if all of file data has been played
|
|
|
|
bool track_ended() const { return !!vgmp->VGMEnd; }
|
|
|
|
|
|
|
|
// Skips the specified number of samples
|
|
|
|
void skip_( int count );
|
2016-03-18 00:15:45 +00:00
|
|
|
|
|
|
|
int get_channel_count();
|
|
|
|
|
|
|
|
char* get_voice_name(int channel);
|
|
|
|
void free_voice_name(char *);
|
|
|
|
|
|
|
|
void set_mute(int mask);
|
2015-11-27 10:02:41 +00:00
|
|
|
|
|
|
|
// Implementation
|
|
|
|
public:
|
|
|
|
Vgm_Core();
|
|
|
|
~Vgm_Core();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual blargg_err_t load_mem_( byte const [], int );
|
|
|
|
|
|
|
|
private:
|
|
|
|
int sample_rate;
|
|
|
|
|
|
|
|
header_t _header;
|
|
|
|
|
|
|
|
VGM_PLAYER* vgmp;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|