long duh_render( DUH_SIGRENDERER *sigrenderer, int bits, int unsign, float volume, float delta, long size, void *sptr ) { long n; sample_t **sampptr; int n_channels; ASSERT(bits == 8 || bits == 16); ASSERT(sptr); if (!sigrenderer) return 0; n_channels = duh_sigrenderer_get_n_channels(sigrenderer); ASSERT(n_channels > 0); /* This restriction will be removed when need be. At the moment, tightly * optimised loops exist for exactly one or two channels. */ ASSERT(n_channels <= 2); sampptr = allocate_sample_buffer(n_channels, size); if (!sampptr) return 0; dumb_silence(sampptr[0], n_channels * size); size = duh_sigrenderer_generate_samples(sigrenderer, volume, delta, size, sampptr); if (bits == 16) { int signconv = unsign ? 0x8000 : 0x0000; for (n = 0; n < size * n_channels; n++) { CONVERT16(sampptr[0][n], n, signconv); } } else { char signconv = unsign ? 0x80 : 0x00; for (n = 0; n < size * n_channels; n++) { CONVERT8(sampptr[0][n], n, signconv); } } destroy_sample_buffer(sampptr); return size; }
long duh_render_float(DUH_SIGRENDERER *sigrenderer, sample_t ***sig_samples, long *sig_samples_size, int bits, float volume, float delta, long size, void *sptr) { long n; sample_t **sampptr; int n_channels; ASSERT(bits == 32 || bits == 64); ASSERT(sptr); ASSERT(sig_samples); ASSERT(sig_samples_size); if (!sigrenderer) return 0; n_channels = duh_sigrenderer_get_n_channels(sigrenderer); ASSERT(n_channels > 0); /* This restriction will be removed when need be. At the moment, tightly * optimised loops exist for exactly one or two channels. */ ASSERT(n_channels <= 2); if ((*sig_samples == NULL) || (*sig_samples_size != size)) { destroy_sample_buffer(*sig_samples); *sig_samples = allocate_sample_buffer(n_channels, size); *sig_samples_size = size; } sampptr = *sig_samples; if (!sampptr) return 0; dumb_silence(sampptr[0], n_channels * size); size = duh_sigrenderer_generate_samples(sigrenderer, volume, delta, size, sampptr); if (bits == 64) { for (n = 0; n < size * n_channels; n++) { CONVERT64F(sampptr[0][n], n); } } else if (bits == 32) { for (n = 0; n < size * n_channels; n++) { CONVERT32F(sampptr[0][n], n); } } return size; }
static int allocate_all_sample_buffers(unsigned int * size) { int ret; unsigned int cpu; unsigned int buffer_size; if (copy_from_user(&buffer_size, size, sizeof(unsigned int)) != 0) { ret = -EFAULT; goto error; } /* free sample buffer if it is already allocated */ free_all_sample_buffers(); for_each_possible_cpu(cpu) { ret = allocate_sample_buffer(cpu, &buffer_size); if (ret != 0) { goto error; } } if (copy_to_user(size, &buffer_size, sizeof(unsigned int)) != 0) { ret = -EFAULT; goto error; } return 0; error: free_all_sample_buffers(); return ret; }