Index: src/music.c
===================================================================
--- src/music.c	(revision 1315)
+++ src/music.c	(working copy)
@@ -89,6 +89,7 @@
     if (!current_music)
         return RAISE (PyExc_SDLError, "music not loaded");
 
+    Py_BEGIN_ALLOW_THREADS
     Mix_HookMusicFinished (endmusic_callback);
     Mix_SetPostMix (mixmusic_callback, NULL);
     Mix_QuerySpec (&music_frequency, &music_format, &music_channels);
@@ -100,11 +101,14 @@
     val = Mix_FadeInMusicPos (current_music, loops, 0, startpos);
     Mix_VolumeMusic (volume);
 #else
-    if (startpos)
+    if (startpos) {
+        Py_END_ALLOW_THREADS
         return RAISE (PyExc_NotImplementedError,
                       "music start position requires SDL_mixer-1.2.4");
+    }
     val = Mix_PlayMusic (current_music, loops);
 #endif
+    Py_END_ALLOW_THREADS
     if (val == -1)
         return RAISE (PyExc_SDLError, SDL_GetError ());
 
@@ -240,46 +244,79 @@
 static PyObject*
 music_load (PyObject* self, PyObject* args)
 {
-    char* filename;
-    if (!PyArg_ParseTuple (args, "s", &filename))
+    char* name = NULL;
+    PyObject* file;
+    Mix_Music* new_music;
+    SDL_RWops *rw;
+    if(!PyArg_ParseTuple(args, "O", &file))
         return NULL;
 
     MIXER_INIT_CHECK ();
 
+    if(PyString_Check(file) || PyUnicode_Check(file))
+    {
+        if(!PyArg_ParseTuple(args, "s", &name))
+            return NULL;
+        Py_BEGIN_ALLOW_THREADS
+        new_music = Mix_LoadMUS(name);
+        Py_END_ALLOW_THREADS
+    }
+    else
+    {
+        rw = RWopsFromPythonThreaded(file);
+        if(!rw)
+            return NULL;
+        Py_BEGIN_ALLOW_THREADS
+        new_music = Mix_LoadMUS_RW(rw);
+        Py_END_ALLOW_THREADS
+    }
+
+    if (!new_music)
+        return RAISE (PyExc_SDLError, SDL_GetError ());
+
     if (current_music)
     {
         Mix_FreeMusic (current_music);
         current_music = NULL;
     }
-    Py_BEGIN_ALLOW_THREADS;
-    current_music = Mix_LoadMUS (filename);
-    Py_END_ALLOW_THREADS;
-
-    if (!current_music)
-        return RAISE (PyExc_SDLError, SDL_GetError ());
-
     if (queue_music)
     {
         Mix_FreeMusic (queue_music);
         queue_music = NULL;
     }
-
+    current_music = new_music;
     Py_RETURN_NONE;
 }
 
 static PyObject*
 music_queue (PyObject* self, PyObject* args)
 {
-    char* filename;
+    char* name = NULL;
+    PyObject* file;
     Mix_Music* new_music;
-    if (!PyArg_ParseTuple (args, "s", &filename))
+    SDL_RWops *rw;
+    if (!PyArg_ParseTuple (args, "O", &file))
         return NULL;
 
     MIXER_INIT_CHECK ();
 
-    Py_BEGIN_ALLOW_THREADS;
-    new_music = Mix_LoadMUS (filename);
-    Py_END_ALLOW_THREADS;
+    if(PyString_Check(file) || PyUnicode_Check(file))
+    {
+        if(!PyArg_ParseTuple(args, "s", &name))
+            return NULL;
+        Py_BEGIN_ALLOW_THREADS
+        new_music = Mix_LoadMUS(name);
+        Py_END_ALLOW_THREADS
+    }
+    else
+    {
+        rw = RWopsFromPythonThreaded(file);
+        if(!rw)
+            return NULL;
+        Py_BEGIN_ALLOW_THREADS
+        new_music = Mix_LoadMUS_RW(rw);
+        Py_END_ALLOW_THREADS
+    }
 
     if (!new_music)
         return RAISE (PyExc_SDLError, SDL_GetError ());
@@ -340,4 +377,5 @@
 
     /*imported needed apis*/
     import_pygame_base ();
+    import_pygame_rwobject ();
 }
