81 lines
1.4 KiB
C++
81 lines
1.4 KiB
C++
#include "Sms_Fm_Apu.h"
|
|
|
|
#include "blargg_source.h"
|
|
|
|
Sms_Fm_Apu::Sms_Fm_Apu()
|
|
{ }
|
|
|
|
Sms_Fm_Apu::~Sms_Fm_Apu()
|
|
{ }
|
|
|
|
blargg_err_t Sms_Fm_Apu::init( double clock_rate, double sample_rate )
|
|
{
|
|
period_ = clock_rate / sample_rate + 0.5;
|
|
CHECK_ALLOC( !apu.set_rate( sample_rate, clock_rate ) );
|
|
|
|
set_output( 0 );
|
|
volume( 1.0 );
|
|
reset();
|
|
return blargg_ok;
|
|
}
|
|
|
|
void Sms_Fm_Apu::reset()
|
|
{
|
|
addr = 0;
|
|
next_time = 0;
|
|
last_amp = 0;
|
|
|
|
apu.reset();
|
|
}
|
|
|
|
void Sms_Fm_Apu::write_data( blip_time_t time, int data )
|
|
{
|
|
if ( time > next_time )
|
|
run_until( time );
|
|
|
|
apu.write( addr, data );
|
|
}
|
|
|
|
void Sms_Fm_Apu::run_until( blip_time_t end_time )
|
|
{
|
|
assert( end_time > next_time );
|
|
|
|
Blip_Buffer* const output = this->output_;
|
|
if ( !output )
|
|
{
|
|
next_time = end_time;
|
|
return;
|
|
}
|
|
|
|
blip_time_t time = next_time;
|
|
do
|
|
{
|
|
Ym2413_Emu::sample_t samples [2] = {0};
|
|
apu.run( 1, samples );
|
|
int amp = (samples [0] + samples [1]) >> 1;
|
|
|
|
int delta = amp - last_amp;
|
|
if ( delta )
|
|
{
|
|
last_amp = amp;
|
|
synth.offset_inline( time, delta, output );
|
|
}
|
|
time += period_;
|
|
}
|
|
while ( time < end_time );
|
|
|
|
next_time = time;
|
|
}
|
|
|
|
void Sms_Fm_Apu::end_frame( blip_time_t time )
|
|
{
|
|
if ( time > next_time )
|
|
run_until( time );
|
|
|
|
next_time -= time;
|
|
assert( next_time >= 0 );
|
|
|
|
if ( output_ )
|
|
output_->set_modified();
|
|
}
|