瀏覽代碼

port registration callback: added optional argument

Fabian Peter Hammerle 9 年之前
父節點
當前提交
85c6fbe843
共有 1 個文件被更改,包括 17 次插入5 次删除
  1. 17 5
      jack.c

+ 17 - 5
jack.c

@@ -6,6 +6,7 @@ typedef struct {
     PyObject_HEAD
     jack_client_t* client;
     PyObject* registration_callback;
+    PyObject* registration_callback_argument;
 } Client;
 
 typedef struct {
@@ -32,7 +33,13 @@ static void jack_registration_callback(jack_port_id_t port_id, int registered, v
         Port* port = PyObject_New(Port, &port_type);
         port->port = jack_port_by_id(client->client, port_id);
 
-        PyObject* callback_argument_list = Py_BuildValue("(O,i)", (PyObject*)port, registered);
+        // 'O' increases reference count
+        PyObject* callback_argument_list;
+        if(client->registration_callback_argument) {
+            callback_argument_list = Py_BuildValue("(O,i,O)", (PyObject*)port, registered, client->registration_callback_argument);
+        } else {
+            callback_argument_list = Py_BuildValue("(O,i)", (PyObject*)port, registered);
+        }
         PyObject* result = PyObject_CallObject(client->registration_callback, callback_argument_list);
         Py_DECREF(callback_argument_list);
         if(!result) {
@@ -119,8 +126,9 @@ static PyObject* client_get_ports(Client* self)
 
 static PyObject* client_set_port_registration_callback(Client* self, PyObject* args)
 {
-    PyObject* callback;
-    if(!PyArg_ParseTuple(args, "O", &callback)) {
+    PyObject* callback = 0;
+    PyObject* callback_argument = 0;
+    if(!PyArg_ParseTuple(args, "O|O", &callback, &callback_argument)) {
         return NULL;
     }
     if(!PyCallable_Check(callback)) {
@@ -132,6 +140,10 @@ static PyObject* client_set_port_registration_callback(Client* self, PyObject* a
     Py_XDECREF(self->registration_callback);
     self->registration_callback = callback;
 
+    Py_XINCREF(callback_argument);
+    Py_XDECREF(self->registration_callback_argument);
+    self->registration_callback_argument = callback_argument;
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -313,12 +325,12 @@ PyMODINIT_FUNC initjack()
     }
     Py_INCREF(&client_type);
     PyModule_AddObject(module, "Client", (PyObject*)&client_type);
-    
+
     port_type.tp_name = "jack.Port";
     port_type.tp_basicsize = sizeof(Port);
     port_type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
     // Forbid direct instantiation.
-    port_type.tp_new = NULL; 
+    port_type.tp_new = NULL;
     port_type.tp_repr = (reprfunc)port___repr__;
     port_type.tp_methods = port_methods;
     if(PyType_Ready(&port_type) < 0) {