[Python-checkins] r86291 - in python/branches/release31-maint: Misc/NEWS PC/winsound.c

hirokazu.yamamoto python-checkins at python.org
Sun Nov 7 12:53:58 CET 2010


Author: hirokazu.yamamoto
Date: Sun Nov  7 12:53:57 2010
New Revision: 86291

Log:
Merged revisions 86283 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r86283 | hirokazu.yamamoto | 2010-11-07 18:23:15 +0900 | 1 line
  
  Issue #6317: Now winsound.PlaySound can accept non ascii filename.
........


Modified:
   python/branches/release31-maint/   (props changed)
   python/branches/release31-maint/Misc/NEWS
   python/branches/release31-maint/PC/winsound.c

Modified: python/branches/release31-maint/Misc/NEWS
==============================================================================
--- python/branches/release31-maint/Misc/NEWS	(original)
+++ python/branches/release31-maint/Misc/NEWS	Sun Nov  7 12:53:57 2010
@@ -616,6 +616,8 @@
 Extension Modules
 -----------------
 
+- Issue #6317: Now winsound.PlaySound can accept non ascii filename.
+
 - Issue #9054: Fix a crash occurring when using the pyexpat module
   with expat version 2.0.1.
 

Modified: python/branches/release31-maint/PC/winsound.c
==============================================================================
--- python/branches/release31-maint/PC/winsound.c	(original)
+++ python/branches/release31-maint/PC/winsound.c	Sun Nov  7 12:53:57 2010
@@ -72,30 +72,52 @@
 static PyObject *
 sound_playsound(PyObject *s, PyObject *args)
 {
+    Py_UNICODE *wsound;
+    PyObject *osound;
     const char *sound;
     int flags;
-    int length;
     int ok;
 
-    if (!PyArg_ParseTuple(args, "z#i:PlaySound", &sound, &length, &flags)) {
+    if (PyArg_ParseTuple(args, "Zi:PlaySound", &wsound, &flags)) {
+        if (flags & SND_ASYNC && flags & SND_MEMORY) {
+            /* Sidestep reference counting headache; unfortunately this also
+               prevent SND_LOOP from memory. */
+            PyErr_SetString(PyExc_RuntimeError, "Cannot play asynchronously from memory");
+            return NULL;
+        }
+        Py_BEGIN_ALLOW_THREADS
+        ok = PlaySoundW(wsound, NULL, flags);
+        Py_END_ALLOW_THREADS
+        if (!ok) {
+            PyErr_SetString(PyExc_RuntimeError, "Failed to play sound");
+            return NULL;
+        }
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+    /* Drop the argument parsing error as narrow strings
+       are also valid. */
+    PyErr_Clear();
+    if (!PyArg_ParseTuple(args, "O&i:PlaySound",
+                          PyUnicode_FSConverter, &osound, &flags))
         return NULL;
-    }
-
     if (flags & SND_ASYNC && flags & SND_MEMORY) {
         /* Sidestep reference counting headache; unfortunately this also
            prevent SND_LOOP from memory. */
         PyErr_SetString(PyExc_RuntimeError, "Cannot play asynchronously from memory");
+        Py_DECREF(osound);
         return NULL;
     }
-
+    sound = PyBytes_AsString(osound);
     Py_BEGIN_ALLOW_THREADS
-    ok = PlaySound(sound, NULL, flags);
+    ok = PlaySoundA(sound, NULL, flags);
     Py_END_ALLOW_THREADS
     if (!ok) {
         PyErr_SetString(PyExc_RuntimeError, "Failed to play sound");
+        Py_DECREF(osound);
         return NULL;
     }
-
+    Py_DECREF(osound);
     Py_INCREF(Py_None);
     return Py_None;
 }


More information about the Python-checkins mailing list