transform: Hook up transforms.

This commit is contained in:
Uwe Hermann 2015-02-10 21:24:23 +01:00
parent 988357ca2f
commit c0a1e532f5
3 changed files with 41 additions and 0 deletions

View File

@ -669,6 +669,7 @@ struct sr_session {
GSList *owned_devs;
/** List of struct datafeed_callback pointers. */
GSList *datafeed_callbacks;
GSList *transforms;
struct sr_trigger *trigger;
GTimeVal starttime;
gboolean running;

View File

@ -697,6 +697,9 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi,
{
GSList *l;
struct datafeed_callback *cb_struct;
struct sr_datafeed_packet *packet_in, *packet_out;
struct sr_transform *t;
int ret;
if (!sdi) {
sr_err("%s: sdi was NULL", __func__);
@ -713,6 +716,40 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi,
return SR_ERR_BUG;
}
/*
* Pass the packet to the first transform module. If that returns
* another packet (instead of NULL), pass that packet to the next
* transform module in the list, and so on.
*/
packet_in = (struct sr_datafeed_packet *)packet;
for (l = sdi->session->transforms; l; l = l->next) {
t = l->data;
sr_spew("Running transform module '%s'.", t->module->id);
ret = t->module->receive(t, packet_in, &packet_out);
if (ret < 0) {
sr_err("Error while running transform module: %d.", ret);
return SR_ERR;
}
if (!packet_out) {
/*
* If any of the transforms don't return an output
* packet, abort.
*/
sr_spew("Transform module didn't return a packet, aborting.");
return SR_OK;
} else {
/*
* Use this transform module's output packet as input
* for the next transform module.
*/
packet_in = packet_out;
}
}
/*
* If the last transform did output a packet, pass it to all datafeed
* callbacks.
*/
for (l = sdi->session->datafeed_callbacks; l; l = l->next) {
if (sr_log_loglevel_get() >= SR_LOG_DBG)
datafeed_dump(packet);

View File

@ -247,6 +247,9 @@ SR_API const struct sr_transform *sr_transform_new(const struct sr_transform_mod
if (new_opts)
g_hash_table_destroy(new_opts);
/* Add the transform to the session's list of transforms. */
sdi->session->transforms = g_slist_append(sdi->session->transforms, t);
return t;
}