diff options
Diffstat (limited to 'arm-wt-22k/lib_src/eas_dlssynth.c')
-rw-r--r-- | arm-wt-22k/lib_src/eas_dlssynth.c | 578 |
1 files changed, 0 insertions, 578 deletions
diff --git a/arm-wt-22k/lib_src/eas_dlssynth.c b/arm-wt-22k/lib_src/eas_dlssynth.c deleted file mode 100644 index c1fa1ef..0000000 --- a/arm-wt-22k/lib_src/eas_dlssynth.c +++ /dev/null @@ -1,578 +0,0 @@ -/*---------------------------------------------------------------------------- - * - * File: - * eas_dlssynth.c - * - * Contents and purpose: - * Implements the Mobile DLS synthesizer. - * - * Copyright Sonic Network Inc. 2006 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *---------------------------------------------------------------------------- - * Revision Control: - * $Revision: 795 $ - * $Date: 2007-08-01 00:14:45 -0700 (Wed, 01 Aug 2007) $ - *---------------------------------------------------------------------------- -*/ - -// includes -#include "eas_data.h" -#include "eas_report.h" -#include "eas_host.h" -#include "eas_math.h" -#include "eas_synth_protos.h" -#include "eas_wtsynth.h" -#include "eas_pan.h" -#include "eas_mdls.h" -#include "eas_dlssynth.h" - -#ifdef _METRICS_ENABLED -#include "eas_perf.h" -#endif - -static void DLS_UpdateEnvelope (S_SYNTH_VOICE *pVoice, S_SYNTH_CHANNEL *pChannel, const S_DLS_ENVELOPE *pEnvParams, EAS_I16 *pValue, EAS_I16 *pIncrement, EAS_U8 *pState); - -/*---------------------------------------------------------------------------- - * DLS_MuteVoice() - *---------------------------------------------------------------------------- - * Mute the voice using shutdown time from the DLS articulation data - *---------------------------------------------------------------------------- -*/ -void DLS_MuteVoice (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, S_SYNTH_VOICE *pVoice, EAS_I32 voiceNum) -{ - S_WT_VOICE *pWTVoice; - const S_DLS_ARTICULATION *pDLSArt; - - pWTVoice = &pVoiceMgr->wtVoices[voiceNum]; - pDLSArt = &pSynth->pDLS->pDLSArticulations[pWTVoice->artIndex]; - - /* clear deferred action flags */ - pVoice->voiceFlags &= - ~(VOICE_FLAG_DEFER_MIDI_NOTE_OFF | - VOICE_FLAG_SUSTAIN_PEDAL_DEFER_NOTE_OFF | - VOICE_FLAG_DEFER_MUTE); - - /* set the envelope state */ - pVoiceMgr->wtVoices[voiceNum].eg1State = eEnvelopeStateRelease; - pWTVoice->eg1Increment = pDLSArt->eg1ShutdownTime; - pVoiceMgr->wtVoices[voiceNum].eg2State = eEnvelopeStateRelease; - pWTVoice->eg2Increment = pDLSArt->eg2.releaseTime; -} - -/*---------------------------------------------------------------------------- - * DLS_ReleaseVoice() - *---------------------------------------------------------------------------- - * Release the selected voice. - *---------------------------------------------------------------------------- -*/ -/*lint -esym(715, pVoice) standard API, pVoice may be used by other synthesizers */ -void DLS_ReleaseVoice (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, S_SYNTH_VOICE *pVoice, EAS_I32 voiceNum) -{ - S_WT_VOICE *pWTVoice; - const S_DLS_ARTICULATION *pDLSArt; - - pWTVoice = &pVoiceMgr->wtVoices[voiceNum]; - pDLSArt = &pSynth->pDLS->pDLSArticulations[pWTVoice->artIndex]; - - /* if still in attack phase, convert units to log */ - /*lint -e{732} eg1Value is never negative */ - /*lint -e{703} use shift for performance */ - if (pWTVoice->eg1State == eEnvelopeStateAttack) - pWTVoice->eg1Value = (EAS_I16) ((EAS_flog2(pWTVoice->eg1Value) << 1) + 2048); - - /* release EG1 */ - pWTVoice->eg1State = eEnvelopeStateRelease; - pWTVoice->eg1Increment = pDLSArt->eg1.releaseTime; - - /* release EG2 */ - pWTVoice->eg2State = eEnvelopeStateRelease; - pWTVoice->eg2Increment = pDLSArt->eg2.releaseTime; -} - -/*---------------------------------------------------------------------------- - * DLS_SustainPedal() - *---------------------------------------------------------------------------- - * The sustain pedal was just depressed. If the voice is still - * above the sustain level, catch the voice and continue holding. - *---------------------------------------------------------------------------- -*/ -/*lint -esym(715, pChannel) pChannel reserved for future use */ -void DLS_SustainPedal (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, S_SYNTH_VOICE *pVoice, S_SYNTH_CHANNEL *pChannel, EAS_I32 voiceNum) -{ - S_WT_VOICE *pWTVoice; - const S_DLS_ARTICULATION *pDLSArt; - - pWTVoice = &pVoiceMgr->wtVoices[voiceNum]; - pDLSArt = &pSynth->pDLS->pDLSArticulations[pWTVoice->artIndex]; - - /* don't catch the voice if below the sustain level */ - if (pWTVoice->eg1Value < pDLSArt->eg1.sustainLevel) - return; - - /* defer releasing this note until the damper pedal is off */ - pWTVoice->eg1State = eEnvelopeStateDecay; - pVoice->voiceState = eVoiceStatePlay; - pVoice->voiceFlags |= VOICE_FLAG_SUSTAIN_PEDAL_DEFER_NOTE_OFF; - -#ifdef _DEBUG_SYNTH - { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "DLS_SustainPedal: defer note off because sustain pedal is on\n"); */ } -#endif -} - -/*---------------------------------------------------------------------------- - * DLS_UpdatePhaseInc() - *---------------------------------------------------------------------------- - * Calculate the oscillator phase increment for the next frame - *---------------------------------------------------------------------------- -*/ -static EAS_I32 DLS_UpdatePhaseInc (S_WT_VOICE *pWTVoice, const S_DLS_ARTICULATION *pDLSArt, S_SYNTH_CHANNEL *pChannel, EAS_I32 pitchCents) -{ - EAS_I32 temp; - - /* start with base mod LFO modulation */ - temp = pDLSArt->modLFOToPitch; - - /* add mod wheel effect */ - /*lint -e{702} use shift for performance */ - temp += ((pDLSArt->modLFOCC1ToPitch * pChannel->modWheel) >> 7); - - /* add channel pressure effect */ - /*lint -e{702} use shift for performance */ - temp += ((pDLSArt->modLFOChanPressToPitch * pChannel->channelPressure) >> 7); - - /* add total mod LFO effect */ - pitchCents += FMUL_15x15(temp, pWTVoice->modLFO.lfoValue); - - /* start with base vib LFO modulation */ - temp = pDLSArt->vibLFOToPitch; - - /* add mod wheel effect */ - /*lint -e{702} use shift for performance */ - temp += ((pDLSArt->vibLFOCC1ToPitch * pChannel->modWheel) >> 7); - - /* add channel pressure effect */ - /*lint -e{702} use shift for performance */ - temp += ((pDLSArt->vibLFOChanPressToPitch * pChannel->channelPressure) >> 7); - - /* add total vibrato LFO effect */ - pitchCents += FMUL_15x15(temp, pWTVoice->vibLFO.lfoValue); - - /* add EG2 effect */ - pitchCents += FMUL_15x15(pDLSArt->eg2ToPitch, pWTVoice->eg2Value); - - /* convert from cents to linear phase increment */ - return EAS_Calculate2toX(pitchCents); -} - -/*---------------------------------------------------------------------------- - * DLS_UpdateGain() - *---------------------------------------------------------------------------- - * Calculate the gain for the next frame - *---------------------------------------------------------------------------- -*/ -static EAS_I32 DLS_UpdateGain (S_WT_VOICE *pWTVoice, const S_DLS_ARTICULATION *pDLSArt, S_SYNTH_CHANNEL *pChannel, EAS_I32 gain, EAS_U8 velocity) -{ - EAS_I32 temp; - - /* start with base mod LFO modulation */ - temp = pDLSArt->modLFOToGain; - - /* add mod wheel effect */ - /*lint -e{702} use shift for performance */ - temp += ((pDLSArt->modLFOCC1ToGain * pChannel->modWheel) >> 7); - - /* add channel pressure effect */ - /*lint -e{702} use shift for performance */ - temp += ((pDLSArt->modLFOChanPressToGain * pChannel->channelPressure) >> 7); - - /* add total mod LFO effect */ - gain += FMUL_15x15(temp, pWTVoice->modLFO.lfoValue); - if (gain > 0) - gain = 0; - - /* convert to linear gain including EG1 */ - if (pWTVoice->eg1State != eEnvelopeStateAttack) - { - gain = (DLS_GAIN_FACTOR * gain) >> DLS_GAIN_SHIFT; - /*lint -e{702} use shift for performance */ -#if 1 - gain += (pWTVoice->eg1Value - 32767) >> 1; - gain = EAS_LogToLinear16(gain); -#else - gain = EAS_LogToLinear16(gain); - temp = EAS_LogToLinear16((pWTVoice->eg1Value - 32767) >> 1); - gain = FMUL_15x15(gain, temp); -#endif - } - else - { - gain = (DLS_GAIN_FACTOR * gain) >> DLS_GAIN_SHIFT; - gain = EAS_LogToLinear16(gain); - gain = FMUL_15x15(gain, pWTVoice->eg1Value); - } - - /* include MIDI channel gain */ - gain = FMUL_15x15(gain, pChannel->staticGain); - - /* include velocity */ - if (pDLSArt->filterQandFlags & FLAG_DLS_VELOCITY_SENSITIVE) - { - temp = velocity << 8; - temp = FMUL_15x15(temp, temp); - gain = FMUL_15x15(gain, temp); - } - - /* return gain */ - return gain; -} - -/*---------------------------------------------------------------------------- - * DLS_UpdateFilter() - *---------------------------------------------------------------------------- - * Update the Filter parameters - *---------------------------------------------------------------------------- -*/ -static void DLS_UpdateFilter (S_SYNTH_VOICE *pVoice, S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pIntFrame, S_SYNTH_CHANNEL *pChannel, const S_DLS_ARTICULATION *pDLSArt) -{ - EAS_I32 cutoff; - EAS_I32 temp; - - /* no need to calculate filter coefficients if it is bypassed */ - if (pDLSArt->filterCutoff == DEFAULT_DLS_FILTER_CUTOFF_FREQUENCY) - { - pIntFrame->frame.k = 0; - return; - } - - /* start with base cutoff frequency */ - cutoff = pDLSArt->filterCutoff; - - /* get base mod LFO modulation */ - temp = pDLSArt->modLFOToFc; - - /* add mod wheel effect */ - /*lint -e{702} use shift for performance */ - temp += ((pDLSArt->modLFOCC1ToFc * pChannel->modWheel) >> 7); - - /* add channel pressure effect */ - /*lint -e{702} use shift for performance */ - temp += ((pDLSArt->modLFOChanPressToFc* pChannel->channelPressure) >> 7); - - /* add total mod LFO effect */ - cutoff += FMUL_15x15(temp, pWTVoice->modLFO.lfoValue); - - /* add EG2 effect */ - cutoff += FMUL_15x15(pWTVoice->eg2Value, pDLSArt->eg2ToFc); - - /* add velocity effect */ - /*lint -e{702} use shift for performance */ - cutoff += (pVoice->velocity * pDLSArt->velToFc) >> 7; - - /* add velocity effect */ - /*lint -e{702} use shift for performance */ - cutoff += (pVoice->note * pDLSArt->keyNumToFc) >> 7; - - /* subtract the A5 offset and the sampling frequency */ - cutoff -= FILTER_CUTOFF_FREQ_ADJUST + A5_PITCH_OFFSET_IN_CENTS; - - /* limit the cutoff frequency */ - if (cutoff > FILTER_CUTOFF_MAX_PITCH_CENTS) - cutoff = FILTER_CUTOFF_MAX_PITCH_CENTS; - else if (cutoff < FILTER_CUTOFF_MIN_PITCH_CENTS) - cutoff = FILTER_CUTOFF_MIN_PITCH_CENTS; - - WT_SetFilterCoeffs(pIntFrame, cutoff, pDLSArt->filterQandFlags & FILTER_Q_MASK); -} - -/*---------------------------------------------------------------------------- - * DLS_StartVoice() - *---------------------------------------------------------------------------- - * Start up a DLS voice - *---------------------------------------------------------------------------- -*/ -EAS_RESULT DLS_StartVoice (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, S_SYNTH_VOICE *pVoice, EAS_I32 voiceNum, EAS_U16 regionIndex) -{ - S_WT_VOICE *pWTVoice; - const S_DLS_REGION *pDLSRegion; - const S_DLS_ARTICULATION *pDLSArt; - S_SYNTH_CHANNEL *pChannel; - -#ifdef _DEBUG_SYNTH - { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "DLS_StartVoice: Voice %ld; Region %d\n", (EAS_I32) (pVoice - pVoiceMgr->voices), regionIndex); */ } -#endif - - pWTVoice = &pVoiceMgr->wtVoices[voiceNum]; - pChannel = &pSynth->channels[pVoice->channel & 15]; - pDLSRegion = &pSynth->pDLS->pDLSRegions[regionIndex & REGION_INDEX_MASK]; - pWTVoice->artIndex = pDLSRegion->wtRegion.artIndex; - pDLSArt = &pSynth->pDLS->pDLSArticulations[pWTVoice->artIndex]; - - /* initialize the envelopes */ - pWTVoice->eg1State = eEnvelopeStateInit; - DLS_UpdateEnvelope(pVoice, pChannel, &pDLSArt->eg1, &pWTVoice->eg1Value, &pWTVoice->eg1Increment, &pWTVoice->eg1State); - pWTVoice->eg2State = eEnvelopeStateInit; - DLS_UpdateEnvelope(pVoice, pChannel, &pDLSArt->eg2, &pWTVoice->eg2Value, &pWTVoice->eg2Increment, &pWTVoice->eg2State); - - /* initialize the LFOs */ - pWTVoice->modLFO.lfoValue = 0; - pWTVoice->modLFO.lfoPhase = pDLSArt->modLFO.lfoDelay; - pWTVoice->vibLFO.lfoValue = 0; - pWTVoice->vibLFO.lfoPhase = pDLSArt->vibLFO.lfoDelay; - - /* initalize the envelopes and calculate initial gain */ - DLS_UpdateEnvelope(pVoice, pChannel, &pDLSArt->eg1, &pWTVoice->eg1Value, &pWTVoice->eg1Increment, &pWTVoice->eg1State); - DLS_UpdateEnvelope(pVoice, pChannel, &pDLSArt->eg2, &pWTVoice->eg2Value, &pWTVoice->eg2Increment, &pWTVoice->eg2State); - pVoice->gain = (EAS_I16) DLS_UpdateGain(pWTVoice, pDLSArt, pChannel, pDLSRegion->wtRegion.gain, pVoice->velocity); - -#if (NUM_OUTPUT_CHANNELS == 2) - EAS_CalcPanControl((EAS_INT) pChannel->pan - 64 + (EAS_INT) pDLSArt->pan, &pWTVoice->gainLeft, &pWTVoice->gainRight); -#endif - - /* initialize the filter states */ - pWTVoice->filter.z1 = 0; - pWTVoice->filter.z2 = 0; - - /* initialize the oscillator */ - pWTVoice->phaseAccum = (EAS_U32) pSynth->pDLS->pDLSSamples + pSynth->pDLS->pDLSSampleOffsets[pDLSRegion->wtRegion.waveIndex]; - if (pDLSRegion->wtRegion.region.keyGroupAndFlags & REGION_FLAG_IS_LOOPED) - { - pWTVoice->loopStart = pWTVoice->phaseAccum + pDLSRegion->wtRegion.loopStart; - pWTVoice->loopEnd = pWTVoice->phaseAccum + pDLSRegion->wtRegion.loopEnd - 1; - } - else - pWTVoice->loopStart = pWTVoice->loopEnd = pWTVoice->phaseAccum + pSynth->pDLS->pDLSSampleLen[pDLSRegion->wtRegion.waveIndex] - 1; - - return EAS_SUCCESS; -} - -/*---------------------------------------------------------------------------- - * DLS_UpdateVoice() - *---------------------------------------------------------------------------- - * Purpose: - * Synthesize a block of samples for the given voice. - * Use linear interpolation. - * - * Inputs: - * pEASData - pointer to overall EAS data structure - * - * Outputs: - * number of samples actually written to buffer - * - * Side Effects: - * - samples are added to the presently free buffer - * - *---------------------------------------------------------------------------- -*/ -EAS_BOOL DLS_UpdateVoice (S_VOICE_MGR *pVoiceMgr, S_SYNTH *pSynth, S_SYNTH_VOICE *pVoice, EAS_I32 voiceNum, EAS_I32 *pMixBuffer, EAS_I32 numSamples) -{ - S_WT_VOICE *pWTVoice; - S_SYNTH_CHANNEL *pChannel; - const S_DLS_REGION *pDLSRegion; - const S_DLS_ARTICULATION *pDLSArt; - S_WT_INT_FRAME intFrame; - EAS_I32 temp; - EAS_BOOL done = EAS_FALSE; - - /* establish pointers to critical data */ - pWTVoice = &pVoiceMgr->wtVoices[voiceNum]; - pDLSRegion = &pSynth->pDLS->pDLSRegions[pVoice->regionIndex & REGION_INDEX_MASK]; - pChannel = &pSynth->channels[pVoice->channel & 15]; - pDLSArt = &pSynth->pDLS->pDLSArticulations[pWTVoice->artIndex]; - - /* update the envelopes */ - DLS_UpdateEnvelope(pVoice, pChannel, &pDLSArt->eg1, &pWTVoice->eg1Value, &pWTVoice->eg1Increment, &pWTVoice->eg1State); - DLS_UpdateEnvelope(pVoice, pChannel, &pDLSArt->eg2, &pWTVoice->eg2Value, &pWTVoice->eg2Increment, &pWTVoice->eg2State); - - /* update the LFOs using the EAS synth function */ - WT_UpdateLFO(&pWTVoice->modLFO, pDLSArt->modLFO.lfoFreq); - WT_UpdateLFO(&pWTVoice->vibLFO, pDLSArt->vibLFO.lfoFreq); - - /* calculate base frequency */ - temp = pDLSArt->tuning + pChannel->staticPitch + pDLSRegion->wtRegion.tuning + - (((EAS_I32) pVoice->note * (EAS_I32) pDLSArt->keyNumToPitch) >> 7); - - /* don't transpose rhythm channel */ - if ((pChannel ->channelFlags & CHANNEL_FLAG_RHYTHM_CHANNEL) == 0) - temp += pSynth->globalTranspose * 100; - - /* calculate phase increment including modulation effects */ - intFrame.frame.phaseIncrement = DLS_UpdatePhaseInc(pWTVoice, pDLSArt, pChannel, temp); - - /* calculate gain including modulation effects */ - intFrame.frame.gainTarget = DLS_UpdateGain(pWTVoice, pDLSArt, pChannel, pDLSRegion->wtRegion.gain, pVoice->velocity); - intFrame.prevGain = pVoice->gain; - - DLS_UpdateFilter(pVoice, pWTVoice, &intFrame, pChannel, pDLSArt); - - /* call into engine to generate samples */ - intFrame.pAudioBuffer = pVoiceMgr->voiceBuffer; - intFrame.pMixBuffer = pMixBuffer; - intFrame.numSamples = numSamples; - if (numSamples < 0) - return EAS_FALSE; - - /* check for end of sample */ - if ((pWTVoice->loopStart != WT_NOISE_GENERATOR) && (pWTVoice->loopStart == pWTVoice->loopEnd)) - done = WT_CheckSampleEnd(pWTVoice, &intFrame, EAS_FALSE); - - WT_ProcessVoice(pWTVoice, &intFrame); - - /* clear flag */ - pVoice->voiceFlags &= ~VOICE_FLAG_NO_SAMPLES_SYNTHESIZED_YET; - - /* if the update interval has elapsed, then force the current gain to the next - * gain since we never actually reach the next gain when ramping -- we just get - * very close to the target gain. - */ - pVoice->gain = (EAS_I16) intFrame.frame.gainTarget; - - /* if voice has finished, set flag for voice manager */ - if ((pVoice->voiceState != eVoiceStateStolen) && (pWTVoice->eg1State == eEnvelopeStateMuted)) - done = EAS_TRUE; - - return done; -} - -/*---------------------------------------------------------------------------- - * DLS_UpdateEnvelope() - *---------------------------------------------------------------------------- - * Purpose: - * Synthesize a block of samples for the given voice. - * Use linear interpolation. - * - * Inputs: - * pEASData - pointer to overall EAS data structure - * - * Outputs: - * number of samples actually written to buffer - * - * Side Effects: - * - samples are added to the presently free buffer - * - *---------------------------------------------------------------------------- -*/ -/*lint -esym(715, pChannel) pChannel not used in this instance */ -static void DLS_UpdateEnvelope (S_SYNTH_VOICE *pVoice, S_SYNTH_CHANNEL *pChannel, const S_DLS_ENVELOPE *pEnvParams, EAS_I16 *pValue, EAS_I16 *pIncrement, EAS_U8 *pState) -{ - EAS_I32 temp; - - switch (*pState) - { - /* initial state */ - case eEnvelopeStateInit: - *pState = eEnvelopeStateDelay; - *pValue = 0; - *pIncrement = pEnvParams->delayTime; - if (*pIncrement != 0) - return; - /*lint -e{825} falls through to next case */ - - case eEnvelopeStateDelay: - if (*pIncrement) - { - *pIncrement = *pIncrement - 1; - return; - } - - /* calculate attack rate */ - *pState = eEnvelopeStateAttack; - if (pEnvParams->attackTime != ZERO_TIME_IN_CENTS) - { - /*lint -e{702} use shift for performance */ - temp = pEnvParams->attackTime + ((pEnvParams->velToAttack * pVoice->velocity) >> 7); - *pIncrement = ConvertRate(temp); - return; - } - - *pValue = SYNTH_FULL_SCALE_EG1_GAIN; - /*lint -e{825} falls through to next case */ - - case eEnvelopeStateAttack: - if (*pValue < SYNTH_FULL_SCALE_EG1_GAIN) - { - temp = *pValue + *pIncrement; - *pValue = (EAS_I16) (temp < SYNTH_FULL_SCALE_EG1_GAIN ? temp : SYNTH_FULL_SCALE_EG1_GAIN); - return; - } - - /* calculate hold time */ - *pState = eEnvelopeStateHold; - if (pEnvParams->holdTime != ZERO_TIME_IN_CENTS) - { - /*lint -e{702} use shift for performance */ - temp = pEnvParams->holdTime + ((pEnvParams->keyNumToHold * pVoice->note) >> 7); - *pIncrement = ConvertDelay(temp); - return; - } - else - *pIncrement = 0; - /*lint -e{825} falls through to next case */ - - case eEnvelopeStateHold: - if (*pIncrement) - { - *pIncrement = *pIncrement - 1; - return; - } - - /* calculate decay rate */ - *pState = eEnvelopeStateDecay; - if (pEnvParams->decayTime != ZERO_TIME_IN_CENTS) - { - /*lint -e{702} use shift for performance */ - temp = pEnvParams->decayTime + ((pEnvParams->keyNumToDecay * pVoice->note) >> 7); - *pIncrement = ConvertRate(temp); - return; - } - -// *pValue = pEnvParams->sustainLevel; - /*lint -e{825} falls through to next case */ - - case eEnvelopeStateDecay: - if (*pValue > pEnvParams->sustainLevel) - { - temp = *pValue - *pIncrement; - *pValue = (EAS_I16) (temp > pEnvParams->sustainLevel ? temp : pEnvParams->sustainLevel); - return; - } - - *pState = eEnvelopeStateSustain; - *pValue = pEnvParams->sustainLevel; - /*lint -e{825} falls through to next case */ - - case eEnvelopeStateSustain: - return; - - case eEnvelopeStateRelease: - temp = *pValue - *pIncrement; - if (temp <= 0) - { - *pState = eEnvelopeStateMuted; - *pValue = 0; - } - else - *pValue = (EAS_I16) temp; - break; - - case eEnvelopeStateMuted: - *pValue = 0; - return; - - default: - { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Envelope in invalid state %d\n", *pState); */ } - break; - } -} - |