mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2024-11-10 15:01:40 +00:00
Initialize overflow_rvoice correctly
This commit is contained in:
parent
ab62544737
commit
8791c115c9
1 changed files with 40 additions and 31 deletions
|
@ -142,6 +142,38 @@ static inline void fluid_sample_null_ptr(fluid_sample_t** sample)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Swaps the current rvoice with the current overflow_rvoice
|
||||||
|
*/
|
||||||
|
static void fluid_voice_swap_rvoice(fluid_voice_t* voice)
|
||||||
|
{
|
||||||
|
fluid_rvoice_t* rtemp = voice->rvoice;
|
||||||
|
int ctemp = voice->can_access_rvoice;
|
||||||
|
voice->rvoice = voice->overflow_rvoice;
|
||||||
|
voice->can_access_rvoice = voice->can_access_overflow_rvoice;
|
||||||
|
voice->overflow_rvoice = rtemp;
|
||||||
|
voice->can_access_overflow_rvoice = ctemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fluid_voice_initialize_rvoice(fluid_voice_t* voice)
|
||||||
|
{
|
||||||
|
FLUID_MEMSET(voice->rvoice, 0, sizeof(fluid_rvoice_t));
|
||||||
|
|
||||||
|
/* The 'sustain' and 'finished' segments of the volume / modulation
|
||||||
|
* envelope are constant. They are never affected by any modulator
|
||||||
|
* or generator. Therefore it is enough to initialize them once
|
||||||
|
* during the lifetime of the synth.
|
||||||
|
*/
|
||||||
|
fluid_voice_update_volenv(voice, FLUID_VOICE_ENVSUSTAIN,
|
||||||
|
0xffffffff, 1.0f, 0.0f, -1.0f, 2.0f);
|
||||||
|
fluid_voice_update_volenv(voice, FLUID_VOICE_ENVFINISHED,
|
||||||
|
0xffffffff, 0.0f, 0.0f, -1.0f, 1.0f);
|
||||||
|
fluid_voice_update_modenv(voice, FLUID_VOICE_ENVSUSTAIN,
|
||||||
|
0xffffffff, 1.0f, 0.0f, -1.0f, 2.0f);
|
||||||
|
fluid_voice_update_modenv(voice, FLUID_VOICE_ENVFINISHED,
|
||||||
|
0xffffffff, 0.0f, 0.0f, -1.0f, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* new_fluid_voice
|
* new_fluid_voice
|
||||||
*/
|
*/
|
||||||
|
@ -162,10 +194,6 @@ new_fluid_voice(fluid_real_t output_rate)
|
||||||
FLUID_FREE(voice);
|
FLUID_FREE(voice);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
FLUID_MEMSET(voice->rvoice, 0, sizeof(fluid_rvoice_t));
|
|
||||||
FLUID_MEMSET(voice->overflow_rvoice, 0, sizeof(fluid_rvoice_t));
|
|
||||||
voice->can_access_rvoice = 1;
|
|
||||||
voice->can_access_overflow_rvoice = 1;
|
|
||||||
|
|
||||||
voice->status = FLUID_VOICE_CLEAN;
|
voice->status = FLUID_VOICE_CLEAN;
|
||||||
voice->chan = NO_CHANNEL;
|
voice->chan = NO_CHANNEL;
|
||||||
|
@ -173,21 +201,15 @@ new_fluid_voice(fluid_real_t output_rate)
|
||||||
voice->vel = 0;
|
voice->vel = 0;
|
||||||
voice->channel = NULL;
|
voice->channel = NULL;
|
||||||
voice->sample = NULL;
|
voice->sample = NULL;
|
||||||
fluid_voice_set_output_rate(voice, output_rate);
|
|
||||||
|
|
||||||
/* The 'sustain' and 'finished' segments of the volume / modulation
|
/* Initialize both the rvoice and overflow_rvoice */
|
||||||
* envelope are constant. They are never affected by any modulator
|
voice->can_access_rvoice = 1;
|
||||||
* or generator. Therefore it is enough to initialize them once
|
voice->can_access_overflow_rvoice = 1;
|
||||||
* during the lifetime of the synth.
|
fluid_voice_initialize_rvoice(voice);
|
||||||
*/
|
fluid_voice_swap_rvoice(voice);
|
||||||
fluid_voice_update_volenv(voice, FLUID_VOICE_ENVSUSTAIN,
|
fluid_voice_initialize_rvoice(voice);
|
||||||
0xffffffff, 1.0f, 0.0f, -1.0f, 2.0f);
|
|
||||||
fluid_voice_update_volenv(voice, FLUID_VOICE_ENVFINISHED,
|
fluid_voice_set_output_rate(voice, output_rate);
|
||||||
0xffffffff, 0.0f, 0.0f, -1.0f, 1.0f);
|
|
||||||
fluid_voice_update_modenv(voice, FLUID_VOICE_ENVSUSTAIN,
|
|
||||||
0xffffffff, 1.0f, 0.0f, -1.0f, 2.0f);
|
|
||||||
fluid_voice_update_modenv(voice, FLUID_VOICE_ENVFINISHED,
|
|
||||||
0xffffffff, 0.0f, 0.0f, -1.0f, 1.0f);
|
|
||||||
|
|
||||||
return voice;
|
return voice;
|
||||||
}
|
}
|
||||||
|
@ -211,19 +233,6 @@ delete_fluid_voice(fluid_voice_t* voice)
|
||||||
return FLUID_OK;
|
return FLUID_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Swaps the current rvoice with the current overflow_rvoice
|
|
||||||
*/
|
|
||||||
static void fluid_voice_swap_rvoice(fluid_voice_t* voice)
|
|
||||||
{
|
|
||||||
fluid_rvoice_t* rtemp = voice->rvoice;
|
|
||||||
int ctemp = voice->can_access_rvoice;
|
|
||||||
voice->rvoice = voice->overflow_rvoice;
|
|
||||||
voice->can_access_rvoice = voice->can_access_overflow_rvoice;
|
|
||||||
voice->overflow_rvoice = rtemp;
|
|
||||||
voice->can_access_overflow_rvoice = ctemp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fluid_voice_init
|
/* fluid_voice_init
|
||||||
*
|
*
|
||||||
* Initialize the synthesis process
|
* Initialize the synthesis process
|
||||||
|
|
Loading…
Reference in a new issue