コード例 #1
0
ファイル: lv_audio.c プロジェクト: Libvisual/DroidVisuals
int visual_audio_normalise_spectrum (VisBuffer *buffer)
{
	visual_return_val_if_fail (buffer != NULL, -VISUAL_ERROR_BUFFER_NULL);

	visual_dft_log_scale_standard (visual_buffer_get_data (buffer),
			visual_buffer_get_data (buffer),
			visual_buffer_get_size (buffer) / sizeof (float));

	return VISUAL_OK;
}
コード例 #2
0
static void act_bumpscope_render (VisPluginData *plugin, VisVideo *video, VisAudio *audio)
{
	BumpscopePrivate *priv = visual_plugin_get_private (plugin);
	priv->video = video;

	visual_audio_get_sample_mixed_simple (audio, priv->pcmbuf, 2,
			VISUAL_AUDIO_CHANNEL_LEFT,
			VISUAL_AUDIO_CHANNEL_RIGHT);

	__bumpscope_render_pcm (priv, visual_buffer_get_data (priv->pcmbuf));

	visual_mem_copy (visual_video_get_pixels (video), priv->rgb_buf2, visual_video_get_size (video));

	priv->colorupdate++;

	/* Let's not overload the color selector */
	if (priv->colorupdate > 1)
		priv->colorupdate = 0;

	if (priv->colorchanged == TRUE && priv->colorupdate == 0) {
		/* I couldn't hold myself */
		visual_param_set_value_color (
			visual_param_list_get (
				visual_plugin_get_params (plugin), "color"), &priv->color);
	}
}
コード例 #3
0
ファイル: lv_video.c プロジェクト: Starlon/LibVisualAndroid
int visual_video_set_buffer (VisVideo *video, void *buffer)
{
	visual_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL);

	if (visual_buffer_get_allocated (video->buffer)) {
		visual_log (VISUAL_LOG_ERROR, _("Trying to set a screen buffer on "
				"a VisVideo structure which points to an allocated screen buffer"));

		return -VISUAL_ERROR_VIDEO_HAS_ALLOCATED;
	}

	visual_buffer_set_data (video->buffer, buffer);
	visual_buffer_set_destroyer (video->buffer, NULL);

	if (video->pixel_rows != NULL) {
		visual_mem_free (video->pixel_rows);

		video->pixel_rows = NULL;
	}

	if (visual_buffer_get_data (video->buffer) != NULL) {
		video->pixel_rows = visual_mem_new0 (void *, video->height);

		precompute_row_table (video);
	}
コード例 #4
0
static int act_jakdaw_render (VisPluginData *plugin, VisVideo *video, VisAudio *audio)
{
	JakdawPrivate *priv = visual_object_get_private (VISUAL_OBJECT (plugin));
	uint32_t *vscr = visual_video_get_pixels (video);

	visual_audio_get_sample_mixed_simple (audio, priv->pcmbuf, 2,
			VISUAL_AUDIO_CHANNEL_LEFT,
			VISUAL_AUDIO_CHANNEL_RIGHT);

	visual_audio_get_spectrum_for_sample (priv->freqbuf, priv->pcmbuf, TRUE);

	_jakdaw_feedback_render (priv, vscr);
	_jakdaw_plotter_draw (priv,
			visual_buffer_get_data (priv->pcmbuf),
			visual_buffer_get_data (priv->freqbuf), vscr);

	return 0;
}
コード例 #5
0
ファイル: lv_audio.c プロジェクト: Libvisual/DroidVisuals
int visual_audio_get_spectrum_for_sample (VisBuffer *buffer, VisBuffer *sample, int normalised)
{
	VisDFT dft;

	visual_return_val_if_fail (buffer != NULL, -VISUAL_ERROR_BUFFER_NULL);
	visual_return_val_if_fail (sample != NULL, -VISUAL_ERROR_BUFFER_NULL);

	visual_dft_init (&dft, visual_buffer_get_size (buffer) / sizeof (float),
			visual_buffer_get_size (sample) / sizeof (float));

	/* Fourier analyze the pcm data */
	visual_dft_perform (&dft, visual_buffer_get_data (buffer), visual_buffer_get_data (sample));

	if (normalised == TRUE)
		visual_audio_normalise_spectrum (buffer);

	visual_object_unref (VISUAL_OBJECT (&dft));

	return VISUAL_OK;
}
コード例 #6
0
ファイル: lv_audio.c プロジェクト: Libvisual/DroidVisuals
int visual_audio_sample_buffer_mix (VisBuffer *dest, VisBuffer *src, int divide, float multiplier)
{
	float *dbuf;
	float *sbuf;
	int scnt;
	int i;

	visual_return_val_if_fail (dest != NULL, -VISUAL_ERROR_BUFFER_NULL);
	visual_return_val_if_fail (src != NULL, -VISUAL_ERROR_BUFFER_NULL);
	visual_return_val_if_fail (visual_buffer_get_size (dest) == visual_buffer_get_size (src),
			-VISUAL_ERROR_BUFFER_OUT_OF_BOUNDS);

	dbuf = visual_buffer_get_data (dest);
	sbuf = visual_buffer_get_data (src);

	scnt = visual_buffer_get_size (dest) / sizeof (float);

	/* FIXME make simd version of these */
	if (divide == FALSE) {
		if (multiplier == 1.0) {
			for (i = 0; i < scnt; i++)
				dbuf[i] += sbuf[i];
		} else {
			for (i = 0; i < scnt; i++)
				dbuf[i] += (sbuf[i] * multiplier);
		}
	} else {
		if (multiplier == 1.0) {
			for (i = 0; i < scnt; i++)
				dbuf[i] = (dbuf[i] + sbuf[i]) * 0.5;
		} else {
			for (i = 0; i < scnt; i++)
				dbuf[i] = (dbuf[i] + (sbuf[i] * multiplier)) * 0.5;
		}
	}

	return VISUAL_OK;
}
コード例 #7
0
ファイル: lv_audio.c プロジェクト: Libvisual/DroidVisuals
int visual_audio_get_spectrum_for_sample_multiplied (VisBuffer *buffer, VisBuffer *sample, int normalised, float multiplier)
{
	int ret;
	float *data;
	int datasize;

	visual_return_val_if_fail (buffer != NULL, -VISUAL_ERROR_BUFFER_NULL);
	visual_return_val_if_fail (sample != NULL, -VISUAL_ERROR_BUFFER_NULL);

	ret = visual_audio_get_spectrum_for_sample (buffer, sample, normalised);

	data = visual_buffer_get_data (buffer);
	datasize = visual_buffer_get_size (buffer) / sizeof (float);

	visual_math_vectorized_multiplier_floats_const_float (data, data, datasize, multiplier);

	return ret;
}
コード例 #8
0
ファイル: lv_audio.c プロジェクト: Libvisual/DroidVisuals
int visual_audio_get_spectrum_multiplied (VisAudio *audio, VisBuffer *buffer, int samplelen, const char *channelid, int normalised, float multiplier)
{
	int ret;
	float *data;
	int datasize;

	visual_return_val_if_fail (audio != NULL, -VISUAL_ERROR_AUDIO_NULL);
	visual_return_val_if_fail (buffer != NULL, -VISUAL_ERROR_BUFFER_NULL);
	visual_return_val_if_fail (channelid != NULL, -VISUAL_ERROR_BUFFER_NULL);

	ret = visual_audio_get_spectrum (audio, buffer, samplelen, channelid, normalised);

	data = visual_buffer_get_data (buffer);
	datasize = visual_buffer_get_size (buffer) / sizeof (float);

	visual_math_vectorized_multiplier_floats_const_float (data, data, datasize, multiplier);

	return ret;
}
コード例 #9
0
ファイル: nebulus.c プロジェクト: Libvisual/LibVisualAndroid
static int nebulus_sound (NebulusPrivate *priv, VisAudio *audio)
{
	int i, c, y, tmp;
	GLfloat val, energy = 0;
	int xscale[] = { 0, 1, 2, 3, 5, 7, 10, 14, 20, 28, 40, 54, 74, 101, 137, 187, 255 };
	float *fbuf;
	VisBuffer *buf;
	float freq[256];

	visual_audio_get_sample_mixed_simple (audio, priv->pcmbuf, 2,
			VISUAL_AUDIO_CHANNEL_LEFT,
			VISUAL_AUDIO_CHANNEL_RIGHT);

	buf = visual_buffer_new_wrap_data (freq, sizeof (freq));
	visual_audio_get_spectrum_for_sample (buf, priv->pcmbuf, FALSE);
	visual_buffer_free (buf);

	fbuf = visual_buffer_get_data (priv->pcmbuf);

	for (i = 0; i < 1024; i++) {
		pcm_data[i] = fbuf[i] * 32767; // FIXME pull the 32767 as a constant from somewhere, also in goom2.c
	}

	for(y = 15; y > 0; y--) {
		for(i = 0; i < 16; i++)
			heights[y][i] = heights[y - 1][i];
	}
	for(i = 0; i < NUM_BANDS; i++) {
		for(c = xscale[i], y = 0; c < xscale[i + 1]; c++) {
			if(freq[c] > y)
				y = freq[c];
		}
		loudness += (y / (xscale[i + 1] - xscale[i] + 1)) *
			(abs (i - NUM_BANDS / 2) + NUM_BANDS / 2) * (4 + i);
		y >>= 7;
		if(y > 0)
			val = (log(y) * scale);
		else
			val = 0;
		heights[0][i] = val;
	}
	loudness /= (NUM_BANDS * 4);
	beat = nebulus_detect_beat (loudness);
	too_long++;
	if (!point_general->freeze) {
		if (too_long > 1000) {
			too_long = 0;
			point_general->effect = nebulus_random_effect();
			point_general->changement = TRUE;
		}
		if (beat) {
			if (beat_compteur > point_general->beat - 1) {
				point_general->effect = nebulus_random_effect();
				point_general->changement = TRUE;
				beat_compteur = 0;
				too_long = 0;
			}
			beat_compteur += beat;
		}
	}
	for (i = 0; i < 256; i++) {
		tmp = freq[i] * 0.0625;
		energy += tmp * tmp;
	}
	energy =  energy / 65536 / 256 * 256;
	energy += 6.0f;
	energy *= 1.2f;
	if (energy > 10)
		energy = 10;
	point_general->energy = energy;

	return 0;
}
コード例 #10
0
static int fixate_with_partial_data_request (VisRingBuffer *ringbuffer, VisBuffer *data, int offset, int nbytes,
        int *buffercorr)
{
    VisListEntry *le = NULL;
    VisRingBufferEntry *entry;
    int curoffset = 0;
    int startat = 0;

    *buffercorr = 0;

    while ((entry = visual_list_next (ringbuffer->entries, &le)) != NULL) {
        int bsize = 0;

        startat++;

        if (entry->type == VISUAL_RINGBUFFER_ENTRY_TYPE_BUFFER) {

            if ((bsize = visual_buffer_get_size (entry->buffer)) > 0)
                curoffset += bsize;

            /* This buffer partially falls within the offset */
            if (curoffset > offset) {
                visual_buffer_put_data (data,
                                        ((uint8_t *) visual_buffer_get_data (entry->buffer) +
                                         visual_buffer_get_size (entry->buffer)) -
                                        (curoffset - offset), curoffset - offset, 0);

                *buffercorr = curoffset - offset;

                break;
            }
        } else if (entry->type == VISUAL_RINGBUFFER_ENTRY_TYPE_FUNCTION) {

            if (entry->sizefunc != NULL) {
                curoffset += entry->sizefunc (ringbuffer, entry);

                /* This buffer partially falls within the offset */
                if (curoffset > offset) {

                    VisBuffer *tempbuf = entry->datafunc (ringbuffer, entry);

                    visual_buffer_put_data (data,
                                            ((uint8_t *) visual_buffer_get_data (tempbuf) +
                                             visual_buffer_get_size (tempbuf)) -
                                            (curoffset - offset), curoffset - offset, 0);

                    visual_buffer_unref (tempbuf);

                    *buffercorr = curoffset - offset;

                    break;
                }
            } else {
                VisBuffer *tempbuf = entry->datafunc (ringbuffer, entry);

                if ((bsize = visual_buffer_get_size (tempbuf)) > 0)
                    curoffset += bsize;

                /* This buffer partially falls within the offset */
                if (curoffset > offset) {
                    visual_buffer_put_data (data,
                                            ((uint8_t *) visual_buffer_get_data (tempbuf) +
                                             visual_buffer_get_size (tempbuf)) -
                                            (curoffset - offset), curoffset - offset, 0);

                    *buffercorr = curoffset - offset;

                    break;
                }

                visual_buffer_unref (tempbuf);
            }
        }
    }

    return startat;
}
コード例 #11
0
int visual_ringbuffer_get_data_offset (VisRingBuffer *ringbuffer, VisBuffer *data, int offset, int nbytes)
{
    VisListEntry *le = NULL;
    VisRingBufferEntry *entry;
    int curposition = 0;
    int startat = 0;
    int buffercorr = 0;

    visual_return_val_if_fail (ringbuffer != NULL, -VISUAL_ERROR_RINGBUFFER_NULL);
    visual_return_val_if_fail (data != NULL, -VISUAL_ERROR_BUFFER_NULL);

    /* Fixate possible partial buffer */
    if (offset > 0)
        startat = fixate_with_partial_data_request (ringbuffer, data, offset, nbytes, &buffercorr);

    curposition = buffercorr;

    /* Buffer fixated with partial segment, request the other segments */
    while (curposition < nbytes) {
        int lindex = 0;
        le = NULL;

        /* return immediately if there are no elements in the list */
        if(visual_list_count(ringbuffer->entries) == 0)
            return VISUAL_OK;

        while ((entry = visual_list_next (ringbuffer->entries, &le)) != NULL) {
            VisBuffer *tempbuf = NULL;

            lindex++;

            /* Skip to the right offset buffer fragment */
            if (lindex <= startat)
                continue;

            if (entry->type == VISUAL_RINGBUFFER_ENTRY_TYPE_BUFFER) {

                tempbuf = entry->buffer;

            } else if (entry->type == VISUAL_RINGBUFFER_ENTRY_TYPE_FUNCTION) {

                /* Will bail out through visual_error_raise(), this is fatal, let's not try to
                 * recover, it's a very obvious bug in the software */
                if (entry->datafunc == NULL) {
                    visual_log (VISUAL_LOG_ERROR,
                                _("No VisRingBufferDataFunc data provider function set on "
                                  "type VISUAL_RINGBUFFER_ENTRY_TYPE_FUNCTION"));

                    return -VISUAL_ERROR_IMPOSSIBLE;
                }

                tempbuf = entry->datafunc (ringbuffer, entry);
            }

            if (curposition + visual_buffer_get_size (tempbuf) > nbytes) {
                VisBuffer *buf;

                buf = visual_buffer_new_wrap_data (visual_buffer_get_data (tempbuf), nbytes - curposition);
                visual_buffer_put (data, buf, curposition);
                visual_buffer_free (buf);

                if (entry->type == VISUAL_RINGBUFFER_ENTRY_TYPE_FUNCTION)
                    visual_buffer_unref (tempbuf);

                return VISUAL_OK;
            }

            visual_buffer_put (data, tempbuf, curposition);

            curposition += visual_buffer_get_size (tempbuf);

            if (entry->type == VISUAL_RINGBUFFER_ENTRY_TYPE_FUNCTION)
                visual_buffer_unref (tempbuf);

            /* Filled without room for partial buffer addition */
            if (curposition == nbytes)
                return VISUAL_OK;
        }

        startat = 0;
    }

    return VISUAL_OK;
}