#6518: enable context manager protocol for ossaudiodev types.

This commit is contained in:
Georg Brandl 2010-10-23 17:31:52 +00:00
parent 1cae8b58eb
commit 1e908af335
4 changed files with 42 additions and 4 deletions

View file

@ -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:
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:

View file

@ -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():

View file

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

View file

@ -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[] = {
/* 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[] = {
{ "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},