]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #6317: Now winsound.PlaySound can accept non ascii filename.
authorHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Sun, 7 Nov 2010 09:23:15 +0000 (09:23 +0000)
committerHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Sun, 7 Nov 2010 09:23:15 +0000 (09:23 +0000)
Misc/NEWS
PC/winsound.c

index 16e77ed1d111ce92a5734712ac847761764f1d6c..1731b8acb825306792eee8e70a004c9efc5dbf35 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -251,6 +251,8 @@ Library
 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.
index d61dde702bc3e7148344b81d7385ea70770151b1..0e82814f4d24c14153e01383edfc9d39dec9a234 100644 (file)
@@ -72,30 +72,52 @@ PyDoc_STRVAR(sound_module_doc,
 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)) {
-        return NULL;
+    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;
 }