void mdx_parse_mml_ym2151_async_finalize(songdata *data) { ym2151_all_note_off(data); pcm8_close(data); ym2151_shutdown(data); }
//static DEVICE_STOP( ym2151 ) void device_stop_ym2151(void *_info) { //ym2151_state *info = get_safe_token(device); ym2151_state *info = (ym2151_state *)_info; ym2151_shutdown(info->chip); //YM2151Shutdown(); free(info); }
static DEVICE_STOP( ym2151 ) { ym2151_state *info = get_safe_token(device); ym2151_shutdown(info->chip); }
int mdx_parse_mml_ym2151( MDX_DATA *orig_mdx, PDX_DATA *orig_pdx, songdata *data ) { int i; long count; int all_track_finished; int fade_out_wait; int master_volume; int infinite_loops; __GETSELF(data); self->mdx = orig_mdx; self->pdx = orig_pdx; mdx_init_track_work_area_ym2151(data); self->pcm8_disable=FLAG_TRUE; if ( pcm8_open(self->mdx, data)==0 ) { self->pcm8_disable=FLAG_FALSE; } if (!ym2151_reg_init( self->mdx, data )) { /* failed to initialize opm! */ return 1; } /* start parsing */ all_track_finished=FLAG_FALSE; fade_out_wait=0; master_volume=127; while(all_track_finished==FLAG_FALSE) { if ( self->fade_out > 0 ) { if ( fade_out_wait==0 ) { fade_out_wait = self->fade_out; } fade_out_wait--; if ( fade_out_wait==0 ) { master_volume--; } if ( master_volume==0 ) { break; } } ym2151_set_master_volume( master_volume * self->mdx->fm_volume / 127, data ); pcm8_set_master_volume( master_volume * self->mdx->pcm_volume / 127, data ); all_track_finished=FLAG_TRUE; infinite_loops = 32767; /* large enough */ for ( i=0 ; i<self->mdx->tracks ; i++ ) { if ( self->mdx->track[i].waiting_sync == FLAG_TRUE ) { continue; } count = self->mdx->track[i].counter; if ( count < 0 ) { continue; } /* this track has finished */ all_track_finished=FLAG_FALSE; self->mdx->track[i].gate--; if ( self->mdx->track[i].gate == 0 ) { note_off( i, data ); } if ( i<8 ) { ym2151_set_freq_volume( i, data ); /* do portament, lfo, detune */ } count--; while ( count == 0 ) { count=set_new_event( i, data ); } self->mdx->track[i].counter = count; if ( infinite_loops > self->mdx->track[i].infinite_loop_times ) { infinite_loops = self->mdx->track[i].infinite_loop_times; } } if ( self->mdx->max_infinite_loops > 0 ) { if ( infinite_loops >= self->mdx->max_infinite_loops ) { self->fade_out = self->mdx->fade_out_speed; } } /* timer count */ self->mdx->total_count++; self->mdx->elapsed_time += 1000*1024*(256 - self->mdx->tempo)/4000; do_pcm8(NULL,-1, data); } ym2151_all_note_off(data); pcm8_close(data); ym2151_shutdown(data); return 0; }