Esempio n. 1
0
const float *
pcm_dsd_to_float(struct pcm_dsd *dsd, unsigned channels, bool lsbfirst,
		 const uint8_t *src, size_t src_size,
		 size_t *dest_size_r)
{
	assert(dsd != NULL);
	assert(src != NULL);
	assert(src_size > 0);
	assert(src_size % channels == 0);
	assert(channels <= G_N_ELEMENTS(dsd->dsd2pcm));

	const unsigned num_samples = src_size;
	const unsigned num_frames = src_size / channels;

	float *dest;
	const size_t dest_size = num_samples * sizeof(*dest);
	*dest_size_r = dest_size;
	dest = pcm_buffer_get(&dsd->buffer, dest_size);

	for (unsigned c = 0; c < channels; ++c) {
		if (dsd->dsd2pcm[c] == NULL) {
			dsd->dsd2pcm[c] = dsd2pcm_init();
			if (dsd->dsd2pcm[c] == NULL)
				return NULL;
		}

		dsd2pcm_translate(dsd->dsd2pcm[c], num_frames,
				  src + c, channels,
				  lsbfirst, dest + c, channels);
	}

	return dest;
}
Esempio n. 2
0
	dxd() : handle(dsd2pcm_init())
	{ if (!handle) throw std::runtime_error("wtf?!"); }