static void RT_process(SoundPlugin *plugin, int64_t time, int num_frames, float **inputs, float **outputs){ Data *data = (Data*)plugin->data; Voice *voice = data->voices_playing; memset(outputs[0],0,num_frames*sizeof(float)); memset(outputs[1],0,num_frames*sizeof(float)); while(voice!=NULL){ Voice *next = voice->next; if(RT_play_voice(data, voice, num_frames, outputs)==true){ RT_remove_voice(&data->voices_playing, voice); RT_add_voice(&data->voices_not_playing, voice); } voice = next; } if(data->new_data != NULL){ RT_fade_out(outputs[0],num_frames); RT_fade_out(outputs[1],num_frames); plugin->data = data->new_data; // Bang! (hmm.) data->new_data = NULL; RSEMAPHORE_signal(data->signal_from_RT,1); } }
static void RT_process(SoundPlugin *plugin, int64_t time, int num_frames, float **inputs, float **outputs){ Data *data = (Data*)plugin->data; //data =NULL; // crashreporter test. //printf("telling sequencer that it is time %d\n",(int)data->time); fluid_sequencer_process(data->sequencer, get_fluidsynth_time(data,data->time)); data->time += num_frames; // What's the difference between fluid_synth_write_float and fluid_synth_nwrite_float? Sounds to me like they produce exactly the same sound. #if 0 if(fluid_synth_write_float(data->synth,num_frames,outputs[0],0,1,outputs[1],0,1)==FLUID_FAILED) printf("fluid_synth_write_float failed\n"); #else if(fluid_synth_nwrite_float(data->synth,num_frames, &outputs[0], &outputs[1], NULL, NULL)==FLUID_FAILED) printf("fluid_synth_write_float failed\n"); #endif if(data->new_data != NULL){ RT_fade_out(outputs[0],num_frames); RT_fade_out(outputs[1],num_frames); plugin->data = data->new_data; // hmm. data->new_data = NULL; RSEMAPHORE_signal(data->signal_from_RT,1); } }
// fade out 'input' static void RT_crossfade_out(float *input, float *output, int num_frames){ RT_fade_out(input, num_frames); RT_fade_in(output, num_frames); for(int i=0;i<num_frames;i++) output[i] += input[i]; }
static void RT_process_instrument2(int num_outputs, Data *data, int64_t time, int num_frames, float **inputs, float **outputs){ for(int i=0;i<num_outputs;i++) memset(outputs[i],0,num_frames*sizeof(float)); float *tempsounds[num_outputs]; float tempdata[num_outputs][num_frames]; for(int i=0;i<num_outputs;i++) tempsounds[i] = &tempdata[i][0]; Voice *voice = data->voices_playing; //printf("Voices? %s\n",voice==NULL?"No":"Yes"); while(voice!=NULL){ Voice *next = voice->next; int start_process; if(RT_play_voice(data,voice,num_frames,inputs,tempsounds,&start_process)==VOICE_REMOVE){ RT_remove_voice(&data->voices_playing, voice); RT_add_voice(&data->voices_not_playing, voice); for(int ch=0;ch<num_outputs;ch++) RT_fade_out(tempsounds[ch], num_frames-start_process); } for(int ch=0;ch<num_outputs;ch++){ float *source = tempsounds[ch]; float *target = outputs[ch]; for(int i=start_process;i<num_frames;i++) target[i] += source[i]; } voice=next; } }