From 078c2e2b51e464d834c16c6653224871b6144a97 Mon Sep 17 00:00:00 2001 From: Sinai <49360850+sinai-dev@users.noreply.github.com> Date: Mon, 21 Mar 2022 01:04:39 +1100 Subject: [PATCH] Add AudioClipWidget --- lib/unhollowed/UnityEngine.AudioModule.dll | Bin 0 -> 133632 bytes .../Widgets/UnityObjects/AudioClipWidget.cs | 409 ++++++++++++++++++ .../Widgets/UnityObjects/UnityObjectWidget.cs | 27 +- src/UnityExplorer.csproj | 5 + 4 files changed, 427 insertions(+), 14 deletions(-) create mode 100644 lib/unhollowed/UnityEngine.AudioModule.dll create mode 100644 src/UI/Widgets/UnityObjects/AudioClipWidget.cs diff --git a/lib/unhollowed/UnityEngine.AudioModule.dll b/lib/unhollowed/UnityEngine.AudioModule.dll new file mode 100644 index 0000000000000000000000000000000000000000..89cfbdaa13c8cb9f68f96ecc19995af33f7fe2bc GIT binary patch literal 133632 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 LU%>y5YvBI?m*W0_ literal 0 HcmV?d00001 diff --git a/src/UI/Widgets/UnityObjects/AudioClipWidget.cs b/src/UI/Widgets/UnityObjects/AudioClipWidget.cs new file mode 100644 index 0000000..0ab4f49 --- /dev/null +++ b/src/UI/Widgets/UnityObjects/AudioClipWidget.cs @@ -0,0 +1,409 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using UnityEngine; +using UnityEngine.UI; +using UnityExplorer.Config; +using UnityExplorer.Inspectors; +using UniverseLib; +using UniverseLib.UI; +using UniverseLib.UI.Models; +using UniverseLib.UI.ObjectPool; +using UniverseLib.Utility; + +namespace UnityExplorer.UI.Widgets +{ + public class AudioClipWidget : UnityObjectWidget + { + static GameObject AudioPlayerObject; + static AudioSource Source; + static AudioClipWidget CurrentlyPlaying; + static Coroutine CurrentlyPlayingCoroutine; + + public AudioClip RefAudioClip; + private string fullLengthText; + + private ButtonRef toggleButton; + private bool audioPlayerWanted; + + private GameObject audioPlayerRoot; + private ButtonRef playStopButton; + private Text progressLabel; + private GameObject saveObjectRow; + private InputFieldRef savePathInput; + private GameObject cantSaveRow; + + public override void OnBorrowed(object target, Type targetType, ReflectionInspector inspector) + { + base.OnBorrowed(target, targetType, inspector); + + this.audioPlayerRoot.transform.SetParent(inspector.UIRoot.transform); + this.audioPlayerRoot.transform.SetSiblingIndex(inspector.UIRoot.transform.childCount - 2); + + RefAudioClip = target.TryCast(); + this.fullLengthText = GetLengthString(RefAudioClip.length); + + if (RefAudioClip.loadType == AudioClipLoadType.DecompressOnLoad) + { + cantSaveRow.SetActive(false); + saveObjectRow.SetActive(true); + SetDefaultSavePath(); + } + else + { + cantSaveRow.SetActive(true); + saveObjectRow.SetActive(false); + } + + ResetProgressLabel(); + } + + public override void OnReturnToPool() + { + RefAudioClip = null; + + if (audioPlayerWanted) + ToggleAudioWidget(); + + if (CurrentlyPlaying == this) + StopClip(); + + this.audioPlayerRoot.transform.SetParent(Pool.Instance.InactiveHolder.transform); + + base.OnReturnToPool(); + } + + private void ToggleAudioWidget() + { + if (audioPlayerWanted) + { + audioPlayerWanted = false; + + toggleButton.ButtonText.text = "Show Player"; + audioPlayerRoot.SetActive(false); + } + else + { + audioPlayerWanted = true; + + toggleButton.ButtonText.text = "Hide Player"; + audioPlayerRoot.SetActive(true); + } + } + + void SetDefaultSavePath() + { + string name = RefAudioClip.name; + if (string.IsNullOrEmpty(name)) + name = "untitled"; + savePathInput.Text = Path.Combine(ConfigManager.Default_Output_Path.Value, $"{name}.wav"); + } + + static string GetLengthString(float seconds) + { + TimeSpan ts = TimeSpan.FromSeconds(seconds); + + StringBuilder sb = new(); + + if (ts.Hours > 0) + sb.Append($"{ts.Hours}:"); + + sb.Append($"{ts.Minutes:00}:"); + + sb.Append($"{ts.Seconds:00}:"); + sb.Append($"{ts.Milliseconds:000}"); + + return sb.ToString(); + } + + private void ResetProgressLabel() + { + this.progressLabel.text = $"{GetLengthString(0f)} / {fullLengthText}"; + } + + private void OnPlayStopClicked() + { + SetupAudioPlayer(); + + if (CurrentlyPlaying == this) + { + // we are playing a clip. stop it. + StopClip(); + } + else + { + // If something else is playing a clip, stop that. + if (CurrentlyPlaying != null) + CurrentlyPlaying.StopClip(); + + // we want to start playing a clip. + CurrentlyPlayingCoroutine = RuntimeHelper.StartCoroutine(PlayClipCoroutine()); + } + } + + static void SetupAudioPlayer() + { + if (AudioPlayerObject) + return; + + AudioPlayerObject = new GameObject("UnityExplorer.AudioPlayer"); + UnityEngine.Object.DontDestroyOnLoad(AudioPlayerObject); + AudioPlayerObject.hideFlags = HideFlags.HideAndDontSave; + AudioPlayerObject.transform.position = new(int.MinValue, int.MinValue); + +#if CPP + Source = AudioPlayerObject.AddComponent(UnhollowerRuntimeLib.Il2CppType.Of()).TryCast(); +#else + Source = AudioPlayerObject.AddComponent(); +#endif + AudioPlayerObject.AddComponent(); + } + + private IEnumerator PlayClipCoroutine() + { + playStopButton.ButtonText.text = "Stop Clip"; + CurrentlyPlaying = this; + Source.clip = this.RefAudioClip; + Source.Play(); + + while (Source.isPlaying) + { + progressLabel.text = $"{GetLengthString(Source.time)} / {fullLengthText}"; + yield return null; + } + + CurrentlyPlayingCoroutine = null; + StopClip(); + } + + private void StopClip() + { + if (CurrentlyPlayingCoroutine != null) + RuntimeHelper.StopCoroutine(CurrentlyPlayingCoroutine); + + Source.Stop(); + CurrentlyPlaying = null; + CurrentlyPlayingCoroutine = null; + playStopButton.ButtonText.text = "Play Clip"; + + ResetProgressLabel(); + } + + public void OnSaveClipClicked() + { + if (!RefAudioClip) + { + ExplorerCore.LogWarning("AudioClip is null, maybe it was destroyed?"); + return; + } + + if (string.IsNullOrEmpty(savePathInput.Text)) + { + ExplorerCore.LogWarning("Save path cannot be empty!"); + return; + } + + string path = savePathInput.Text; + if (!path.EndsWith(".wav", StringComparison.InvariantCultureIgnoreCase)) + path += ".wav"; + + path = IOUtility.EnsureValidFilePath(path); + + if (File.Exists(path)) + File.Delete(path); + + SavWav.Save(RefAudioClip, path); + } + + public override GameObject CreateContent(GameObject uiRoot) + { + GameObject ret = base.CreateContent(uiRoot); + + // Toggle Button + + toggleButton = UIFactory.CreateButton(UIRoot, "AudioWidgetToggleButton", "Show Player", new Color(0.2f, 0.3f, 0.2f)); + toggleButton.Transform.SetSiblingIndex(0); + UIFactory.SetLayoutElement(toggleButton.Component.gameObject, minHeight: 25, minWidth: 170); + toggleButton.OnClick += ToggleAudioWidget; + + // Actual widget + + audioPlayerRoot = UIFactory.CreateVerticalGroup(uiRoot, "AudioWidget", false, false, true, true, spacing: 5); + UIFactory.SetLayoutElement(audioPlayerRoot, flexibleWidth: 9999, flexibleHeight: 50); + audioPlayerRoot.SetActive(false); + + // Player + + GameObject playerRow = UIFactory.CreateHorizontalGroup(audioPlayerRoot, "PlayerWidget", false, false, true, true, + spacing: 5, padding: new() { x = 3f, w = 3f, y = 3f, z = 3f }); + + playStopButton = UIFactory.CreateButton(playerRow, "PlayerButton", "Play", normalColor: new(0.2f, 0.4f, 0.2f)); + playStopButton.OnClick += OnPlayStopClicked; + UIFactory.SetLayoutElement(playStopButton.GameObject, minWidth: 60, minHeight: 25); + + progressLabel = UIFactory.CreateLabel(playerRow, "ProgressLabel", "0 / 0"); + UIFactory.SetLayoutElement(progressLabel.gameObject, flexibleWidth: 9999, minHeight: 25); + + ResetProgressLabel(); + + // Save helper + + saveObjectRow = UIFactory.CreateHorizontalGroup(audioPlayerRoot, "SaveRow", false, false, true, true, 2, new Vector4(2, 2, 2, 2), + new Color(0.1f, 0.1f, 0.1f)); + + ButtonRef saveBtn = UIFactory.CreateButton(saveObjectRow, "SaveButton", "Save .WAV", new Color(0.2f, 0.25f, 0.2f)); + UIFactory.SetLayoutElement(saveBtn.Component.gameObject, minHeight: 25, minWidth: 100, flexibleWidth: 0); + saveBtn.OnClick += OnSaveClipClicked; + + savePathInput = UIFactory.CreateInputField(saveObjectRow, "SaveInput", "..."); + UIFactory.SetLayoutElement(savePathInput.UIRoot, minHeight: 25, minWidth: 100, flexibleWidth: 9999); + + // cant save label + cantSaveRow = UIFactory.CreateHorizontalGroup(audioPlayerRoot, "CantSaveRow", true, true, true, true); + UIFactory.SetLayoutElement(cantSaveRow, minHeight: 25, flexibleWidth: 9999); + UIFactory.CreateLabel( + cantSaveRow, + "CantSaveLabel", + "Cannot save this AudioClip as the data is compressed or streamed. Try a tool such as AssetRipper to unpack it.", + color: Color.grey); + + return ret; + } + } + +#region SavWav + + // Copyright (c) 2012 Calvin Rien + // http://the.darktable.com + // + // This software is provided 'as-is', without any express or implied warranty. In + // no event will the authors be held liable for any damages arising from the use + // of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it freely, + // subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not claim + // that you wrote the original software. If you use this software in a product, + // an acknowledgment in the product documentation would be appreciated but is not + // required. + // + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // + // 3. This notice may not be removed or altered from any source distribution. + // + // ============================================================================= + // + // derived from Gregorio Zanon's script + // http://forum.unity3d.com/threads/119295-Writing-AudioListener.GetOutputData-to-wav-problem?p=806734&viewfull=1#post806734 + + public static class SavWav + { + public const int HEADER_SIZE = 44; + + public static void Save(AudioClip clip, string filepath) + { + using FileStream fileStream = CreateEmpty(filepath); + + ConvertAndWrite(fileStream, clip); + WriteHeader(fileStream, clip); + } + + static FileStream CreateEmpty(string filepath) + { + FileStream fileStream = new(filepath, FileMode.Create); + byte emptyByte = default; + + for (int i = 0; i < HEADER_SIZE; i++) //preparing the header + fileStream.WriteByte(emptyByte); + + return fileStream; + } + + static void ConvertAndWrite(FileStream fileStream, AudioClip clip) + { +#if CPP + UnhollowerBaseLib.Il2CppStructArray samples = new float[clip.samples * clip.channels]; + AudioClip.GetData(clip, samples, clip.samples, 0); +#else + float[] samples = new float[clip.samples * clip.channels]; + clip.GetData(samples, 0); +#endif + + // converting in 2 float[] steps to Int16[], then Int16[] to Byte[] + short[] intData = new short[samples.Length]; + + // bytesData array is twice the size of dataSource array because a float converted in Int16 is 2 bytes. + byte[] bytesData = new byte[samples.Length * 2]; + + float rescaleFactor = 32767; // to convert float to Int16 + + for (int i = 0; i < samples.Length; i++) + { + intData[i] = (short)(samples[i] * rescaleFactor); + byte[] byteArr = BitConverter.GetBytes(intData[i]); + byteArr.CopyTo(bytesData, i * 2); + } + + fileStream.Write(bytesData, 0, bytesData.Length); + } + + static void WriteHeader(FileStream stream, AudioClip clip) + { + int hz = clip.frequency; + int channels = clip.channels; + int samples = clip.samples; + + stream.Seek(0, SeekOrigin.Begin); + + byte[] riff = Encoding.UTF8.GetBytes("RIFF"); + stream.Write(riff, 0, 4); + + byte[] chunkSize = BitConverter.GetBytes(stream.Length - 8); + stream.Write(chunkSize, 0, 4); + + byte[] wave = Encoding.ASCII.GetBytes("WAVE"); + stream.Write(wave, 0, 4); + + byte[] fmt = Encoding.ASCII.GetBytes("fmt "); + stream.Write(fmt, 0, 4); + + byte[] subChunk1 = BitConverter.GetBytes(16); + stream.Write(subChunk1, 0, 4); + + byte[] audioFormat = BitConverter.GetBytes(1); + stream.Write(audioFormat, 0, 2); + + byte[] numChannels = BitConverter.GetBytes(channels); + stream.Write(numChannels, 0, 2); + + byte[] sampleRate = BitConverter.GetBytes(hz); + stream.Write(sampleRate, 0, 4); + + byte[] byteRate = BitConverter.GetBytes(hz * channels * 2); // sampleRate * bytesPerSample*number of channels, here 44100*2*2 + stream.Write(byteRate, 0, 4); + + ushort blockAlign = (ushort)(channels * 2); + stream.Write(BitConverter.GetBytes(blockAlign), 0, 2); + + ushort bps = 16; + byte[] bitsPerSample = BitConverter.GetBytes(bps); + stream.Write(bitsPerSample, 0, 2); + + byte[] datastring = Encoding.UTF8.GetBytes("data"); + stream.Write(datastring, 0, 4); + + byte[] subChunk2 = BitConverter.GetBytes(samples * channels * 2); + stream.Write(subChunk2, 0, 4); + + stream.Seek(0, SeekOrigin.Begin); + } + +#endregion + } +} \ No newline at end of file diff --git a/src/UI/Widgets/UnityObjects/UnityObjectWidget.cs b/src/UI/Widgets/UnityObjects/UnityObjectWidget.cs index fe84aa1..36b004e 100644 --- a/src/UI/Widgets/UnityObjects/UnityObjectWidget.cs +++ b/src/UI/Widgets/UnityObjects/UnityObjectWidget.cs @@ -15,7 +15,6 @@ namespace UnityExplorer.UI.Widgets public Component ComponentRef; public ReflectionInspector ParentInspector; - protected GameObject unityObjectRow; protected ButtonRef gameObjectButton; protected InputFieldRef nameInput; protected InputFieldRef instanceIdInput; @@ -33,6 +32,8 @@ namespace UnityExplorer.UI.Widgets if (targetType == typeof(Texture2D)) ret = Pool.Borrow(); + else if (targetType == typeof(AudioClip)) + ret = Pool.Borrow(); else ret = Pool.Borrow(); @@ -42,7 +43,7 @@ namespace UnityExplorer.UI.Widgets public virtual void OnBorrowed(object target, Type targetType, ReflectionInspector inspector) { - this.ParentInspector = inspector; + this.ParentInspector = inspector ?? throw new ArgumentNullException(nameof(inspector)); if (!this.UIRoot) CreateContent(inspector.UIRoot); @@ -52,7 +53,7 @@ namespace UnityExplorer.UI.Widgets this.UIRoot.transform.SetSiblingIndex(inspector.UIRoot.transform.childCount - 2); UnityObjectRef = (UnityEngine.Object)target.TryCast(typeof(UnityEngine.Object)); - unityObjectRow.SetActive(true); + UIRoot.SetActive(true); nameInput.Text = UnityObjectRef.name; instanceIdInput.Text = UnityObjectRef.GetInstanceID().ToString(); @@ -101,31 +102,29 @@ namespace UnityExplorer.UI.Widgets public virtual GameObject CreateContent(GameObject uiRoot) { - unityObjectRow = UIFactory.CreateUIObject("UnityObjectRow", uiRoot); - UIFactory.SetLayoutGroup(unityObjectRow, false, false, true, true, 5); - UIFactory.SetLayoutElement(unityObjectRow, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999); + UIRoot = UIFactory.CreateUIObject("UnityObjectRow", uiRoot); + UIFactory.SetLayoutGroup(UIRoot, false, false, true, true, 5); + UIFactory.SetLayoutElement(UIRoot, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999); - UIRoot = unityObjectRow; - - var nameLabel = UIFactory.CreateLabel(unityObjectRow, "NameLabel", "Name:", TextAnchor.MiddleLeft, Color.grey); + var nameLabel = UIFactory.CreateLabel(UIRoot, "NameLabel", "Name:", TextAnchor.MiddleLeft, Color.grey); UIFactory.SetLayoutElement(nameLabel.gameObject, minHeight: 25, minWidth: 45, flexibleWidth: 0); - nameInput = UIFactory.CreateInputField(unityObjectRow, "NameInput", "untitled"); + nameInput = UIFactory.CreateInputField(UIRoot, "NameInput", "untitled"); UIFactory.SetLayoutElement(nameInput.UIRoot, minHeight: 25, minWidth: 100, flexibleWidth: 1000); nameInput.Component.readOnly = true; - gameObjectButton = UIFactory.CreateButton(unityObjectRow, "GameObjectButton", "Inspect GameObject", new Color(0.2f, 0.2f, 0.2f)); + gameObjectButton = UIFactory.CreateButton(UIRoot, "GameObjectButton", "Inspect GameObject", new Color(0.2f, 0.2f, 0.2f)); UIFactory.SetLayoutElement(gameObjectButton.Component.gameObject, minHeight: 25, minWidth: 160); gameObjectButton.OnClick += OnGameObjectButtonClicked; - var instanceLabel = UIFactory.CreateLabel(unityObjectRow, "InstanceLabel", "Instance ID:", TextAnchor.MiddleRight, Color.grey); + var instanceLabel = UIFactory.CreateLabel(UIRoot, "InstanceLabel", "Instance ID:", TextAnchor.MiddleRight, Color.grey); UIFactory.SetLayoutElement(instanceLabel.gameObject, minHeight: 25, minWidth: 100, flexibleWidth: 0); - instanceIdInput = UIFactory.CreateInputField(unityObjectRow, "InstanceIDInput", "ERROR"); + instanceIdInput = UIFactory.CreateInputField(UIRoot, "InstanceIDInput", "ERROR"); UIFactory.SetLayoutElement(instanceIdInput.UIRoot, minHeight: 25, minWidth: 100, flexibleWidth: 0); instanceIdInput.Component.readOnly = true; - unityObjectRow.SetActive(false); + UIRoot.SetActive(false); return UIRoot; } diff --git a/src/UnityExplorer.csproj b/src/UnityExplorer.csproj index ba8b56d..4c73b3b 100644 --- a/src/UnityExplorer.csproj +++ b/src/UnityExplorer.csproj @@ -199,6 +199,10 @@ ..\lib\unhollowed\UnityEngine.dll False + + ..\lib\unhollowed\UnityEngine.AudioModule.dll + False + ..\lib\unhollowed\UnityEngine.CoreModule.dll False @@ -324,6 +328,7 @@ +