#6518: enable context manager protocol for ossaudiodev types.
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c
index 5c990ef..2c9d797 100644
--- a/Modules/ossaudiodev.c
+++ b/Modules/ossaudiodev.c
@@ -470,6 +470,23 @@
 }
 
 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)
 {
     return PyLong_FromLong(self->fd);
@@ -782,6 +799,10 @@
     /* 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 @@
     { "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},