[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Re: Some way to pickle or otherwise save a pygame.mixer.Sound object?



I think the answer that sticks out to me is that if these are musical horn sounds, you might consider using pygame.mixer.music, which will stream the sounds as needed. However, this won't work if you have other music playing or if you want multiple horns to be able to play at the same time.

A second solution is to load the sounds in the background of the game, especially if you're going to launch on a menu where the sounds won't be needed. You can pre-populate a dictionary with dummy sounds and use a thread to go through and load each sound into the dictionary while the user interacts with the menu.

SOUND_PATH_MAPPING = {'horn_funny': 'horn_funny.ogg', 'horn_sad': 'extra_sounds/horn_sad.wav'}
SOUNDS = {name: None for name in SOUND_PATH_MAPPING}
def load_sounds():
    for name, path in SOUND_PATH_MAPPING:
        SOUNDS[name] = pygame.mixer.Sound(path)

def load_sounds_background():
    thread.start_new_thread(load_sounds, ())

If there's a legitimate chance that the player might try to use the horn sounds before they've finished loading, just have the horn logic check for Nones before trying to play or have a dummy sound object with a play method that does nothing.

A full example of how you might do this with a class: https://gist.github.com/pydsigner/231c0812f9f91050dd83c744d6d5dc4b

On Thu, Jun 7, 2018 at 12:31 AM, Alec Bennett <wrybread@xxxxxxxxx> wrote:
Sorry, I left out the line where I try to save the file:

> pickle.dump( sound_obj, open( "sound.pickled", "wb" ) )



On Wed, Jun 6, 2018 at 10:29 PM, Alec Bennett <wrybread@xxxxxxxxx> wrote:
I'm building a musical horn for my car with PyGame, and it works perfectly, but since it needs to load each of the 20 sounds on startup it takes about 30 seconds to load. I'm running it on a Raspberry Pi, which doesn't help of course.

I thought I'd simply save the Sound objects as pickle objects, but that produces an error:

> sound_obj = pygame.mixer.Sound("whatever.wav")

> can't pickle Sound objects

I also tried the dill module (https://github.com/uqfoundation/dill) but with similar results:

> sound_obj = pygame.mixer.Sound("whatever.wav")

> Can't pickle <type 'Sound'>: it's not found as __builtin__.Sound

I don't imagine can think of some clever way to save the preloaded Sounds, or otherwise speed up the load times?