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

Re: [pygame] Patch - Re-add music support for file-like objects



For the deadlock on reloading a sound, I'm working on it, I earlier
discovered the problem (threaded rwops deadlocks on exception in
file-like due to bug).

For the mp3 not loading, it is another magic problem. It is not an ID3
tag but some other weird header not caught.

The MID file doesn't play when loading it normally, right? I'm not
sure what the problem is here, but it works for me and Lenard.

Lenard, I'll look into the ogg problem.

On Sun, Jul 20, 2008 at 7:50 PM, René Dudfield <renesd@xxxxxxxxx> wrote:
> hi,
>
> nice testing :)
>
> I think this will have to be ifdef'd out for 1.8.1, unless someone can
> fix it in the next couple of days.
>
> cu,
>
>
> On Mon, Jul 21, 2008 at 4:26 AM, Brian Fisher <brian@xxxxxxxxxxxxxxxxxxx> wrote:
>> I got some time to play with this more, testing both on my Vista machine and
>> OS X 10.5.
>>
>> with SDL_Mixer 1.2.8, ogg and mp3 and mid and mod all seem to be able to
>> load from a file or file-like object on my windows machine, so I think
>> Forrest is right about the level of support in SDL_Mixer 1.2.8
>>
>> ...but there were a few of issues...
>>
>> 1. if I try to call mixer.music.load again after having tried to play a song
>> from a file or file-like object, it hangs on the loading
>> 2. the pygame examples/data/house_lo.mp3 plays silence when I try to play it
>> from a filename, but loading from a file or file-like object I get an
>> exception of unrecognized file type (which must be the ID3 tag thing Forrest
>> called out earlier?)
>> 3. the mid file claims to load but plays nothing, regardless of how I load
>> it
>>
>> 2 and 3 may be issues with the file, and are not likely to be problem's with
>> loading from rw_objects at all, but issue 1 (hanging on trying to load a
>> different piece of music after loading from a file-like object) seems like a
>> serious problem that is the responsibility of the loading from rwobject code
>> to fix.
>>
>> I have no idea what the cause of it is - from the prints for a file-like
>> object loader, it seems to do the exact same sequence of seek, tell and read
>> as when it doesn't hang, except that the load call simply doesn't return. I
>> had to rebuild pygame with the mixer version check changed of course, but It
>> happens for both my Leopard and Vista machines, so I don't think it's
>> anything about my builds in particular.
>>
>> here's the code I was running (with Forrest's sound files and the files from
>> pygame)
>> -------------------------
>> import pygame
>> import time
>>
>> pygame.init()
>> pygame.display.set_mode((320,200))
>> pygame.event.pump()
>> files = ["sound.ogg", "sound.mp3", "sound.mod", "sound.mid", "house_lo.ogg",
>> "house_lo.mp3"]
>>
>> class file_like_wrapper():
>>     def __init__(self, fname):
>>         self.my_fname = fname
>>         self.my_file = file(fname, "rb")
>>
>>     def read(self, size=None):
>>         print self.my_fname,"read", size
>>         if size != None:
>>             return self.my_file.read(size)
>>         else:
>>             return self.my_file.read()
>>
>>     def seek(self, offset, whence):
>>         print self.my_fname,"seek",offset, whence
>>         return self.my_file.seek(offset, whence)
>>
>>     def tell(self):
>>         tell_pos = self.my_file.tell()
>>         print self.my_fname,"tell", tell_pos
>>         return tell_pos
>>
>>     def close(self):
>>         print self.my_fname,"close"
>>         return self.my_file.close()
>>
>> for filename in files:
>>     print "loading",filename,"..."
>>
>>     print "from filename",
>>     sound = pygame.mixer.music.load(filename)
>>     print "loaded!"
>>     pygame.mixer.music.play()
>>     print "playing!"
>>     time.sleep(3)
>>     pygame.event.pump()
>>     pygame.mixer.music.stop()
>>
>>     print "loading from file-like object",
>>     sound = pygame.mixer.music.load(file_like_wrapper(filename))
>>     print "loaded!"
>>     pygame.mixer.music.play()
>>     print "playing!"
>>     time.sleep(3)
>>     pygame.event.pump()
>>     print "done playing!"
>>     pygame.mixer.music.stop()
>>
>>     print "loading from file object",
>>     sound = pygame.mixer.music.load(file(filename, "rb"))
>>     print "loaded!"
>>     pygame.mixer.music.play()
>>     print "playing!"
>>     time.sleep(3)
>>     pygame.event.pump()
>>     print "done playing!"
>>     pygame.mixer.music.stop()
>>
>>
>>
>