X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=session_driver.c;h=fe0db3e6e0acbbf0ad5b808e4321b11fe8a48d35;hb=7bcbbfae3e0262ed25693adb7aa1f0b864722827;hp=a7ecce6b80674e544a0516563ce164d7a6c9160c;hpb=aa48adf96059aa882da4dc8738d6a1e13068d2ae;p=libsigrok.git diff --git a/session_driver.c b/session_driver.c index a7ecce6b..fe0db3e6 100644 --- a/session_driver.c +++ b/session_driver.c @@ -41,7 +41,7 @@ struct session_vdev { int bytes_read; uint64_t samplerate; int unitsize; - int num_probes; + int num_channels; int cur_chunk; gboolean finished; }; @@ -115,7 +115,6 @@ static int receive_data(int fd, int revents, void *cb_data) sr_dbg("Opened %s.", capturefile); } else { /* We got all the chunks, finish up. */ - g_free(vdev->capturefile); vdev->finished = TRUE; continue; } @@ -127,8 +126,12 @@ static int receive_data(int fd, int revents, void *cb_data) return FALSE; } - ret = zip_fread(vdev->capfile, buf, CHUNKSIZE); + ret = zip_fread(vdev->capfile, buf, + CHUNKSIZE / vdev->unitsize * vdev->unitsize); if (ret > 0) { + if (ret % vdev->unitsize != 0) + sr_warn("Read size %d not a multiple of the" + " unit size %d.", ret, vdev->unitsize); got_data = TRUE; packet.type = SR_DF_LOGIC; packet.payload = &logic; @@ -143,7 +146,6 @@ static int receive_data(int fd, int revents, void *cb_data) vdev->capfile = NULL; if (vdev->cur_chunk == 0) { /* It was the only file. */ - g_free(vdev->capturefile); vdev->finished = TRUE; } else { /* There might be more chunks, so don't fall through @@ -173,7 +175,7 @@ static int init(struct sr_context *sr_ctx) return SR_OK; } -static int cleanup(void) +static int dev_clear(void) { GSList *l; @@ -198,6 +200,10 @@ static int dev_open(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi) { + const struct session_vdev *const vdev = sdi->priv; + g_free(vdev->sessionfile); + g_free(vdev->capturefile); + g_free(sdi->priv); sdi->priv = NULL; @@ -205,11 +211,11 @@ static int dev_close(struct sr_dev_inst *sdi) } static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, - const struct sr_probe_group *probe_group) + const struct sr_channel_group *cg) { struct session_vdev *vdev; - (void)probe_group; + (void)cg; switch (id) { case SR_CONF_SAMPLERATE: @@ -227,11 +233,11 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, } static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, - const struct sr_probe_group *probe_group) + const struct sr_channel_group *cg) { struct session_vdev *vdev; - (void)probe_group; + (void)cg; vdev = sdi->priv; @@ -241,18 +247,20 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, sr_info("Setting samplerate to %" PRIu64 ".", vdev->samplerate); break; case SR_CONF_SESSIONFILE: + g_free(vdev->sessionfile); vdev->sessionfile = g_strdup(g_variant_get_string(data, NULL)); sr_info("Setting sessionfile to '%s'.", vdev->sessionfile); break; case SR_CONF_CAPTUREFILE: + g_free(vdev->capturefile); vdev->capturefile = g_strdup(g_variant_get_string(data, NULL)); sr_info("Setting capturefile to '%s'.", vdev->capturefile); break; case SR_CONF_CAPTURE_UNITSIZE: vdev->unitsize = g_variant_get_uint64(data); break; - case SR_CONF_NUM_LOGIC_PROBES: - vdev->num_probes = g_variant_get_uint64(data); + case SR_CONF_NUM_LOGIC_CHANNELS: + vdev->num_channels = g_variant_get_uint64(data); break; default: return SR_ERR_NA; @@ -262,10 +270,10 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, } static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, - const struct sr_probe_group *probe_group) + const struct sr_channel_group *cg) { (void)sdi; - (void)probe_group; + (void)cg; switch (key) { case SR_CONF_DEVICE_OPTIONS: @@ -286,6 +294,10 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) vdev = sdi->priv; + vdev->bytes_read = 0; + vdev->cur_chunk = 0; + vdev->finished = FALSE; + sr_info("Opening archive %s file %s", vdev->sessionfile, vdev->capturefile); @@ -310,10 +322,10 @@ SR_PRIV struct sr_dev_driver session_driver = { .longname = "Session-emulating driver", .api_version = 1, .init = init, - .cleanup = cleanup, + .cleanup = dev_clear, .scan = NULL, .dev_list = NULL, - .dev_clear = NULL, + .dev_clear = dev_clear, .config_get = config_get, .config_set = config_set, .config_list = config_list,