Commit 1e908af3 authored by Georg Brandl's avatar Georg Brandl

#6518: enable context manager protocol for ossaudiodev types.

parent 1cae8b58
...@@ -159,6 +159,11 @@ and (read-only) attributes: ...@@ -159,6 +159,11 @@ and (read-only) attributes:
is only useful in non-blocking mode. Has no return value, since the amount of is only useful in non-blocking mode. Has no return value, since the amount of
data written is always equal to the amount of data supplied. data written is always equal to the amount of data supplied.
.. versionchanged:: 3.2
Audio device objects also support the context manager protocol, i.e. they can
be used in a :keyword:`with` statement.
The following methods each map to exactly one :func:`ioctl` system call. The The following methods each map to exactly one :func:`ioctl` system call. The
correspondence is obvious: for example, :meth:`setfmt` corresponds to the correspondence is obvious: for example, :meth:`setfmt` corresponds to the
``SNDCTL_DSP_SETFMT`` ioctl, and :meth:`sync` to ``SNDCTL_DSP_SYNC`` (this can ``SNDCTL_DSP_SETFMT`` ioctl, and :meth:`sync` to ``SNDCTL_DSP_SYNC`` (this can
...@@ -346,6 +351,10 @@ The mixer object provides two file-like methods: ...@@ -346,6 +351,10 @@ The mixer object provides two file-like methods:
Returns the file handle number of the open mixer device file. Returns the file handle number of the open mixer device file.
.. versionchanged:: 3.2
Mixer objects also support the context manager protocol.
The remaining methods are specific to audio mixing: The remaining methods are specific to audio mixing:
......
...@@ -162,11 +162,13 @@ class OSSAudioDevTests(unittest.TestCase): ...@@ -162,11 +162,13 @@ class OSSAudioDevTests(unittest.TestCase):
def test_mixer_methods(self): def test_mixer_methods(self):
# Issue #8139: ossaudiodev didn't initialize its types properly, # Issue #8139: ossaudiodev didn't initialize its types properly,
# therefore some methods were unavailable. # therefore some methods were unavailable.
mixer = ossaudiodev.openmixer() with ossaudiodev.openmixer() as mixer:
try:
self.assertGreaterEqual(mixer.fileno(), 0) self.assertGreaterEqual(mixer.fileno(), 0)
finally:
mixer.close() def test_with(self):
with ossaudiodev.open('w') as dsp:
pass
self.assertTrue(dsp.closed)
def test_main(): def test_main():
......
...@@ -126,6 +126,8 @@ Library ...@@ -126,6 +126,8 @@ Library
Extensions Extensions
---------- ----------
- Issue #6518: Support context manager protcol for ossaudiodev types.
- Issue #678250: Make mmap flush a noop on ACCESS_READ and ACCESS_COPY. - Issue #678250: Make mmap flush a noop on ACCESS_READ and ACCESS_COPY.
- Issue #9054: Fix a crash occurring when using the pyexpat module - Issue #9054: Fix a crash occurring when using the pyexpat module
......
...@@ -469,6 +469,23 @@ oss_close(oss_audio_t *self, PyObject *unused) ...@@ -469,6 +469,23 @@ oss_close(oss_audio_t *self, PyObject *unused)
return Py_None; return Py_None;
} }
static PyObject *
oss_self(PyObject *self)
{
Py_INCREF(self);
return self;
}
static PyObject *
oss_exit(PyObject *self, PyObject *unused)
{
PyObject *ret = PyObject_CallMethod(self, "close", NULL);
if (!ret)
return NULL;
Py_DECREF(ret);
Py_RETURN_NONE;
}
static PyObject * static PyObject *
oss_fileno(oss_audio_t *self, PyObject *unused) oss_fileno(oss_audio_t *self, PyObject *unused)
{ {
...@@ -782,6 +799,10 @@ static PyMethodDef oss_methods[] = { ...@@ -782,6 +799,10 @@ static PyMethodDef oss_methods[] = {
/* Aliases for backwards compatibility */ /* Aliases for backwards compatibility */
{ "flush", (PyCFunction)oss_sync, METH_VARARGS }, { "flush", (PyCFunction)oss_sync, METH_VARARGS },
/* Support for the context manager protocol */
{ "__enter__", oss_self, METH_NOARGS },
{ "__exit__", oss_exit, METH_VARARGS },
{ NULL, NULL} /* sentinel */ { NULL, NULL} /* sentinel */
}; };
...@@ -790,6 +811,10 @@ static PyMethodDef oss_mixer_methods[] = { ...@@ -790,6 +811,10 @@ static PyMethodDef oss_mixer_methods[] = {
{ "close", (PyCFunction)oss_mixer_close, METH_NOARGS }, { "close", (PyCFunction)oss_mixer_close, METH_NOARGS },
{ "fileno", (PyCFunction)oss_mixer_fileno, METH_NOARGS }, { "fileno", (PyCFunction)oss_mixer_fileno, METH_NOARGS },
/* Support for the context manager protocol */
{ "__enter__", oss_self, METH_NOARGS },
{ "__exit__", oss_exit, METH_VARARGS },
/* Simple ioctl wrappers */ /* Simple ioctl wrappers */
{ "controls", (PyCFunction)oss_mixer_controls, METH_VARARGS }, { "controls", (PyCFunction)oss_mixer_controls, METH_VARARGS },
{ "stereocontrols", (PyCFunction)oss_mixer_stereocontrols, METH_VARARGS}, { "stereocontrols", (PyCFunction)oss_mixer_stereocontrols, METH_VARARGS},
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment