Music_Emu* gme_new_emu( gme_type_t type, int rate ) { if ( type ) { if ( rate == gme_info_only ) return type->new_info(); Music_Emu* gme = type->new_emu(); if ( gme ) { #if !GME_DISABLE_EFFECTS if ( type->flags_ & 1 ) { gme->effects_buffer_ = BLARGG_NEW Simple_Effects_Buffer; if ( gme->effects_buffer_ ) gme->set_buffer( gme->effects_buffer_ ); } if ( !(type->flags_ & 1) || gme->effects_buffer_ ) #endif { if ( !gme->set_sample_rate( rate ) ) { check( gme->type() == type ); return gme; } } delete gme; } } return NULL; }
BLARGG_EXPORT Music_Emu* gme_new_emu( gme_type_t type, int rate ) { if ( type ) { if ( rate == gme_info_only ) return type->new_info(); Music_Emu* me = type->new_emu(); if ( me ) { #if !GME_DISABLE_STEREO_DEPTH if ( type->flags_ & 1 ) { me->effects_buffer = BLARGG_NEW Effects_Buffer; if ( me->effects_buffer ) me->set_buffer( me->effects_buffer ); } if ( !(type->flags_ & 1) || me->effects_buffer ) #endif { if ( !me->set_sample_rate( rate ) ) { check( me->type() == type ); return me; } } delete me; } } return 0; }
gme_err_t gme_open_file( const char path [], Music_Emu** out, int sample_rate ) { require( path && out ); *out = NULL; GME_FILE_READER in; RETURN_ERR( in.open( path ) ); char header [4]; int header_size = 0; gme_type_t file_type = gme_identify_extension( path ); if ( !file_type ) { header_size = sizeof header; RETURN_ERR( in.read( header, sizeof header ) ); file_type = gme_identify_extension( gme_identify_header( header ) ); } if ( !file_type ) return blargg_err_file_type; Music_Emu* emu = gme_new_emu( file_type, sample_rate ); CHECK_ALLOC( emu ); // optimization: avoids seeking/re-reading header Remaining_Reader rem( header, header_size, &in ); gme_err_t err = emu->load( rem ); in.close(); if ( err ) delete emu; else *out = emu; return err; }
// Used to implement gme_new_emu and gme_new_emu_multi_channel Music_Emu* gme_internal_new_emu_( gme_type_t type, int rate, bool multi_channel ) { if ( type ) { if ( rate == gme_info_only ) return type->new_info(); Music_Emu* me = type->new_emu(); if ( me ) { #if !GME_DISABLE_STEREO_DEPTH me->set_multi_channel( multi_channel ); if ( type->flags_ & 1 ) { if ( me->multi_channel() ) { me->effects_buffer = BLARGG_NEW Effects_Buffer(8); } else { me->effects_buffer = BLARGG_NEW Effects_Buffer(1); } if ( me->effects_buffer ) me->set_buffer( me->effects_buffer ); } if ( !(type->flags_ & 1) || me->effects_buffer ) #endif { if ( !me->set_sample_rate( rate ) ) { check( me->type() == type ); return me; } } delete me; } } return 0; }