[Python-checkins] r86283 - in python/branches/py3k: Misc/NEWS PC/winsound.c

hirokazu.yamamoto python-checkins at python.org
Sun Nov 7 10:23:15 CET 2010


Author: hirokazu.yamamoto
Date: Sun Nov  7 10:23:15 2010
New Revision: 86283

Log:
Issue #6317: Now winsound.PlaySound can accept non ascii filename.

Modified:
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/PC/winsound.c

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Sun Nov  7 10:23:15 2010
@@ -251,6 +251,8 @@
 Extensions
 ----------
 
+- Issue #6317: Now winsound.PlaySound can accept non ascii filename.
+
 - Issue #9377: Use Unicode API for gethostname on Windows.
 
 - Issue #10143: Update "os.pathconf" values.

Modified: python/branches/py3k/PC/winsound.c
==============================================================================
--- python/branches/py3k/PC/winsound.c	(original)
+++ python/branches/py3k/PC/winsound.c	Sun Nov  7 10:23:15 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