- Home /
DownloadHandlerAudioClip doesn't return null, but does give an empty file?
Hi! I'm trying to create an in-game radio where the player can put their own audio files into a folder (set by Application.dataPath). I've followed the documentation, and up to the point that it runs DownloadHandlerAudioClip.GetContent(), it works (files are located, their filepaths are valid, and no errors are thrown).
However, the clip returned appears empty in the inspector, and plays no sound when AudioSource.Play() is called.
Here's the code that I'm working with:
public void ScanSongs () {
string path = Application.dataPath + "/Songs";
if (!Directory.Exists(path)) {
Debug.Log("Creating songs folder.");
Directory.CreateDirectory(path);
}
// Find all of the .wav and .ogg files to be loaded.
string[] wavs = Directory.GetFiles(path, "*.wav");
string[] oggs = Directory.GetFiles(path, "*.ogg");
// Run through each array, adjusting the backwards slash, and running GetClip() on them.
for (int i = 0; i < wavs.Length; ++i) {
wavs[i] = wavs[i].Replace('\\', '/');
StartCoroutine(GetClip("file:///" + wavs[i], AudioType.WAV));
}
for (int i = 0; i < oggs.Length; ++i) {
oggs[i] = oggs[i].Replace('\\', '/');
StartCoroutine(GetClip("file:///" + oggs[i], AudioType.OGGVORBIS));
}
}
IEnumerator GetClip (string path, AudioType audioType) {
using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(path, audioType)) {
yield return www.SendWebRequest();
if (www.isNetworkError) {
Debug.Log(www.error);
} else {
current = DownloadHandlerAudioClip.GetContent(www);
// Add loaded song to list of audio clips.
songs.Add(current);
Debug.Log(current == null);
}
}
}
And here's what the empty file looks like in the inspector (both testing a .wav and a .ogg):
I wasn't able to find any other cases of this online, but if I missed something, please let me know.
Thanks!
Answer by nutntubear · May 09, 2020 at 05:41 AM
After a bit of tinkering and a lot of documentation reading, I figured it out.
It doesn't seem like there's a big difference here, but this is what the GetClip function looks like now, using the example from this page:
public List<AudioClip> songs = new List<AudioClip>();
AudioClip current;
IEnumerator GetClip (string path, AudioType audioType) {
UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(path, audioType);
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError) {
Debug.Log(www.error);
} else {
current = ((DownloadHandlerAudioClip)www.downloadHandler).audioClip;
// Add loaded song to list of audio clips.
songs.Add(current);
}
}
Your answer
Follow this Question
Related Questions
About Array to AudioClip 0 Answers
Movement speed based on audio input 1 Answer
Change audio clip through code 1 Answer
Microphone start freezes app 0 Answers
How to stop Audio Track in Timeline? 1 Answer