0 votes

Hi,

I have a bunch of sound files in res://sfx/ and in my code I use Directory to get a list of the files, basically:

var ext = ".ogg"
dir.open(path)
dir.list_dir_begin()
while true:
    var file = dir.get_next()
    if file.ends_with(ext):
        files.append(file)
return files 

The I use sfx = load(audio_file)

It works when running from the editor but when the game is packaged up in a PCK file, the directory no longer contains OGG or WAV files. It still has ogg.import and wave.import files. Not sure what's going on.

Any suggestions appreciated!

in Engine by (204 points)
edited by

Under Project > Export > Resources try adding *.ogg, *.wav to the first text box, should be labelled "Filters to export non-resource files".

Ah, thank you very much!

I guess my other question would be: Am I handling sound files the right way? If they're being imported into the engine as a resource, is there some way I should be calling them other than loading the ogg or wav file direct?

1 Answer

0 votes

This also happened to me when exporting to iOS and cost me several hours of frustrating debugging. For anyone struggling with "missing" files in a folder or directory when exporting to a PCK file on iOS, here's how I solved the problem.

TL;DR: look for the *.ext.import extension and then remove the extension to load the imported *.ext file.

const SOUND_DIR = 'res://sound' 
var samples = {}

var dir = Directory.new()
var err = dir.open(SOUND_DIR)
if err == OK:
    dir.list_dir_begin()
    var filename = dir.get_next()
    while filename != '':
        if filename.ends_with('.wav.import'):
            filename = filename.left(len(filename) - len('.import'))
            var asp = AudioStreamPlayer.new()
            asp.set_stream(load(SOUND_DIR + '/' + filename))
            add_child(asp)
            var arr = filename.split('/')
            var name = arr[arr.size()-1].split('.')[0]
            samples[name] = asp
        filename = dir.get_next()

Note that the SOUND_DIR does *not* have a trailing slash. Godot is forgiving of that when running in the editor but the iOS builds are not.

So here's what's happening as background: When you add a file to the res folder it imports it into the .import directory, creates a filename.import file to point to it, and leaves the original file. So if you add mysound.wav to the sound folder and import it you'll get something like:

sound/mysound.wav
sound/mysound.wav.import
.import/mysound.wav-1234567890abcdef1234567890abcdef.md5    
.import/mysound.wav-1234567890abcdef1234567890abcdef.sample

The imported sample and .import pointer file are exported to your PCK file. The original .wav file is not. However, calling load('res:://sound/mysound.wav') will find the .import file and load the imported sample just fine. Overall this makes sense but you can confuse yourself by looking only for .wav extensions in the directory when looking at the original unexported directory.

If you try to export the original .wav or .ogg files as well it might work but you will end up with duplicate files in the build, which is probably not what you want.

Anyway, I hope this saves someone some debugging time in the future.

by (24 points)
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to webmaster@godotengine.org with your username.