1
0
mirror of https://github.com/python/cpython synced 2024-07-05 18:03:35 +00:00

gh-91061: also accept pathlib.Path for winsound.PlaySound (#91489)

Fixes #91061

Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
Mori Bellamy 2022-05-22 18:54:24 -07:00 committed by GitHub
parent e39cd76561
commit 9bc616cb4c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 7 deletions

View File

@ -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",

View File

@ -0,0 +1 @@
Accept os.PathLike for the argument to winsound.PlaySound

View File

@ -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;
}