+static void init_output(GString **out, struct context *ctx,
+ const struct sr_output *o)
+{
+ if (!ctx->header_done) {
+ *out = gen_header(o);
+ ctx->header_done = TRUE;
+ } else {
+ *out = g_string_sized_new(512);
+ }
+}
+
+static void handle_analog_frame(struct context *ctx,
+ const struct sr_datafeed_analog *analog)
+{
+ unsigned int numch, nums, i, j, s;
+ GSList *l;
+
+ numch = g_slist_length(analog->channels);
+ if ((unsigned int)analog->num_samples > numch)
+ nums = analog->num_samples / numch;
+ else
+ nums = 1;
+
+ s = 0;
+ l = analog->channels;
+ for (i = 0; i < nums; i++) {
+ for (j = 0; j < ctx->num_analog_channels; j++) {
+ if (ctx->analog_channels[j] == l->data)
+ ctx->analog_vals[j] = analog->data[s++];
+ }
+ l = l->next;
+ }
+}
+
+static int receive(const struct sr_output *o, const struct sr_datafeed_packet *packet,