]> granicus.if.org Git - python/commitdiff
Issue #20172: Convert the winsound module to Argument Clinic.
authorZachary Ware <zachary.ware@gmail.com>
Wed, 13 May 2015 06:21:21 +0000 (01:21 -0500)
committerZachary Ware <zachary.ware@gmail.com>
Wed, 13 May 2015 06:21:21 +0000 (01:21 -0500)
PC/clinic/winsound.c.h [new file with mode: 0644]
PC/winsound.c

diff --git a/PC/clinic/winsound.c.h b/PC/clinic/winsound.c.h
new file mode 100644 (file)
index 0000000..065ed62
--- /dev/null
@@ -0,0 +1,103 @@
+/*[clinic input]
+preserve
+[clinic start generated code]*/
+
+PyDoc_STRVAR(winsound_PlaySound__doc__,
+"PlaySound($module, sound, flags, /)\n"
+"--\n"
+"\n"
+"A wrapper around the Windows PlaySound API.\n"
+"\n"
+"  sound\n"
+"    The sound to play; a filename, data, or None.\n"
+"  flags\n"
+"    Flag values, ored together.  See module documentation.");
+
+#define WINSOUND_PLAYSOUND_METHODDEF    \
+    {"PlaySound", (PyCFunction)winsound_PlaySound, METH_VARARGS, winsound_PlaySound__doc__},
+
+static PyObject *
+winsound_PlaySound_impl(PyModuleDef *module, Py_UNICODE *sound, int flags);
+
+static PyObject *
+winsound_PlaySound(PyModuleDef *module, PyObject *args)
+{
+    PyObject *return_value = NULL;
+    Py_UNICODE *sound;
+    int flags;
+
+    if (!PyArg_ParseTuple(args,
+        "Zi:PlaySound",
+        &sound, &flags))
+        goto exit;
+    return_value = winsound_PlaySound_impl(module, sound, flags);
+
+exit:
+    return return_value;
+}
+
+PyDoc_STRVAR(winsound_Beep__doc__,
+"Beep($module, frequency, duration, /)\n"
+"--\n"
+"\n"
+"A wrapper around the Windows Beep API.\n"
+"\n"
+"  frequency\n"
+"    Frequency of the sound in hertz.\n"
+"    Must be in the range 37 through 32,767.\n"
+"  duration\n"
+"    How long the sound should play, in milliseconds.");
+
+#define WINSOUND_BEEP_METHODDEF    \
+    {"Beep", (PyCFunction)winsound_Beep, METH_VARARGS, winsound_Beep__doc__},
+
+static PyObject *
+winsound_Beep_impl(PyModuleDef *module, int frequency, int duration);
+
+static PyObject *
+winsound_Beep(PyModuleDef *module, PyObject *args)
+{
+    PyObject *return_value = NULL;
+    int frequency;
+    int duration;
+
+    if (!PyArg_ParseTuple(args,
+        "ii:Beep",
+        &frequency, &duration))
+        goto exit;
+    return_value = winsound_Beep_impl(module, frequency, duration);
+
+exit:
+    return return_value;
+}
+
+PyDoc_STRVAR(winsound_MessageBeep__doc__,
+"MessageBeep($module, x=MB_OK, /)\n"
+"--\n"
+"\n"
+"Call Windows MessageBeep(x).\n"
+"\n"
+"x defaults to MB_OK.");
+
+#define WINSOUND_MESSAGEBEEP_METHODDEF    \
+    {"MessageBeep", (PyCFunction)winsound_MessageBeep, METH_VARARGS, winsound_MessageBeep__doc__},
+
+static PyObject *
+winsound_MessageBeep_impl(PyModuleDef *module, int x);
+
+static PyObject *
+winsound_MessageBeep(PyModuleDef *module, PyObject *args)
+{
+    PyObject *return_value = NULL;
+    int x = MB_OK;
+
+    if (!PyArg_ParseTuple(args,
+        "|i:MessageBeep",
+        &x))
+        goto exit;
+    return_value = winsound_MessageBeep_impl(module, x);
+
+exit:
+    return return_value;
+}
+/*[clinic end generated code: output=89c85ed36c3af2fd input=a9049054013a1b77]*/
index b564eaba780cd6b840a69fe47e063e8ef3778334..a659861ed31962b957ff2f6d75b28f332bfcb287 100644 (file)
 #include <windows.h>
 #include <mmsystem.h>
 
-PyDoc_STRVAR(sound_playsound_doc,
-"PlaySound(sound, flags) - a wrapper around the Windows PlaySound API\n"
-"\n"
-"The sound argument can be a filename, data, or None.\n"
-"For flag values, ored together, see module documentation.");
-
-PyDoc_STRVAR(sound_beep_doc,
-"Beep(frequency, duration) - a wrapper around the Windows Beep API\n"
-"\n"
-"The frequency argument specifies frequency, in hertz, of the sound.\n"
-"This parameter must be in the range 37 through 32,767.\n"
-"The duration argument specifies the number of milliseconds.\n");
-
-PyDoc_STRVAR(sound_msgbeep_doc,
-"MessageBeep(x) - call Windows MessageBeep(x). x defaults to MB_OK.");
-
 PyDoc_STRVAR(sound_module_doc,
 "PlaySound(sound, flags) - play a sound\n"
 "SND_FILENAME - sound is a wav file name\n"
@@ -67,79 +51,112 @@ PyDoc_STRVAR(sound_module_doc,
 "SND_NOSTOP - Do not interrupt any sounds currently playing\n"  // Raising RuntimeError if needed
 "SND_NOWAIT - Return immediately if the sound driver is busy\n" // Without any errors
 "\n"
-"Beep(frequency, duration) - Make a beep through the PC speaker.");
+"Beep(frequency, duration) - Make a beep through the PC speaker.\n"
+"MessageBeep(x) - Call Windows MessageBeep.");
+
+/*[clinic input]
+module winsound
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a18401142d97b8d5]*/
+
+#include "clinic/winsound.c.h"
+
+/*[clinic input]
+winsound.PlaySound
+
+    sound: Py_UNICODE(nullable=True)
+        The sound to play; a filename, data, or None.
+    flags: int
+        Flag values, ored together.  See module documentation.
+    /
+
+A wrapper around the Windows PlaySound API.
+[clinic start generated code]*/
 
 static PyObject *
-sound_playsound(PyObject *s, PyObject *args)
+winsound_PlaySound_impl(PyModuleDef *module, Py_UNICODE *sound, int flags)
+/*[clinic end generated code: output=614273784bf59e5c input=c86fab5d8e86f31d]*/
 {
-    wchar_t *wsound;
-    int flags;
     int ok;
 
-    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;
+    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;
     }
-    return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    ok = PlaySoundW(sound, NULL, flags);
+    Py_END_ALLOW_THREADS
+    if (!ok) {
+        PyErr_SetString(PyExc_RuntimeError, "Failed to play sound");
+        return NULL;
+    }
+    Py_RETURN_NONE;
 }
 
+/*[clinic input]
+winsound.Beep
+
+    frequency: int
+        Frequency of the sound in hertz.
+        Must be in the range 37 through 32,767.
+    duration: int
+        How long the sound should play, in milliseconds.
+    /
+
+A wrapper around the Windows Beep API.
+[clinic start generated code]*/
+
 static PyObject *
-sound_beep(PyObject *self, PyObject *args)
+winsound_Beep_impl(PyModuleDef *module, int frequency, int duration)
+/*[clinic end generated code: output=c75f282035a872bd input=628a99d2ddf73798]*/
 {
-    int freq;
-    int dur;
     BOOL ok;
 
-    if (!PyArg_ParseTuple(args, "ii:Beep", &freq,  &dur))
-        return NULL;
-
-    if (freq < 37 || freq > 32767) {
+    if (frequency < 37 || frequency > 32767) {
         PyErr_SetString(PyExc_ValueError,
                         "frequency must be in 37 thru 32767");
         return NULL;
     }
 
     Py_BEGIN_ALLOW_THREADS
-    ok = Beep(freq, dur);
+    ok = Beep(frequency, duration);
     Py_END_ALLOW_THREADS
     if (!ok) {
         PyErr_SetString(PyExc_RuntimeError,"Failed to beep");
         return NULL;
     }
 
-    Py_INCREF(Py_None);
-    return Py_None;
+    Py_RETURN_NONE;
 }
 
+/*[clinic input]
+winsound.MessageBeep
+
+    x: int(c_default="MB_OK") = MB_OK
+    /
+
+Call Windows MessageBeep(x).
+
+x defaults to MB_OK.
+[clinic start generated code]*/
+
 static PyObject *
-sound_msgbeep(PyObject *self, PyObject *args)
+winsound_MessageBeep_impl(PyModuleDef *module, int x)
+/*[clinic end generated code: output=92aa6a822bdc66ad input=a776c8a85c9853f6]*/
 {
-    int x = MB_OK;
-    if (!PyArg_ParseTuple(args, "|i:MessageBeep", &x))
-        return NULL;
     MessageBeep(x);
-    Py_INCREF(Py_None);
-    return Py_None;
+    Py_RETURN_NONE;
 }
 
 static struct PyMethodDef sound_methods[] =
 {
-    {"PlaySound", sound_playsound, METH_VARARGS, sound_playsound_doc},
-    {"Beep",      sound_beep,      METH_VARARGS, sound_beep_doc},
-    {"MessageBeep", sound_msgbeep, METH_VARARGS, sound_msgbeep_doc},
+    WINSOUND_PLAYSOUND_METHODDEF
+    WINSOUND_BEEP_METHODDEF
+    WINSOUND_MESSAGEBEEP_METHODDEF
     {NULL,  NULL}
 };