2011-08-07 20:01:04 +00:00
|
|
|
// YM2413 FM sound chip emulator interface
|
|
|
|
|
|
|
|
// Game_Music_Emu 0.6-pre
|
|
|
|
#ifndef YM2413_EMU_H
|
|
|
|
#define YM2413_EMU_H
|
|
|
|
|
|
|
|
#include "blargg_common.h"
|
|
|
|
#include "emu2413.h"
|
|
|
|
|
|
|
|
enum { out_chan_count = 2 }; // stereo
|
|
|
|
enum { channel_count = 14 };
|
|
|
|
enum { disabled_time = -1 };
|
|
|
|
|
|
|
|
struct Ym2413_Emu {
|
|
|
|
OPLL opll;
|
|
|
|
|
|
|
|
// Impl
|
|
|
|
int last_time;
|
|
|
|
short* out;
|
|
|
|
};
|
|
|
|
|
|
|
|
void Ym2413_init( struct Ym2413_Emu* this );
|
|
|
|
|
|
|
|
static inline bool Ym2413_supported( void ) { return true; }
|
|
|
|
|
|
|
|
// Sets output sample rate and chip clock rates, in Hz. Returns non-zero
|
|
|
|
// if error.
|
2011-08-11 21:06:16 +00:00
|
|
|
int Ym2413_set_rate( struct Ym2413_Emu* this, int sample_rate, int clock_rate );
|
2011-08-07 20:01:04 +00:00
|
|
|
|
|
|
|
// Resets to power-up state
|
|
|
|
void Ym2413_reset( struct Ym2413_Emu* this );
|
|
|
|
|
|
|
|
// Mutes voice n if bit n (1 << n) of mask is set
|
|
|
|
void Ym2413_mute_voices( struct Ym2413_Emu* this, int mask );
|
|
|
|
|
|
|
|
// Writes data to addr
|
|
|
|
void Ym2413_write( struct Ym2413_Emu* this, int addr, int data ) ICODE_ATTR;
|
|
|
|
|
|
|
|
// Runs and writes pair_count*2 samples to output
|
|
|
|
void Ym2413_run( struct Ym2413_Emu* this, int pair_count, short* out ) ICODE_ATTR;
|
|
|
|
|
|
|
|
static inline void Ym2413_enable( struct Ym2413_Emu* this, bool b ) { this->last_time = b ? 0 : disabled_time; }
|
|
|
|
static inline bool Ym2413_enabled( struct Ym2413_Emu* this ) { return this->last_time != disabled_time; }
|
|
|
|
static inline void Ym2413_begin_frame( struct Ym2413_Emu* this, short* buf ) { this->out = buf; this->last_time = 0; }
|
|
|
|
|
|
|
|
static inline int Ym2413_run_until( struct Ym2413_Emu* this, int time )
|
|
|
|
{
|
|
|
|
int count = time - this->last_time;
|
|
|
|
if ( count > 0 )
|
|
|
|
{
|
|
|
|
if ( this->last_time < 0 )
|
|
|
|
return false;
|
|
|
|
this->last_time = time;
|
|
|
|
short* p = this->out;
|
|
|
|
this->out += count * out_chan_count;
|
|
|
|
Ym2413_run( this, count, p );
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|