Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}