[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

AltStyle によって変換されたページ (->オリジナル) /