#6518: enable context manager protocol for ossaudiodev types.
This commit is contained in:
parent
1cae8b58eb
commit
1e908af335
|
@ -159,6 +159,11 @@ and (read-only) attributes:
|
|||
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.
|
||||
|
||||
.. 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
|
||||
correspondence is obvious: for example, :meth:`setfmt` corresponds to the
|
||||
``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.
|
||||
|
||||
.. versionchanged:: 3.2
|
||||
Mixer objects also support the context manager protocol.
|
||||
|
||||
|
||||
The remaining methods are specific to audio mixing:
|
||||
|
||||
|
||||
|
|
|
@ -162,11 +162,13 @@ class OSSAudioDevTests(unittest.TestCase):
|
|||
def test_mixer_methods(self):
|
||||
# Issue #8139: ossaudiodev didn't initialize its types properly,
|
||||
# therefore some methods were unavailable.
|
||||
mixer = ossaudiodev.openmixer()
|
||||
try:
|
||||
with ossaudiodev.openmixer() as mixer:
|
||||
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():
|
||||
|
|
|
@ -126,6 +126,8 @@ Library
|
|||
Extensions
|
||||
----------
|
||||
|
||||
- Issue #6518: Support context manager protcol for ossaudiodev types.
|
||||
|
||||
- Issue #678250: Make mmap flush a noop on ACCESS_READ and ACCESS_COPY.
|
||||
|
||||
- Issue #9054: Fix a crash occurring when using the pyexpat module
|
||||
|
|
|
@ -469,6 +469,23 @@ oss_close(oss_audio_t *self, PyObject *unused)
|
|||
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 *
|
||||
oss_fileno(oss_audio_t *self, PyObject *unused)
|
||||
{
|
||||
|
@ -782,6 +799,10 @@ static PyMethodDef oss_methods[] = {
|
|||
/* Aliases for backwards compatibility */
|
||||
{ "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 */
|
||||
};
|
||||
|
||||
|
@ -790,6 +811,10 @@ static PyMethodDef oss_mixer_methods[] = {
|
|||
{ "close", (PyCFunction)oss_mixer_close, 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 */
|
||||
{ "controls", (PyCFunction)oss_mixer_controls, METH_VARARGS },
|
||||
{ "stereocontrols", (PyCFunction)oss_mixer_stereocontrols, METH_VARARGS},
|
||||
|
|
Loading…
Reference in New Issue