/// <summary> /// Draws a playback /// </summary> /// <param name="music"></param> public void DrawPlaybackTool(AudioFileMusicObject myScript) { GUIContent blontent = new GUIContent("Audio Playback Preview", "Allows you to preview how your AudioFileMusicObject will sound during runtime right here in the inspector. " + "Some effects, like spatialization, will not be available to preview"); showPlaybackTool = EditorCompatability.SpecialFoldouts(showPlaybackTool, blontent); if (showPlaybackTool) { AudioClip music = myScript.GetFile(); Rect progressRect = ProgressBar((float)AudioPlaybackToolEditor.helperSource.timeSamples / (float)AudioPlaybackToolEditor.helperSource.clip.samples, GetInfoString()); EditorGUILayout.BeginHorizontal(); Event evt = Event.current; if (evt.isMouse) { switch (evt.type) { case EventType.MouseUp: mouseDragging = false; break; case EventType.MouseDown: case EventType.MouseDrag: if (evt.type == EventType.MouseDown) { if (evt.mousePosition.y > progressRect.yMin && evt.mousePosition.y < progressRect.yMax) { mouseDragging = true; mouseScrubbed = true; } else { mouseDragging = false; } } if (!mouseDragging) { break; } float newProgress = Mathf.InverseLerp(progressRect.xMin, progressRect.xMax, evt.mousePosition.x); AudioPlaybackToolEditor.helperSource.time = Mathf.Clamp((newProgress * music.length), 0, music.length - AudioManager.EPSILON); if (myScript.loopMode == LoopMode.LoopWithLoopPoints && myScript.clampToLoopPoints) { float start = myScript.loopStart * myScript.GetFile().frequency; float end = myScript.loopEnd * myScript.GetFile().frequency; AudioPlaybackToolEditor.helperSource.timeSamples = (int)Mathf.Clamp(AudioPlaybackToolEditor.helperSource.timeSamples, start, end - AudioManager.EPSILON); } break; } } if (GUILayout.Button(s_BackIcon, new GUILayoutOption[] { GUILayout.MaxHeight(20) })) { if (myScript.loopMode == LoopMode.LoopWithLoopPoints && myScript.clampToLoopPoints) { AudioPlaybackToolEditor.helperSource.timeSamples = Mathf.CeilToInt((myScript.loopStart * music.frequency)); } else { AudioPlaybackToolEditor.helperSource.timeSamples = 0; } AudioPlaybackToolEditor.helperSource.Stop(); mouseScrubbed = false; clipPaused = false; clipPlaying = false; } Color colorbackup = GUI.backgroundColor; GUIContent buttonIcon = (clipPlaying) ? s_PlayIcons[1] : s_PlayIcons[0]; if (clipPlaying) { GUI.backgroundColor = buttonPressedColor; } if (GUILayout.Button(buttonIcon, new GUILayoutOption[] { GUILayout.MaxHeight(20) })) { clipPlaying = !clipPlaying; if (clipPlaying) { // Note: For some reason, reading from AudioPlaybackToolEditor.helperSource.time returns 0 even if timeSamples is not 0 // However, writing a value to AudioPlaybackToolEditor.helperSource.time changes timeSamples to the appropriate value just fine AudioPlaybackToolEditor.helperHelper.PlayDebug(myScript, mouseScrubbed); if (clipPaused) { AudioPlaybackToolEditor.helperSource.Pause(); } firstPlayback = true; freePlay = false; } else { AudioPlaybackToolEditor.helperSource.Stop(); if (!mouseScrubbed) { AudioPlaybackToolEditor.helperSource.time = 0; } clipPaused = false; } } GUI.backgroundColor = colorbackup; GUIContent theText = (clipPaused) ? s_PauseIcons[1] : s_PauseIcons[0]; if (clipPaused) { GUI.backgroundColor = buttonPressedColor; } if (GUILayout.Button(theText, new GUILayoutOption[] { GUILayout.MaxHeight(20) })) { clipPaused = !clipPaused; if (clipPaused) { AudioPlaybackToolEditor.helperSource.Pause(); } else { AudioPlaybackToolEditor.helperSource.UnPause(); } } GUI.backgroundColor = colorbackup; buttonIcon = (loopClip) ? s_LoopIcons[1] : s_LoopIcons[0]; if (loopClip) { GUI.backgroundColor = buttonPressedColor; } if (GUILayout.Button(buttonIcon, new GUILayoutOption[] { GUILayout.MaxHeight(20) })) { loopClip = !loopClip; // AudioPlaybackToolEditor.helperSource.loop = true; } GUI.backgroundColor = colorbackup; if (GUILayout.Button(openIcon, new GUILayoutOption[] { GUILayout.MaxHeight(19) })) { AudioPlaybackToolEditor.Init(); } // Reset loop point input mode if not using loop points so the duration shows up as time by default if (myScript.loopMode != LoopMode.LoopWithLoopPoints) { loopPointInputMode = 0; } switch ((LoopPointTool)loopPointInputMode) { case LoopPointTool.Slider: case LoopPointTool.TimeInput: blontent = new GUIContent(AudioPlaybackToolEditor.TimeToString((float)AudioPlaybackToolEditor.helperSource.timeSamples / music.frequency) + " / " + (AudioPlaybackToolEditor.TimeToString(music.length)), "The playback time in seconds"); break; case LoopPointTool.TimeSamplesInput: blontent = new GUIContent(AudioPlaybackToolEditor.helperSource.timeSamples + " / " + music.samples, "The playback time in samples"); break; case LoopPointTool.BPMInput: blontent = new GUIContent(string.Format("{0:0}", AudioPlaybackToolEditor.helperSource.time / (60f / myScript.bpm)) + " / " + music.length / (60f / myScript.bpm), "The playback time in beats"); break; } GUIStyle rightJustified = new GUIStyle(EditorStyles.label); rightJustified.alignment = TextAnchor.UpperRight; EditorGUILayout.LabelField(blontent, rightJustified); EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); } EditorCompatability.EndSpecialFoldoutGroup(); }
void DrawPlaybackTool() { GUIContent fContent = new GUIContent("Audio Playback Preview", "Allows you to preview how your AudioFileObject will sound during runtime right here in the inspector. " + "Some effects, like spatialization and delay, will not be available to preview"); showPlaybackTool = EditorCompatability.SpecialFoldouts(showPlaybackTool, fContent); if (showPlaybackTool) { var helperSource = AudioPlaybackToolEditor.helperSource; ProgressBar(AudioPlaybackToolEditor.helperSource.time / playingClip.length, GetInfoString()); EditorGUILayout.BeginHorizontal(); Color colorbackup = GUI.backgroundColor; if (clipPlaying) { GUI.backgroundColor = buttonPressedColor; fContent = new GUIContent("Stop", "Stop playback"); } else { fContent = new GUIContent("Play", "Play a preview of the sound with it's current sound settings."); } if (GUILayout.Button(fContent)) { AudioPlaybackToolEditor.helperSource.Stop(); if (playingClip != null && !clipPlaying) { if (playingRandom) { AudioPlaybackToolEditor.DoForceRepaint(true); playingRandom = false; } StartFading(); } else { clipPlaying = false; } } GUI.backgroundColor = colorbackup; using (new EditorGUI.DisabledScope(asset.GetFileCount() < 2)) { if (GUILayout.Button(new GUIContent("Play Random", "Preview settings with a random track from your library. Only usable if this Audio File has \"Use Library\" enabled."))) { DesignateRandomAudioClip(); helperSource.Stop(); StartFading(); } } if (GUILayout.Button(openIcon, new GUILayoutOption[] { GUILayout.MaxHeight(19) })) { AudioPlaybackToolEditor.Init(); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); } EditorCompatability.EndSpecialFoldoutGroup(); }