Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 47 additions & 18 deletions Assets/Scripts/Utility/AssetInjection/SoundReplacement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@
// Source Code: https://github.com/Interkarma/daggerfall-unity
// Original Author: TheLacus
// Contributors:
//
//
// Notes:
//

using System.Collections;
using System.IO;
using UnityEngine;
using DaggerfallWorkshop.Game.Utility.ModSupport;
using UnityEngine.Networking;

namespace DaggerfallWorkshop.Utility.AssetInjection
{
Expand Down Expand Up @@ -86,20 +87,42 @@ private static bool TryImportAudioClip(string name, string extension, bool strea
string path = Path.Combine(soundPath, name + extension);
if (File.Exists(path))
{
WWW www = new WWW("file://" + path); // TODO: Replace with UnityWebRequest
if (streaming) {
audioClip = www.GetAudioClip(true, true);
string url = "file://" + path;
AudioType audioType = GetAudioTypeFromExtension(extension);

UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(url, audioType);
DownloadHandlerAudioClip downloadHandler = request.downloadHandler as DownloadHandlerAudioClip;

if (downloadHandler == null)
{
Debug.LogErrorFormat("Failed to create audio download handler for {0}", path);
audioClip = null;
request.Dispose();
return false;
}

downloadHandler.streamAudio = streaming;

request.SendWebRequest();

if (streaming)
{
// Synchronous waiting otherwise the whole architecture has to be redone
while (request.downloadedBytes < 128 * 1024) { }
audioClip = downloadHandler.audioClip;
}
else
{
audioClip = www.GetAudioClip();
DaggerfallUnity.Instance.StartCoroutine(LoadAudioData(www, audioClip));
// Synchronous waiting, otherwise the whole architecture has to be redone
while (!request.isDone) { }
audioClip = downloadHandler.audioClip;
}

return true;
}

// Seek from mods
if (ModManager.Instance != null && ModManager.Instance.TryGetAsset(name, false, out audioClip))
if (ModManager.Instance && ModManager.Instance.TryGetAsset(name, false, out audioClip))
{
if (audioClip.preloadAudioData || audioClip.LoadAudioData())
return true;
Expand All @@ -112,6 +135,7 @@ private static bool TryImportAudioClip(string name, string extension, bool strea
return false;
}


/// <summary>
/// Import midi data from modding locations as a byte array.
/// </summary>
Expand Down Expand Up @@ -143,19 +167,24 @@ private static bool TryGetAudioBytes(string name, out byte[] songBytes)
return false;
}

/// <summary>
/// Load audio data from WWW in background.
/// </summary>
private static IEnumerator LoadAudioData(WWW www, AudioClip clip) // TODO: Replace with UnityWebRequest
private static AudioType GetAudioTypeFromExtension(string extension)
{
yield return www;

if (clip.loadState == AudioDataLoadState.Failed)
Debug.LogErrorFormat("Failed to load audioclip: {0}", www.error);

www.Dispose();
switch (extension.ToLowerInvariant())
{
case ".wav":
return AudioType.WAV;
case ".mp3":
return AudioType.MPEG;
case ".ogg":
return AudioType.OGGVORBIS;
case ".aif":
case ".aiff":
return AudioType.AIFF;
default:
return AudioType.UNKNOWN;
}
}

#endregion
}
}
}