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

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



Fixed both Brian and I's deadlocking problem.

Biran's program works all the way up to the last music (house_lo.mp3)
which has an odd header (SDL_mixer's fault, patch send in.)

The ogg get_busy() problem is SDL_mixer's fault.
pygame.mixer.music.get_busy() directly calls SDL_mixer.

On Sun, Jul 20, 2008 at 9:55 PM, Forrest Voight <voights@xxxxxxxxx> wrote:
> 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()
>>>
>>>
>>>
>>
>

Attachment: music_fixed_reload.diff
Description: Binary data