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; }
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(); }
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(); }
/// <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)); }
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; }
private static double TimeLeftOfClip(DSPTime endTime, int samples) { return(endTime.Player.clip.ExactLength() - (samples / (double)endTime.Player.clip.frequency)); }
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; } } }
/// <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)); }
private static double TimeLeftOfClip(DSPTime endTime, int samples) { return endTime.Player.clip.ExactLength() - (samples/(double) endTime.Player.clip.frequency); }
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; }
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; } } }
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(); }
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; } } } } }
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; } } }