Пример #1
0
    private static float Ducking(InAudioBus bus)
    {
        //The maximum amount of volume it is being ducked
        float minDucking = 0;

        int duckedByCount = bus.DuckedBy.Count;

        for (int i = 0; i < duckedByCount; i++)
        {
            DuckingData ducking = bus.DuckedBy[i];
            float       ducked  = 0;
            if (!ducking.IsBeingDucked) //Release time
            {
                //Release time
                if (ducking.LastDuckedVolume < 0)
                {
                    ducked = ducking.LastDuckedVolume;

                    ducked -= Mathf.Lerp(ducking.VolumeDucking, 0, ducked) * Time.deltaTime / ducking.ReleaseTime;

                    ducked     = Mathf.Clamp(ducked, ducking.VolumeDucking, 0);
                    minDucking = Mathf.Min(minDucking, ducked);

                    minDucking = (1.0f - Curves.CumulativeDistribution(Fader.GetT(ducking.VolumeDucking, 0, minDucking))) * ducking.VolumeDucking;
                    minDucking = Mathf.Clamp(minDucking, ducking.VolumeDucking, 0);
                }
                //else
                //Do nothing as then the amount ducked is zero
            }
            else if (ducking.AttackTime > 0 && ducking.LastDuckedVolume > ducking.VolumeDucking) //Attack time
            {
                ducked     = ducking.LastDuckedVolume;
                ducked    += ducking.VolumeDucking * Time.deltaTime / ducking.AttackTime;
                ducked     = Mathf.Clamp(ducked, ducking.VolumeDucking, 0);
                minDucking = Mathf.Min(minDucking, ducked);
            }
            else
            {
                minDucking = Mathf.Min(minDucking, ducking.VolumeDucking);
                ducked     = ducking.VolumeDucking;
            }

            ducking.LastDuckedVolume = ducked;
            //Util.Debug.Graph("Ducked volume", minDucking);
        }
        bus.LastDuckedVolume = minDucking;


        return(minDucking);
    }