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; }
dxd() : handle(dsd2pcm_init()) { if (!handle) throw std::runtime_error("wtf?!"); }