summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_winsound.py22
-rw-r--r--Misc/NEWS.d/next/Windows/2022-04-12-18-35-20.gh-issue-91061.x40hSK.rst1
-rw-r--r--PC/winsound.c22
3 files changed, 38 insertions, 7 deletions
diff --git a/Lib/test/test_winsound.py b/Lib/test/test_winsound.py
index 3c3359b..a59d0d2 100644
--- a/Lib/test/test_winsound.py
+++ b/Lib/test/test_winsound.py
@@ -1,6 +1,7 @@
# Ridiculously simple test of the winsound module for Windows.
import functools
+import pathlib
import time
import unittest
@@ -84,6 +85,13 @@ class MessageBeepTest(unittest.TestCase):
safe_MessageBeep(type=winsound.MB_OK)
+# A class for testing winsound when the given path resolves
+# to bytes rather than str.
+class BytesPath(pathlib.WindowsPath):
+ def __fspath__(self):
+ return bytes(super().__fspath__(), 'UTF-8')
+
+
class PlaySoundTest(unittest.TestCase):
def test_errors(self):
@@ -116,6 +124,20 @@ class PlaySoundTest(unittest.TestCase):
fn = support.findfile('pluck-pcm8.wav', subdir='audiodata')
safe_PlaySound(fn, winsound.SND_FILENAME | winsound.SND_NODEFAULT)
+ def test_snd_filepath(self):
+ fn = support.findfile('pluck-pcm8.wav', subdir='audiodata')
+ path = pathlib.Path(fn)
+ safe_PlaySound(path, winsound.SND_FILENAME | winsound.SND_NODEFAULT)
+
+ def test_snd_filepath_as_bytes(self):
+ fn = support.findfile('pluck-pcm8.wav', subdir='audiodata')
+ self.assertRaises(
+ TypeError,
+ winsound.PlaySound,
+ BytesPath(fn),
+ winsound.SND_FILENAME | winsound.SND_NODEFAULT
+ )
+
def test_aliases(self):
aliases = [
"SystemAsterisk",
diff --git a/Misc/NEWS.d/next/Windows/2022-04-12-18-35-20.gh-issue-91061.x40hSK.rst b/Misc/NEWS.d/next/Windows/2022-04-12-18-35-20.gh-issue-91061.x40hSK.rst
new file mode 100644
index 0000000..aadc30344
--- /dev/null
+++ b/Misc/NEWS.d/next/Windows/2022-04-12-18-35-20.gh-issue-91061.x40hSK.rst
@@ -0,0 +1 @@
+Accept os.PathLike for the argument to winsound.PlaySound
diff --git a/PC/winsound.c b/PC/winsound.c
index fd04e1e5..65025dd 100644
--- a/PC/winsound.c
+++ b/PC/winsound.c
@@ -94,17 +94,25 @@ winsound_PlaySound_impl(PyObject *module, PyObject *sound, int flags)
return NULL;
}
wsound = (wchar_t *)view.buf;
+ } else if (PyBytes_Check(sound)) {
+ PyErr_Format(PyExc_TypeError,
+ "'sound' must be str, os.PathLike, or None, not '%s'",
+ Py_TYPE(sound)->tp_name);
+ return NULL;
} else {
- if (!PyUnicode_Check(sound)) {
+ PyObject *obj = PyOS_FSPath(sound);
+ // Either <obj> is unicode/bytes/NULL, or a helpful message
+ // has been surfaced to the user about how they gave a non-path.
+ if (obj == NULL) return NULL;
+ if (PyBytes_Check(obj)) {
PyErr_Format(PyExc_TypeError,
- "'sound' must be str or None, not '%s'",
- Py_TYPE(sound)->tp_name);
- return NULL;
- }
- wsound = PyUnicode_AsWideCharString(sound, NULL);
- if (wsound == NULL) {
+ "'sound' must resolve to str, not bytes");
+ Py_DECREF(obj);
return NULL;
}
+ wsound = PyUnicode_AsWideCharString(obj, NULL);
+ Py_DECREF(obj);
+ if (wsound == NULL) return NULL;
}