static int act_infinite_render (VisPluginData *plugin, VisVideo *video, VisAudio *audio) { VisBuffer *buffer; InfinitePrivate *priv; visual_return_val_if_fail (plugin != NULL, -1); visual_return_val_if_fail (video != NULL, -1); visual_return_val_if_fail (audio != NULL, -1); priv = visual_object_get_private (VISUAL_OBJECT (plugin)); buffer = visual_buffer_new (); visual_buffer_set_data_pair (buffer, priv->pcm_data[0], sizeof (float) * 512); visual_audio_get_sample (audio, buffer, VISUAL_AUDIO_CHANNEL_LEFT); visual_buffer_set_data_pair (buffer, priv->pcm_data[1], sizeof (float) * 512); visual_audio_get_sample (audio, buffer, VISUAL_AUDIO_CHANNEL_LEFT); _inf_renderer (priv); _inf_display (priv, (uint8_t *) visual_video_get_pixels (video), video->pitch); visual_buffer_free (buffer); return 0; }
VISUAL_C_LINKAGE int lv_gforce_render (VisPluginData *plugin, VisVideo *video, VisAudio *audio) { GForcePrivate *priv = (GForcePrivate *) visual_object_get_private (VISUAL_OBJECT (plugin)); VisBuffer pcmbuf; VisBuffer freqbuf; int i; long time; float gSoundBuf[SND_BUF_SIZE]; float gFFTBuf[FFT_BUF_SIZE]; visual_buffer_set_data_pair (&pcmbuf, gSoundBuf, sizeof (gSoundBuf)); visual_audio_get_sample_mixed_simple (audio, &pcmbuf, 2, VISUAL_AUDIO_CHANNEL_LEFT, VISUAL_AUDIO_CHANNEL_RIGHT); visual_buffer_set_data_pair (&freqbuf, gFFTBuf, sizeof (gFFTBuf)); visual_audio_get_spectrum_for_sample_multiplied (&freqbuf, &pcmbuf, TRUE, 3.0); // Increase volume for (i = 0; i < SND_BUF_SIZE; i++) gSoundBuf[i] *= 32768; // Set the video buffer priv->gGF->SetOutVideoBuffer ((unsigned char *) visual_video_get_pixels (video)); time = EgOSUtils::CurTimeMS (); priv->gGF->RecordSample (time, gSoundBuf, .000043, NUMSAMPLES, gFFTBuf, 1, FFT_BUF_SIZE); return 0; }
static unsigned char *get_pcm_data(VisAudio *audio) { VisBuffer buf; float pcmbuf[MAXSIZE]; static unsigned char retbuf[MAXSIZE]; static int first_call = TRUE; static int then = 0; int now = _gettime(0); int i; /* Cache results every 25ms apart, skipping first call */ if(first_call == FALSE && now - then > 25) { then = now; return retbuf; } first_call = FALSE; visual_buffer_set_data_pair(&buf, pcmbuf, MAXSIZE); visual_audio_get_sample_mixed(audio, &buf, TRUE, 2, VISUAL_AUDIO_CHANNEL_LEFT, VISUAL_AUDIO_CHANNEL_RIGHT, 1.0, 1.0); for(i = MAXSIZE; i; i--) { retbuf[i-1] = pcmbuf[i-1] * UCHAR_MAX; } return retbuf; }
static int lv_goom_render (VisPluginData *plugin, VisVideo *video, VisAudio *audio) { GoomPrivate *priv = visual_object_get_private (VISUAL_OBJECT (plugin)); VisSongInfo *songinfo; short pcmdata[2][512]; float fpcmdata[2][512]; uint32_t *buf; uint8_t *vidbuf = visual_video_get_pixels (video); int showinfo = TRUE; int i; visual_buffer_set_data_pair (priv->pcmbuf1, fpcmdata[0], sizeof (float) * 512); visual_audio_get_sample (audio, priv->pcmbuf1, VISUAL_AUDIO_CHANNEL_LEFT); visual_buffer_set_data_pair (priv->pcmbuf2, fpcmdata[1], sizeof (float) * 512); visual_audio_get_sample (audio, priv->pcmbuf2, VISUAL_AUDIO_CHANNEL_RIGHT); for (i = 0; i < 512; i++) { pcmdata[0][i] = fpcmdata[0][i] * 32767; pcmdata[1][i] = fpcmdata[1][i] * 32767; } /* Retrieve the songinfo */ songinfo = VISUAL_ACTOR_PLUGIN (visual_plugin_get_specific (plugin))->songinfo; /* FIXME goom should support setting a pointer, so we don't need that final visual_mem_copy */ if (songinfo != NULL && visual_songinfo_get_age (songinfo) <= 1 && showinfo == TRUE) { VisSongInfoType songinfo_type = visual_songinfo_get_type (songinfo); if (songinfo_type == VISUAL_SONGINFO_TYPE_SIMPLE) buf = goom_update (priv->goominfo, pcmdata, 0, 0, visual_songinfo_get_simple_name (songinfo), NULL); else if (songinfo_type == VISUAL_SONGINFO_TYPE_ADVANCED) buf = goom_update (priv->goominfo, pcmdata, 0, 0, visual_songinfo_get_song (songinfo), NULL); else buf = goom_update (priv->goominfo, pcmdata, 0, 0, NULL, NULL); } else buf = goom_update (priv->goominfo, pcmdata, 0, 0, NULL, NULL); visual_mem_copy_pitch (vidbuf, buf, video->pitch, video->width * video->bpp, video->width * video->bpp, video->height); return 0; }
/* This is where the real rendering happens! This function is what we call, many times * a second to get our graphical frames. */ extern "C" int lv_projectm_render (VisPluginData *plugin, VisVideo *video, VisAudio *audio) { ProjectmPrivate *priv = (ProjectmPrivate*)visual_object_get_private (VISUAL_OBJECT (plugin)); VisBuffer pcmb; float pcm[2][512]; int i; if (video->parent != NULL) lv_projectm_dimension (plugin, video->parent, video->parent->width, video->parent->height); else lv_projectm_dimension (plugin, video, video->width, video->height); visual_buffer_set_data_pair (&pcmb, pcm[0], sizeof (pcm[0])); visual_audio_get_sample (audio, &pcmb, (char*)VISUAL_AUDIO_CHANNEL_LEFT); visual_buffer_set_data_pair (&pcmb, pcm[1], sizeof (pcm[1])); visual_audio_get_sample (audio, &pcmb, (char*)VISUAL_AUDIO_CHANNEL_RIGHT); priv->PM->pcm()->addPCMfloat(*pcm,512); priv->PM->renderFrame(); return 0; }
int visual_video_free_buffer (VisVideo *video) { visual_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); visual_return_val_if_fail (visual_video_get_pixels (video) != NULL, -VISUAL_ERROR_VIDEO_PIXELS_NULL); if (video->pixel_rows != NULL) visual_mem_free (video->pixel_rows); if (visual_buffer_get_allocated (video->buffer)) { visual_buffer_destroy_content (video->buffer); } else { return -VISUAL_ERROR_VIDEO_NO_ALLOCATED; } video->pixel_rows = NULL; visual_buffer_set_data_pair (video->buffer, NULL, 0); return VISUAL_OK; }
int lvavs_pipeline_run (LVAVSPipeline *pipeline, VisVideo *video, VisAudio *audio) { int i; VisBuffer pcmbuf1; VisBuffer pcmbuf2; VisBuffer spmbuf1; VisBuffer spmbuf2; VisBuffer tmp; int size = BEAT_MAX_SIZE/2; float data[2][2][size]; visual_buffer_init_allocate(&tmp, sizeof(float) * size, visual_buffer_destroyer_free); /* Left audio */ visual_buffer_set_data_pair(&pcmbuf1, data[0][0], sizeof(float) * size); if(visual_audio_get_sample(audio, &tmp, VISUAL_AUDIO_CHANNEL_LEFT) == VISUAL_OK) visual_audio_sample_buffer_mix(&pcmbuf1, &tmp, TRUE, 1.0); visual_buffer_set_data_pair(&spmbuf1, &data[1][0], sizeof(float) * size); visual_audio_get_spectrum_for_sample (&spmbuf1, &tmp, TRUE); /* Right audio */ visual_buffer_set_data_pair(&pcmbuf2, data[0][1], sizeof(float) * size); if(visual_audio_get_sample(audio, &tmp, VISUAL_AUDIO_CHANNEL_LEFT) == VISUAL_OK) visual_audio_sample_buffer_mix(&pcmbuf2, &tmp, TRUE, 1.0); visual_buffer_set_data_pair(&spmbuf2, data[1][1], sizeof(float) * size); visual_audio_get_spectrum_for_sample(&spmbuf2, &tmp, TRUE); visual_object_unref(VISUAL_OBJECT(&tmp)); #ifdef _OPENMP #pragma omp parallel for private(i) #endif for(i = size - 1; i >= 0; i--) { pipeline->audiodata[0][0][i] = (data[0][0][i] + 1) / 2; pipeline->audiodata[1][0][i] = (data[1][0][i] + 1) / 2; pipeline->audiodata[0][1][i] = (data[0][1][i] + 1) / 2; pipeline->audiodata[1][1][i] = (data[1][1][i] + 1) / 2; } float beatdata[BEAT_MAX_SIZE]; unsigned char visdata[BEAT_MAX_SIZE]; memcpy(beatdata, data[1][0], size * sizeof(float)); memcpy(beatdata + size, data[1][1], size * sizeof(float)); #ifdef _OPENMP #pragma omp parallel for private(i) #endif for(i = BEAT_MAX_SIZE - 1; i >= 0; i--) { visdata[i] = (beatdata[i] + 1) / 2.0 * UCHAR_MAX; } pipeline->isBeat = visual_audio_is_beat_with_data(audio, VISUAL_BEAT_ALGORITHM_PEAK, visdata, BEAT_MAX_SIZE); pipeline_container_run (LVAVS_PIPELINE_CONTAINER (pipeline->container), video, audio); return VISUAL_OK; }
static int lv_flower_render (VisPluginData *plugin, VisVideo *video, VisAudio *audio) { FlowerPrivate *priv = visual_object_get_private (VISUAL_OBJECT (plugin)); VisBuffer *pcmbuf; VisBuffer *freqbuf; float pcm[512]; float freqnorm[256]; float temp_bars[NOTCH_BANDS]; float f; int b; int i; pcmbuf = visual_buffer_new (); freqbuf = visual_buffer_new (); visual_buffer_set_data_pair (pcmbuf, pcm, sizeof (pcm)); visual_buffer_set_data_pair (freqbuf, freqnorm, sizeof (freqnorm)); visual_audio_get_sample_mixed_simple (audio, pcmbuf, 2, VISUAL_AUDIO_CHANNEL_LEFT, VISUAL_AUDIO_CHANNEL_RIGHT); visual_audio_get_spectrum_for_sample (freqbuf, pcmbuf, TRUE); /* Activate the effect change timer */ if (!visual_timer_is_active (priv->t)) visual_timer_start (priv->t); /* At 15 secs, do with new settings, reset timer */ if (visual_timer_is_past2 (priv->t, 15, 0)) { priv->flower.tension_new = (-visual_random_context_float (priv->rcxt)) * 12.0; priv->flower.continuity_new = (visual_random_context_float (priv->rcxt) - 0.5) * 32.0; visual_timer_start (priv->t); } /* Activate global timer */ if (!visual_timer_is_active (priv->flower.timer)) visual_timer_start (priv->flower.timer); for (b=0; b<priv->nof_bands; b++) temp_bars[b]=0.0; for (i=0; i<256; i++) { for (b=0; b<priv->nof_bands; b++) { f=process_notch (priv->notch[b], freqnorm[i] * 15); if (fabs(f)>temp_bars[b]) temp_bars[b]=fabs(f); } } /* Not part of the if !!! */ { #define HEIGHT 1.0 #define D 0.45 #define TAU 0.25 #define DIF 5.0 float lk=2.0; float l0=2.0; float scale = HEIGHT / ( log((1 - D) / D) * 2 ); float x00 = D*D*1.0/(2 * D - 1); float y00 = -log(-x00) * scale; float y; int i; for (i=0; i<priv->nof_bands; i++) { y=temp_bars[i * 8]; y=y*(i*lk+l0); y = ( log(y - x00) * scale + y00 ); /* Logarithmic amplitude */ y = ( (DIF-2.0)*y + (i==0 ? 0 : temp_bars[i - 1]) + (i==31 ? 0 : temp_bars[i + 1])) / DIF; y=((1.0-TAU)*priv->flower.audio_bars[i]+TAU*y) * 1.00; priv->flower.audio_bars[i]=y; } } priv->flower.roty += (priv->flower.audio_bars[15]) * 0.6; priv->flower.rotx += (priv->flower.audio_bars[1]) * 0.7; priv->flower.posz = +1; render_flower_effect (&priv->flower); visual_buffer_free (pcmbuf); visual_buffer_free (freqbuf); return 0; }