Exemplo n.º 1
0
    private void PlayNode(InAudioNode current, DSPTime endTime, float offset, InAudioData audioData)
    {
        float nodeVolume;

        double playTime = endTime.CurrentEndTime;

        if (endTime.Player != null && endTime.Player.clip != null)
        {
            int samples = endTime.Player.timeSamples;
            if (samples > 0 && samples < endTime.Player.clip.samples)
            {
                //Debug.Log("nonnull " + Time.time);
                double timeLeft = endTime.Player.clip.ExactLength() - samples / (double)endTime.Player.clip.frequency;
                double dspTime  = AudioSettings.dspTime;
                playTime = dspTime + timeLeft;
            }
        }

        float length = PlayScheduled(ParentFolder, current, audioData, playTime,
                                     offset, out nodeVolume);

        Current.OriginalVolume = nodeVolume;

        endTime.CurrentEndTime += length;
        endTime.Player          = Current.AudioSource;
    }
Exemplo n.º 2
0
    private IEnumerator StartPlay(InAudioNode current, DSPTime endTime)
    {
        yield return(StartCoroutine(NextNode(current, endTime, 0)));

        yield return(new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime)));

        endTime.Player = null;
        dspPool.ReleaseObject(endTime);
        StopFast();
    }
Exemplo n.º 3
0
    private IEnumerator StartPlay(AudioNode root, AudioNode current, DSPTime endTime)
    {
        breakLoop      = false;
        beloningToNode = current;
        current.Bus.GetRuntimePlayers().Add(this);

        yield return(StartCoroutine(FindNext(root, current, endTime)));

        //Debug.Log(endTime.CurrentEndTime + " - " + AudioSettings.dspTime + " = " + (endTime.CurrentEndTime - AudioSettings.dspTime));
        yield return(new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime)));

        //Clean up object
        StopAndCleanup();
    }
Exemplo n.º 4
0
    /// <summary>
    /// Internal InAudio play method. Please use InAudio.Play(...) to play audio
    /// </summary>
    public void _internalPlay(InAudioNode node, GameObject controllingObject, RuntimeInfo playingInfo, float fade, LeanTweenType fadeType)
    {
        dspPool       = InAudioInstanceFinder.DSPTimePool;
        attachedToBus = node.GetBus();
        breakLoop     = false;
        attachedToBus.RuntimePlayers.Add(this);
        controlling  = controllingObject;
        ParentFolder = TreeWalker.FindParentBeforeFolder(node);

        //This is to queue the next playing node, as the first clip will not yield a waitforseconds
        //firstClip = true;
        runtimeInfo = playingInfo;

        PlayingNode = node;
        DSPTime time = dspPool.GetObject();

        //Debug.Log(fade  + " "+ fadeType);

        time.CurrentEndTime = AudioSettings.dspTime;
        isActive            = true;
        fadeVolume          = 1f;
        volume = 1.0f;
        pan    = 1.0f;
        spread = 0.0f;
        pan2D  = 0.0f;
        if (fade > 0)
        {
            LTDescr tweever = LeanTween.value(controllingObject, f =>
            {
                fadeVolume = f;
                SetFadeVolume(f);
            }, 0f, 1f, fade);
            tweever.tweenType = fadeType;
            fadeVolume        = 0;
            SetFadeVolume(0);
        }

        StartCoroutine(StartPlay(node, time));
    }
Exemplo n.º 5
0
    private void PlayNode(InAudioNode current, DSPTime endTime, float offset, InAudioData audioData)
    {
        float nodeVolume;

        double playTime = endTime.CurrentEndTime;
        double timeLeft = 0;

        if (endTime.Player != null && endTime.Player.clip != null)
        {
            int samples = endTime.Player.timeSamples;
            if (samples > 0 && samples < endTime.Player.clip.samples)
            {
                timeLeft = TimeLeftOfClip(endTime, samples) / endTime.Player.pitch;
                double dspTime = AudioSettings.dspTime;
                playTime = dspTime + timeLeft;
            }
        }

        float length = PlayScheduled(ParentBeforeFolder, current, audioData, playTime,
                                     offset, out nodeVolume);

        endTime.CurrentEndTime += length;
        endTime.Player          = Current.AudioSource;
    }
Exemplo n.º 6
0
 private static double TimeLeftOfClip(DSPTime endTime, int samples)
 {
     return(endTime.Player.clip.ExactLength() - (samples / (double)endTime.Player.clip.frequency));
 }
Exemplo n.º 7
0
    private IEnumerator NextNode(InAudioNode current, DSPTime endTime, float sampleOffset)
    {
        byte loops        = 0;
        var  nodeData     = current._nodeData as InAudioNodeData;
        bool loopInfinite = nodeData.LoopInfinite;

        if (!loopInfinite)
        {
            loops = RuntimeHelper.GetLoops(current);
        }

        endTime.CurrentEndTime += RuntimeHelper.InitialDelay(nodeData);

        if (nodeData.Loop == false)
        {
            loops        = 0;
            loopInfinite = false;
        }
        for (int i = 0; i < 1 + loops || loopInfinite; ++i) //For at least once
        {
            if (current._type == AudioNodeType.Audio)
            {
                NextFreeAudioSource();

                var   audioData = current._nodeData as InAudioData;
                float preOffset = sampleOffset + RuntimeHelper.Offset(nodeData);

                if (preOffset > 0)
                {
                    if (audioData._clip != null)
                    {
                        int sampleCount = audioData._clip.samples;
                        if (sampleOffset < sampleCount)
                        {
                            PlayNode(current, endTime, preOffset, audioData);

                            if (!firstPlay)
                            {
                                yield return
                                    (new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime) -
                                                        0.5f));
                            }
                            else
                            {
                                yield return
                                    (new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime) / 2f));
                            }
                            firstPlay = false;
                        }
                    }
                    else
                    {
                        Debug.LogWarning("InAudio: Audio clip missing on audio node \"" + current.Name + "\", id=" + current._ID);
                    }
                }
                else
                {
                    PlayNode(current, endTime, preOffset, audioData);
                    if (!firstPlay)
                    {
                        yield return(new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime) - 0.5f));
                    }
                    else
                    {
                        yield return(new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime) / 2f));
                    }
                    firstPlay = false;
                }
            }
            else if (current._type == AudioNodeType.Random)
            {
                sampleOffset += RuntimeHelper.Offset(nodeData);
                var randomData = nodeData as RandomData;
                if (current._children.Count != randomData.weights.Count)
                {
                    Debug.LogWarning("InAudio: There is a problem with the random weights in the node \"" +
                                     current.Name + "\", id=" + current._ID +
                                     ". \nPlease open the audio window for the node and follow instructions");
                }

                if (current._children.Count > 0)
                {
                    int next = RuntimeHelper.SelectRandom(randomData);
                    if (next != -1)
                    {
                        yield return(StartCoroutine(NextNode(current._children[next], endTime, sampleOffset)));
                    }
                    else
                    {
                        Debug.LogWarning("InAudio: Cannot pick random as node \"" +
                                         current.Name + "\", id=" + current._ID +
                                         " has no children.\n");
                    }
                }
            }
            else if (current._type == AudioNodeType.Sequence)
            {
                sampleOffset += RuntimeHelper.Offset(nodeData);
                for (int j = 0; j < current._children.Count; ++j)
                {
                    yield return(StartCoroutine(NextNode(current._children[j], endTime, sampleOffset)));
                }
            }
            else if (current._type == AudioNodeType.Multi)
            {
                sampleOffset += RuntimeHelper.Offset(nodeData);
                int childrenCount = current._children.Count;

                Coroutine[] toStart    = InAudioInstanceFinder.CoroutinePool.GetArray(childrenCount);
                DSPTime[]   childTimes = InAudioInstanceFinder.DSPArrayPool.GetArray(childrenCount);

                for (int j = 0; j < childrenCount; ++j)
                {
                    DSPTime dspTime = dspPool.GetObject();
                    dspTime.CurrentEndTime = endTime.CurrentEndTime;
                    childTimes[j]          = dspTime;
                }
                for (int j = 0; j < childrenCount; ++j)
                {
                    toStart[j] = StartCoroutine(NextNode(current._children[j], childTimes[j], sampleOffset));
                }

                for (int j = 0; j < childrenCount; j++)
                {
                    yield return(toStart[j]);
                }

                for (int j = 0; j < childrenCount; ++j)
                {
                    DSPTime dspTime = childTimes[j];
                    if (endTime.CurrentEndTime < dspTime.CurrentEndTime)
                    {
                        endTime.CurrentEndTime = dspTime.CurrentEndTime;
                    }
                    else
                    {
                        dspPool.ReleaseObject(dspTime);
                    }
                }

                InAudioInstanceFinder.CoroutinePool.Release(toStart);
                InAudioInstanceFinder.DSPArrayPool.Release(childTimes);
            }

            if (breakLoop && (loops > 0 || loopInfinite))
            {
                breakLoop    = false;
                loops        = 0;
                loopInfinite = false;
            }
        }
    }
Exemplo n.º 8
0
    /// <summary>
    /// Internal InAudio play method. Please use InAudio.Play(...) to play audio
    /// </summary>
    public void _internalPlay(InAudioNode node, GameObject controllingObject, RuntimeInfo playingInfo, float fade, LeanTweenType fadeType, AudioParameters parameters)
    {
        if (node.IsRootOrFolder)
        {
            Debug.LogWarning("InAudio: Cannot play Folder node \"" + node.Name + "\"");
            return;
        }

        if (audioParameters == null)
        {
            audioParameters = new AudioParameters();
        }

        if (parameters != null)
        {
            audioParameters.CopyFrom(parameters);
        }
        else
        {
            audioParameters.Reset();
        }


        dspPool   = InAudioInstanceFinder.DSPTimePool;
        breakLoop = false;

        controlling        = controllingObject;
        ParentBeforeFolder = TreeWalker.FindParentBeforeFolder(node);
        ParentFolder       = ParentBeforeFolder._parent._nodeData as InFolderData;
        folderVolume       = 1.0f;
        if (ParentFolder != null)
        {
            folderVolume = ParentFolder.runtimeVolume;
            ParentFolder.runtimePlayers.Add(this);
        }

        //This is to queue the next playing node, as the first clip will not yield a waitforseconds
        //firstClip = true;
        runtimeInfo = playingInfo;

        PlayingNode = node;
        DSPTime time = dspPool.GetObject();


        time.CurrentEndTime = AudioSettings.dspTime;
        isActive            = true;
        fadeVolume          = 1f;
        _spread             = 0.0f;
        if (fade > 0)
        {
            LTDescr tweever = LeanTween.value(controllingObject, f =>
            {
                fadeVolume = f;
                SetFadeVolume(f);
            }, 0f, 1f, fade);
            tweever.tweenType = fadeType;
            fadeVolume        = 0;
            SetFadeVolume(0);
        }

        StartCoroutine(StartPlay(node, time));
    }
Exemplo n.º 9
0
 private static double TimeLeftOfClip(DSPTime endTime, int samples)
 {
     return endTime.Player.clip.ExactLength() - (samples/(double) endTime.Player.clip.frequency);
 }
Exemplo n.º 10
0
    private void PlayNode(InAudioNode current, DSPTime endTime, float offset, InAudioData audioData)
    {
        float nodeVolume;

        double playTime = endTime.CurrentEndTime;
        double timeLeft = 0;
        if (endTime.Player != null && endTime.Player.clip != null)
        {
            int samples = endTime.Player.timeSamples;
            if (samples > 0 && samples < endTime.Player.clip.samples)
            {
                timeLeft = TimeLeftOfClip(endTime, samples)/endTime.Player.pitch;
                double dspTime = AudioSettings.dspTime;
                playTime = dspTime + timeLeft;
            }
        }

        float length = PlayScheduled(ParentBeforeFolder, current, audioData, playTime,
            offset, out nodeVolume);

        endTime.CurrentEndTime += length;
        endTime.Player = Current.AudioSource;
    }
Exemplo n.º 11
0
    private IEnumerator NextNode(InAudioNode current, DSPTime endTime, float sampleOffset)
    {
        byte loops = 0;
        var nodeData = current._nodeData as InAudioNodeData;
        bool loopInfinite = nodeData.LoopInfinite;
        if (!loopInfinite)
            loops = RuntimeHelper.GetLoops(current);

        endTime.CurrentEndTime += RuntimeHelper.InitialDelay(nodeData);

        if (nodeData.Loop == false)
        {
            loops = 0;
            loopInfinite = false;
        }
        for (int i = 0; i < 1 + loops || loopInfinite; ++i) //For at least once
        {

            if (current._type == AudioNodeType.Audio)
            {
                NextFreeAudioSource();

                var audioData = current._nodeData as InAudioData;
                float preOffset = sampleOffset + RuntimeHelper.Offset(nodeData);

                if (preOffset > 0)
                {
                    if (audioData._clip != null)
                    {

                        int sampleCount = audioData._clip.samples;
                        if (sampleOffset < sampleCount)
                        {
                            PlayNode(current, endTime, preOffset, audioData);

                            if (!firstPlay)
                                yield return
                                    new WaitForSeconds((float) (endTime.CurrentEndTime - AudioSettings.dspTime) -
                                                        0.5f);
                            else
                            {
                                yield return
                                    new WaitForSeconds((float) (endTime.CurrentEndTime - AudioSettings.dspTime)/2f);
                            }
                            firstPlay = false;
                        }
                    }
                    else
                    {
                        Debug.LogWarning("InAudio: Audio clip missing on audio node \"" + current.Name + "\", id=" + current._ID);
                    }
                }
                else
                {
                    PlayNode(current, endTime, preOffset, audioData);
                    if (!firstPlay)
                    {
                        yield return new WaitForSeconds((float) (endTime.CurrentEndTime - AudioSettings.dspTime) - 0.5f);
                    }
                    else
                    {
                        yield return new WaitForSeconds((float) (endTime.CurrentEndTime - AudioSettings.dspTime)/2f);
                    }
                    firstPlay = false;
                }
            }
            else if (current._type == AudioNodeType.Random)
            {
                sampleOffset += RuntimeHelper.Offset(nodeData);
                var randomData = nodeData as RandomData;
                if (current._children.Count != randomData.weights.Count)
                {
                    Debug.LogWarning("InAudio: There is a problem with the random weights in the node \"" +
                                                current.Name + "\", id=" + current._ID +
                                                ". \nPlease open the audio window for the node and follow instructions");
                }

                if (current._children.Count > 0)
                {
                    int next = RuntimeHelper.SelectRandom(randomData);
                    if (next != -1)
                    {
                        yield return StartCoroutine(NextNode(current._children[next], endTime, sampleOffset));
                    }
                    else
                    {
                        Debug.LogWarning("InAudio: Cannot pick random as node \"" +
                                                current.Name + "\", id=" + current._ID +
                                                " has no children.\n");
                    }
                }
            }
            else if (current._type == AudioNodeType.Sequence)
            {
                sampleOffset += RuntimeHelper.Offset(nodeData);
                for (int j = 0; j < current._children.Count; ++j)
                {
                    yield return StartCoroutine(NextNode(current._children[j], endTime, sampleOffset));
                }
            }
            else if (current._type == AudioNodeType.Multi)
            {
                sampleOffset += RuntimeHelper.Offset(nodeData);
                int childrenCount = current._children.Count;

                Coroutine[] toStart = InAudioInstanceFinder.CoroutinePool.GetArray(childrenCount);
                DSPTime[] childTimes = InAudioInstanceFinder.DSPArrayPool.GetArray(childrenCount);

                for (int j = 0; j < childrenCount; ++j)
                {
                    DSPTime dspTime = dspPool.GetObject();
                    dspTime.CurrentEndTime = endTime.CurrentEndTime;
                    childTimes[j] = dspTime;
                }
                for (int j = 0; j < childrenCount; ++j)
                {
                    toStart[j] = StartCoroutine(NextNode(current._children[j], childTimes[j], sampleOffset));
                }

                for (int j = 0; j < childrenCount; j++)
                {
                    yield return toStart[j];
                }

                for (int j = 0; j < childrenCount; ++j)
                {
                    DSPTime dspTime = childTimes[j];
                    if (endTime.CurrentEndTime < dspTime.CurrentEndTime)
                        endTime.CurrentEndTime = dspTime.CurrentEndTime;
                    else
                        dspPool.ReleaseObject(dspTime);
                }

                InAudioInstanceFinder.CoroutinePool.Release(toStart);
                InAudioInstanceFinder.DSPArrayPool.Release(childTimes);
            }

            if (breakLoop && (loops > 0 || loopInfinite))
            {
                breakLoop = false;
                loops = 0;
                loopInfinite = false;
            }
        }
    }
Exemplo n.º 12
0
    private IEnumerator StartPlay(InAudioNode current, DSPTime endTime)
    {
        yield return StartCoroutine(NextNode(current, endTime, 0));

        yield return new WaitForSeconds((float) (endTime.CurrentEndTime - AudioSettings.dspTime));
        endTime.Player = null;
        dspPool.ReleaseObject(endTime);
        StopFast();
    }
Exemplo n.º 13
0
    private IEnumerator FindNext(AudioNode root, AudioNode current, DSPTime endTime)
    {
        byte loops        = 0;
        var  nodeData     = current.NodeData;
        bool loopInfinite = nodeData.LoopInfinite;

        if (!loopInfinite)
        {
            loops = RuntimeHelper.GetLoops(current);
        }

        endTime.CurrentEndTime += RuntimeHelper.InitialDelay(nodeData);

        if (nodeData.Loop == false)
        {
            loops        = 0;
            loopInfinite = false;
        }
        for (int i = 0; i < 1 + loops || loopInfinite; ++i) //For at least once
        {
            if (breakLoop)
            {
                loops        = 0;
                loopInfinite = false;
            }

            if (current.Type == AudioNodeType.Audio)
            {
                NextFreeAudioSource();
                float nodeVolume;

                float length = PlayScheduled(root, current, endTime.CurrentEndTime, out nodeVolume);

                originalVolume[currentIndex] = nodeVolume;

                endTime.CurrentEndTime += length;

                if (!firstClip)
                {
                    yield return(new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime) - length + 0.050f));
                }

                firstClip = false;
            }
            else if (current.Type == AudioNodeType.Random)
            {
                yield return(StartCoroutine(FindNext(root, RuntimeHelper.SelectRandom(current), endTime)));
            }
            else if (current.Type == AudioNodeType.Sequence)
            {
                for (int j = 0; j < current.Children.Count; ++j)
                {
                    yield return(StartCoroutine(FindNext(root, current.Children[j], endTime)));
                }
            }
            else if (current.Type == AudioNodeType.Multi)
            {
                Coroutine[] toStart    = new Coroutine[current.Children.Count];
                DSPTime[]   childTimes = new DSPTime[current.Children.Count];

                for (int j = 0; j < childTimes.Length; ++j)
                {
                    childTimes[j] = new DSPTime(endTime.CurrentEndTime);
                }
                for (int j = 0; j < current.Children.Count; ++j)
                {
                    toStart[j] = StartCoroutine(FindNext(root, current.Children[j], childTimes[j]));
                }
                for (int j = 0; j < childTimes.Length; ++j)
                {
                    if (endTime.CurrentEndTime < childTimes[j].CurrentEndTime)
                    {
                        endTime.CurrentEndTime = childTimes[j].CurrentEndTime;
                    }
                }
            }
        }
    }
Exemplo n.º 14
0
    private IEnumerator NextNode(InAudioNode current, DSPTime endTime, float sampleOffset)
    {
        byte loops        = 0;
        var  nodeData     = current.NodeData as InAudioNodeData;
        bool loopInfinite = nodeData.LoopInfinite;

        if (!loopInfinite)
        {
            loops = RuntimeHelper.GetLoops(current);
        }

        endTime.CurrentEndTime += RuntimeHelper.InitialDelay(nodeData);


        if (nodeData.Loop == false)
        {
            loops        = 0;
            loopInfinite = false;
        }
        for (int i = 0; i < 1 + loops || loopInfinite; ++i) //For at least once
        {
            if (current.Type == AudioNodeType.Audio)
            {
                NextFreeAudioSource();

                var   audioData = current.NodeData as InAudioData;
                float preOffset = sampleOffset + RuntimeHelper.Offset(nodeData);

                if (preOffset > 0)
                {
                    int sampleCount = audioData.Clip.samples;
                    if (sampleOffset < sampleCount)
                    {
                        PlayNode(current, endTime, preOffset, audioData);

                        if (!firstPlay)
                        {
                            yield return(new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime) - 0.05f));
                        }
                        else
                        {
                            yield return(new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime) / 2f));
                        }
                        firstPlay = false;
                    }
                }
                else
                {
                    PlayNode(current, endTime, preOffset, audioData);
                    if (!firstPlay)
                    {
                        yield return(new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime) - 0.05f));
                    }
                    else
                    {
                        yield return(new WaitForSeconds((float)(endTime.CurrentEndTime - AudioSettings.dspTime) / 2f));
                    }
                    firstPlay = false;
                }
            }
            else if (current.Type == AudioNodeType.Random)
            {
                sampleOffset += RuntimeHelper.Offset(nodeData);
                if (current.Children.Count > 0)
                {
                    yield return(StartCoroutine(NextNode(RuntimeHelper.SelectRandom(current), endTime, sampleOffset)));
                }
            }
            else if (current.Type == AudioNodeType.Sequence)
            {
                sampleOffset += RuntimeHelper.Offset(nodeData);
                for (int j = 0; j < current.Children.Count; ++j)
                {
                    yield return(StartCoroutine(NextNode(current.Children[j], endTime, sampleOffset)));
                }
            }
            else if (current.Type == AudioNodeType.Multi)
            {
                sampleOffset += RuntimeHelper.Offset(nodeData);
                int childrenCount = current.Children.Count;

                Coroutine[] toStart    = InAudioInstanceFinder.CoroutinePool.GetArray(childrenCount);
                DSPTime[]   childTimes = InAudioInstanceFinder.DSPArrayPool.GetArray(childrenCount);

                for (int j = 0; j < childrenCount; ++j)
                {
                    DSPTime dspTime = dspPool.GetObject();
                    dspTime.CurrentEndTime = endTime.CurrentEndTime;
                    childTimes[j]          = dspTime;
                }
                for (int j = 0; j < childrenCount; ++j)
                {
                    toStart[j] = StartCoroutine(NextNode(current.Children[j], childTimes[j], sampleOffset));
                }

                for (int j = 0; j < childrenCount; j++)
                {
                    yield return(toStart[j]);
                }

                for (int j = 0; j < childrenCount; ++j)
                {
                    DSPTime dspTime = childTimes[j];
                    if (endTime.CurrentEndTime < dspTime.CurrentEndTime)
                    {
                        endTime.CurrentEndTime = dspTime.CurrentEndTime;
                    }
                    else
                    {
                        dspPool.ReleaseObject(dspTime);
                    }
                }

                InAudioInstanceFinder.CoroutinePool.Release(toStart);
                InAudioInstanceFinder.DSPArrayPool.Release(childTimes);
            }

            if (breakLoop && (loops > 0 || loopInfinite))
            {
                breakLoop    = false;
                loops        = 0;
                loopInfinite = false;
            }
        }
    }