static bool set_new_sample(struct SoundPlugin *plugin, const wchar_t *filename, int instrument_number, int resampler_type){ bool success=false; Data *data = NULL; Data *old_data = plugin->data; filename = OS_loading_get_resolved_file_path(filename); if (filename==NULL) goto exit; data = create_data(old_data->samplerate, plugin->data, filename, instrument_number, resampler_type); if(load_sample(data,filename,instrument_number)==false) goto exit; // Put loop_onoff into storage. PLUGIN_set_effect_value2(plugin, -1, EFF_LOOP_ONOFF, data->loop_onoff==true?1.0f:0.0f, PLUGIN_STORED_TYPE, PLUGIN_STORE_VALUE, FX_single, PLAYERLOCK_NOT_REQUIRED); if(SP_is_plugin_running(plugin)){ PLAYER_lock();{ old_data->new_data = data; }PLAYER_unlock(); if (PLAYER_is_running()) RSEMAPHORE_wait(old_data->signal_from_RT,1); } else { plugin->data = data; } delete_data(old_data); update_peaks(plugin); volatile struct Patch *patch = plugin->patch; if(patch!=NULL) GFX_update_instrument_widget((struct Patch*)patch); // Update "loop" button. success = true; exit: if(success==false) free(data); return success; }
bool FLUIDSYNTH_set_new_preset(SoundPlugin *plugin, const wchar_t *sf2_file, int bank_num, int preset_num){ Data *data = plugin->data; if(!STRING_equals2(sf2_file, data->filename)){ Data *new_data = create_data(sf2_file, data->samplerate); if(new_data==NULL) return false; if(SP_is_plugin_running(plugin)){ PLAYER_lock();{ // Hmm. lock for setting a variable type that is atomic on all target platforms? data->new_data = new_data; }PLAYER_unlock(); RSEMAPHORE_wait(data->signal_from_RT,1); } else{ plugin->data = new_data; } delete_data(data); data = new_data; } data->bank_num = bank_num; data->preset_num = preset_num; fluid_synth_bank_select(data->synth,0,bank_num); fluid_synth_program_change(data->synth,0,preset_num); if(plugin->patch != NULL) GFX_update_instrument_widget(plugin->patch); return true; }