static void qsampler_dcache_filler (gpointer data, guint voffset, guint n_values, gint16 *values, BstQSampler *qsampler) { GslDataCache *dcache = data; GslDataCacheNode *dnode; glong dcache_length, dnode_length; gint i; dnode = gsl_data_cache_ref_node (dcache, voffset, TRUE); dcache_length = gsl_data_handle_length (dcache->dhandle); dnode_length = dcache->node_size; for (i = 0; i < n_values; i++) { glong offset = voffset + i; if (offset < 0 || offset >= dcache_length) values[i] = 0; else { if (offset < dnode->offset || offset >= dnode->offset + dnode_length) { gsl_data_cache_unref_node (dcache, dnode); dnode = gsl_data_cache_ref_node (dcache, offset, TRUE); } values[i] = dnode->data[offset - dnode->offset] * 32768.0; } } gsl_data_cache_unref_node (dcache, dnode); }
static GslLong dcache_handle_read (GslDataHandle *data_handle, GslLong voffset, GslLong n_values, gfloat *values) { DCacheHandle *dhandle = (DCacheHandle*) data_handle; GslDataCacheNode *node; node = gsl_data_cache_ref_node (dhandle->dcache, voffset, TRUE); voffset -= node->offset; n_values = MIN (n_values, dhandle->node_size - voffset); memcpy (values, node->data + voffset, sizeof (values[0]) * n_values); return n_values; }