]> sigrok.org Git - libsigrokdecode.git/blobdiff - instance.c
srd_inst_decode(): Make the code API version dependent.
[libsigrokdecode.git] / instance.c
index 53a8d9258b6560c728b1d0be50aa115af7ea670a..86b826f25f9bb6656965c4522f2c99c29470114e 100644 (file)
@@ -522,7 +522,7 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di)
 }
 
 /**
- * Run the specified decoder function.
+ * Decode a chunk of samples.
  *
  * @param di The decoder instance to call. Must not be NULL.
  * @param start_samplenum The starting sample number for the buffer's sample
@@ -531,13 +531,11 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di)
  *                       set, relative to the start of capture.
  * @param inbuf The buffer to decode. Must not be NULL.
  * @param inbuflen Length of the buffer. Must be > 0.
- * @param unitsize The number of bytes per sample.
+ * @param unitsize The number of bytes per sample. Must be > 0.
  *
  * @return SRD_OK upon success, a (negative) error code otherwise.
  *
  * @private
- *
- * @since 0.4.0
  */
 SRD_PRIV int srd_inst_decode(const struct srd_decoder_inst *di,
                uint64_t start_samplenum, uint64_t end_samplenum,
@@ -545,6 +543,7 @@ SRD_PRIV int srd_inst_decode(const struct srd_decoder_inst *di,
 {
        PyObject *py_res;
        srd_logic *logic;
+       long apiver;
 
        /* Return an error upon unusable input. */
        if (!di) {
@@ -562,34 +561,38 @@ SRD_PRIV int srd_inst_decode(const struct srd_decoder_inst *di,
 
        ((struct srd_decoder_inst *)di)->data_unitsize = unitsize;
 
-       srd_dbg("Calling decode(), start sample %" PRIu64 ", end sample %"
+       srd_dbg("Decoding: start sample %" PRIu64 ", end sample %"
                PRIu64 " (%" PRIu64 " samples, %" PRIu64 " bytes, unitsize = "
                "%d), instance %s.", start_samplenum, end_samplenum,
                end_samplenum - start_samplenum, inbuflen, di->data_unitsize,
                di->inst_id);
 
-       /*
-        * Create new srd_logic object. Each iteration around the PD's loop
-        * will fill one sample into this object.
-        */
-       logic = PyObject_New(srd_logic, (PyTypeObject *)srd_logic_type);
-       Py_INCREF(logic);
-       logic->di = (struct srd_decoder_inst *)di;
-       logic->start_samplenum = start_samplenum;
-       logic->itercnt = 0;
-       logic->inbuf = (uint8_t *)inbuf;
-       logic->inbuflen = inbuflen;
-       logic->sample = PyList_New(2);
-       Py_INCREF(logic->sample);
-
-       Py_IncRef(di->py_inst);
-       if (!(py_res = PyObject_CallMethod(di->py_inst, "decode",
+       apiver = srd_decoder_apiver(di->decoder);
+
+       if (apiver == 2) {
+               /*
+                * Create new srd_logic object. Each iteration around the PD's
+                * loop will fill one sample into this object.
+                */
+               logic = PyObject_New(srd_logic, (PyTypeObject *)srd_logic_type);
+               Py_INCREF(logic);
+               logic->di = (struct srd_decoder_inst *)di;
+               logic->start_samplenum = start_samplenum;
+               logic->itercnt = 0;
+               logic->inbuf = (uint8_t *)inbuf;
+               logic->inbuflen = inbuflen;
+               logic->sample = PyList_New(2);
+               Py_INCREF(logic->sample);
+
+               Py_IncRef(di->py_inst);
+               if (!(py_res = PyObject_CallMethod(di->py_inst, "decode",
                        "KKO", start_samplenum, end_samplenum, logic))) {
-               srd_exception_catch("Protocol decoder instance %s",
-                               di->inst_id);
-               return SRD_ERR_PYTHON;
+                       srd_exception_catch("Protocol decoder instance %s",
+                                       di->inst_id);
+                       return SRD_ERR_PYTHON;
+               }
+               Py_DecRef(py_res);
        }
-       Py_DecRef(py_res);
 
        return SRD_OK;
 }