X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=output%2Fanalog.c;h=da42b39c819f2cacbb6e7b73071861b995c2314d;hb=2e7cb0040a64062cb4b13fdff72995f4b5dc8769;hp=5f9fcd55168e2fc0eec41e70ae3739185fd6549c;hpb=0da5b6a9f5a119ab485ed3dba08aeb4a3ad2c8f4;p=libsigrok.git diff --git a/output/analog.c b/output/analog.c index 5f9fcd55..da42b39c 100644 --- a/output/analog.c +++ b/output/analog.c @@ -1,7 +1,7 @@ /* * This file is part of the sigrok project. * - * Copyright (C) 2010 Bert Vermeulen + * Copyright (C) 2010-2012 Bert Vermeulen * Copyright (C) 2011 HÃ¥vard Espeland * Copyright (C) 2011 Daniel Ribeiro * @@ -24,7 +24,6 @@ #include #include #include "sigrok.h" -#include "config.h" #define DEFAULT_BPL_BITS 64 #define DEFAULT_BPL_HEX 192 @@ -42,7 +41,7 @@ struct context { unsigned int unitsize; int line_offset; int linebuf_len; - char *probelist[65]; + char *probelist[SR_MAX_NUM_PROBES + 1]; char *linebuf; int spl_cnt; uint8_t *linevalues; @@ -98,13 +97,15 @@ static int init(struct sr_output *o, int default_spl, enum outputmode mode) int num_probes; char *samplerate_s; - if (!(ctx = calloc(1, sizeof(struct context)))) + if (!(ctx = g_try_malloc0(sizeof(struct context)))) { + sr_err("analog out: %s: ctx malloc failed", __func__); return SR_ERR_MALLOC; + } o->internal = ctx; ctx->num_enabled_probes = 0; - for (l = o->device->probes; l; l = l->next) { + for (l = o->dev->probes; l; l = l->next) { probe = l->data; if (!probe->enabled) continue; @@ -126,37 +127,41 @@ static int init(struct sr_output *o, int default_spl, enum outputmode mode) } else ctx->samples_per_line = default_spl; - if (!(ctx->header = malloc(512))) { - free(ctx); + if (!(ctx->header = g_try_malloc(512))) { + g_free(ctx); + sr_err("analog out: %s: ctx->header malloc failed", __func__); return SR_ERR_MALLOC; } snprintf(ctx->header, 511, "%s\n", PACKAGE_STRING); - num_probes = g_slist_length(o->device->probes); - if (o->device->plugin && sr_device_has_hwcap(o->device, SR_HWCAP_SAMPLERATE)) { - samplerate = *((uint64_t *) o->device->plugin->get_device_info( - o->device->plugin_index, SR_DI_CUR_SAMPLERATE)); + num_probes = g_slist_length(o->dev->probes); + if (o->dev->driver && sr_dev_has_hwcap(o->dev, SR_HWCAP_SAMPLERATE)) { + samplerate = *((uint64_t *) o->dev->driver->dev_info_get( + o->dev->driver_index, SR_DI_CUR_SAMPLERATE)); if (!(samplerate_s = sr_samplerate_string(samplerate))) { - free(ctx->header); - free(ctx); + g_free(ctx->header); + g_free(ctx); return SR_ERR; } snprintf(ctx->header + strlen(ctx->header), 511 - strlen(ctx->header), "Acquisition with %d/%d probes at %s\n", ctx->num_enabled_probes, num_probes, samplerate_s); - free(samplerate_s); + g_free(samplerate_s); } ctx->linebuf_len = ctx->samples_per_line * 2 + 4; - if (!(ctx->linebuf = calloc(1, num_probes * ctx->linebuf_len))) { - free(ctx->header); - free(ctx); + if (!(ctx->linebuf = g_try_malloc0(num_probes * ctx->linebuf_len))) { + g_free(ctx->header); + g_free(ctx); + sr_err("analog out: %s: ctx->linebuf malloc failed", __func__); return SR_ERR_MALLOC; } - if (!(ctx->linevalues = calloc(1, num_probes))) { - free(ctx->header); - free(ctx); + if (!(ctx->linevalues = g_try_malloc0(num_probes))) { + g_free(ctx->header); + g_free(ctx); + sr_err("analog out: %s: ctx->linevalues malloc failed", + __func__); return SR_ERR_MALLOC; } @@ -180,12 +185,15 @@ static int event(struct sr_output *o, int event_type, char **data_out, case SR_DF_END: outsize = ctx->num_enabled_probes * (ctx->samples_per_line + 20) + 512; - if (!(outbuf = calloc(1, outsize))) + if (!(outbuf = g_try_malloc0(outsize))) { + sr_err("analog out: %s: outbuf malloc failed", + __func__); return SR_ERR_MALLOC; + } flush_linebufs(ctx, outbuf); *data_out = outbuf; *length_out = strlen(outbuf); - free(o->internal); + g_free(o->internal); o->internal = NULL; break; default: @@ -221,14 +229,16 @@ static int data_bits(struct sr_output *o, const char *data_in, outsize = 512 + (1 + (length_in / ctx->unitsize) / ctx->samples_per_line) * (ctx->num_enabled_probes * max_linelen); - if (!(outbuf = calloc(1, outsize + 1))) + if (!(outbuf = g_try_malloc0(outsize + 1))) { + sr_err("analog out: %s: outbuf malloc failed", __func__); return SR_ERR_MALLOC; + } outbuf[0] = '\0'; if (ctx->header) { /* The header is still here, this must be the first packet. */ strncpy(outbuf, ctx->header, outsize); - free(ctx->header); + g_free(ctx->header); ctx->header = NULL; /* Ensure first transition. */ @@ -274,7 +284,8 @@ static int data_bits(struct sr_output *o, const char *data_in, } } } else { - sr_info("short buffer (length_in=%" PRIu64 ")", length_in); + sr_info("analog out: short buffer (length_in=%" PRIu64 ")", + length_in); } *data_out = outbuf; @@ -303,14 +314,16 @@ static int data_hex(struct sr_output *o, const char *data_in, outsize = length_in / ctx->unitsize * ctx->num_enabled_probes / ctx->samples_per_line * max_linelen + 512; - if (!(outbuf = calloc(1, outsize + 1))) + if (!(outbuf = g_try_malloc0(outsize + 1))) { + sr_err("analog out: %s: outbuf malloc failed", __func__); return SR_ERR_MALLOC; + } outbuf[0] = '\0'; if (ctx->header) { /* The header is still here, this must be the first packet. */ strncpy(outbuf, ctx->header, outsize); - free(ctx->header); + g_free(ctx->header); ctx->header = NULL; } @@ -372,14 +385,16 @@ static int data_ascii(struct sr_output *o, const char *data_in, outsize = 512 + (1 + (length_in / ctx->unitsize) / ctx->samples_per_line) * (ctx->num_enabled_probes * max_linelen); - if (!(outbuf = calloc(1, outsize + 1))) + if (!(outbuf = g_try_malloc0(outsize + 1))) { + sr_err("analog out: %s: outbuf malloc failed", __func__); return SR_ERR_MALLOC; + } outbuf[0] = '\0'; if (ctx->header) { /* The header is still here, this must be the first packet. */ strncpy(outbuf, ctx->header, outsize); - free(ctx->header); + g_free(ctx->header); ctx->header = NULL; } @@ -428,7 +443,8 @@ static int data_ascii(struct sr_output *o, const char *data_in, ctx->prevsample = sample; } } else { - sr_info("short buffer (length_in=%" PRIu64 ")", length_in); + sr_info("analog out: short buffer (length_in=%" PRIu64 ")", + length_in); } *data_out = outbuf; @@ -438,18 +454,19 @@ static int data_ascii(struct sr_output *o, const char *data_in, } #endif -struct sr_output_format output_analog_bits = { +SR_PRIV struct sr_output_format output_analog_bits = { .id = "analog_bits", - .description = "Bits (takes argument, default 64)", + .description = "Bits", .df_type = SR_DF_ANALOG, .init = init_bits, .data = data_bits, .event = event, }; + #if 0 struct sr_output_format output_analog_hex = { .id = "analog_hex", - .description = "Hexadecimal (takes argument, default 192)", + .description = "Hexadecimal", .df_type = SR_DF_ANALOG, .init = init_hex, .data = data_hex, @@ -458,7 +475,7 @@ struct sr_output_format output_analog_hex = { struct sr_output_format output_analog_ascii = { .id = "analog_ascii", - .description = "ASCII (takes argument, default 74)", + .description = "ASCII", .df_type = SR_DF_ANALOG, .init = init_ascii, .data = data_ascii,