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; } }
static void RT_process(SoundPlugin *plugin, int64_t time, int num_frames, float **inputs, float **outputs){ Data *data = (Data*)plugin->data; int num_outputs = plugin->type->num_outputs; for(int i=0;i<num_outputs;i++) memset(outputs[i],0,num_frames*sizeof(float)); float tempsound[num_frames]; Voice *voice = data->voices_playing; while(voice!=NULL){ Voice *next = voice->next; if(RT_play_voice(data, voice, num_frames, tempsound)==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++){ float *source = tempsounds[ch]; float *target = outputs[ch]; for(int i=0 ; i<num_frames ; i++) target[i] += tempsound[i]; // TODO: Apply panning } voice = next; } }
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); } }