Index: Lib/test/test_ossaudiodev.py =================================================================== --- Lib/test/test_ossaudiodev.py (revision 74539) +++ Lib/test/test_ossaudiodev.py (working copy) @@ -67,6 +67,8 @@ setattr(dsp, attr, 42) except TypeError: pass + except AttributeError: + pass else: self.fail("dsp.%s not read-only" % attr) Index: Modules/ossaudiodev.c =================================================================== --- Modules/ossaudiodev.c (revision 74539) +++ Modules/ossaudiodev.c (working copy) @@ -470,6 +470,25 @@ } static PyObject * +oss_self(oss_audio_t *self) +{ + if (self->fd < 0) + return NULL; + Py_INCREF(self); + return (PyObject *)self; +} + +static PyObject * +oss_exit(oss_audio_t *self, PyObject *unused) +{ + PyObject *ret = PyObject_CallMethod((PyObject*)self, "close", NULL); + if (!ret) + return NULL; + Py_DECREF(ret); + Py_RETURN_NONE; +} + +static PyObject * oss_fileno(oss_audio_t *self, PyObject *unused) { return PyInt_FromLong(self->fd); @@ -781,6 +800,8 @@ /* Aliases for backwards compatibility */ { "flush", (PyCFunction)oss_sync, METH_VARARGS }, + { "__enter__", (PyCFunction)oss_self, METH_NOARGS }, + { "__exit__", (PyCFunction)oss_exit, METH_VARARGS }, { NULL, NULL} /* sentinel */ }; @@ -944,6 +965,11 @@ { PyObject *m; + OSSAudioType.tp_methods = oss_methods; + + if (PyType_Ready(&OSSAudioType) < 0) + return; + m = Py_InitModule("ossaudiodev", ossaudiodev_methods); if (m == NULL) return;