Mercurial > audlegacy
diff Plugins/Input/console/Classic_Emu.cpp @ 493:c04dff121e1d trunk
[svn] hostile merge, phase 2: reimport based on new plugin code
author | nenolod |
---|---|
date | Tue, 24 Jan 2006 20:19:01 -0800 |
parents | |
children | f12d7e208b43 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/Input/console/Classic_Emu.cpp Tue Jan 24 20:19:01 2006 -0800 @@ -0,0 +1,117 @@ + +// Game_Music_Emu 0.3.0. http://www.slack.net/~ant/ + +#include "Classic_Emu.h" + +#include "Multi_Buffer.h" + +/* Copyright (C) 2003-2006 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. You should have received a copy of the GNU Lesser General +Public License along with this module; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include BLARGG_SOURCE_BEGIN + +Classic_Emu::Classic_Emu() +{ + buf = NULL; + stereo_buffer = NULL; +} + +Classic_Emu::~Classic_Emu() +{ + delete stereo_buffer; +} + +void Classic_Emu::set_equalizer( equalizer_t const& eq ) +{ + Music_Emu::set_equalizer( eq ); + update_eq( eq.treble ); + if ( buf ) + buf->bass_freq( equalizer().bass ); +} + +blargg_err_t Classic_Emu::set_sample_rate( long sample_rate ) +{ + if ( !buf ) + { + if ( !stereo_buffer ) + BLARGG_CHECK_ALLOC( stereo_buffer = BLARGG_NEW Stereo_Buffer ); + buf = stereo_buffer; + } + + BLARGG_RETURN_ERR( buf->set_sample_rate( sample_rate, 1000 / 20 ) ); + return Music_Emu::set_sample_rate( sample_rate ); +} + +void Classic_Emu::mute_voices( int mask ) +{ + require( buf ); // set_sample_rate() must have been called + + Music_Emu::mute_voices( mask ); + for ( int i = voice_count(); i--; ) + { + if ( mask & (1 << i) ) + { + set_voice( i, NULL, NULL, NULL ); + } + else + { + Multi_Buffer::channel_t ch = buf->channel( i ); + set_voice( i, ch.center, ch.left, ch.right ); + } + } +} + +blargg_err_t Classic_Emu::setup_buffer( long new_clock_rate ) +{ + require( sample_rate() ); // fails if set_sample_rate() hasn't been called yet + + clock_rate = new_clock_rate; + buf->clock_rate( clock_rate ); + BLARGG_RETURN_ERR( buf->set_channel_count( voice_count() ) ); + set_equalizer( equalizer() ); + remute_voices(); + return blargg_success; +} + +void Classic_Emu::start_track( int track ) +{ + Music_Emu::start_track( track ); + buf->clear(); +} + +blip_time_t Classic_Emu::run_clocks( blip_time_t t, bool* ) +{ + assert( false ); + return t; +} + +blip_time_t Classic_Emu::run( int msec, bool* added_stereo ) +{ + return run_clocks( (long) msec * clock_rate / 1000, added_stereo ); +} + +void Classic_Emu::play( long count, sample_t* out ) +{ + require( sample_rate() ); // fails if set_sample_rate() hasn't been called yet + + long remain = count; + while ( remain ) + { + remain -= buf->read_samples( &out [count - remain], remain ); + if ( remain ) + { + bool added_stereo = false; + blip_time_t clocks_emulated = run( buf->length(), &added_stereo ); + buf->end_frame( clocks_emulated, added_stereo ); + } + } +} +