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

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



I realised today that the docs say:

"Music can only be loaded from filenames, not python file objects like
the other pygame loading functions."

So here's a patch to correct the docs.

On Tue, Jul 22, 2008 at 7:38 AM, René Dudfield <renesd@xxxxxxxxx> wrote:
> cool, thanks!
>
> Committed revision 1524.
>
> cu,
>
> On Mon, Jul 21, 2008 at 12:26 PM, Forrest Voight <voights@xxxxxxxxx> wrote:
>> 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()
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>
Index: src/music.doc
===================================================================
--- src/music.doc	(revision 1673)
+++ src/music.doc	(working copy)
@@ -14,12 +14,11 @@
 load
 Load a music file for playback
 pygame.mixer.music.load(filename): return None
+pygame.mixer.music.load(object): return None
 
-This will load a music file and prepare it for playback. If a music stream
-is already playing it will be stopped. This does not start the music playing.
-
-Music can only be loaded from filenames, not python file objects like the
-other pygame loading functions.
+This will load a music filename/file object and prepare it for playback. If a
+music stream is already playing it will be stopped. This does not start the music
+playing.
 <END>