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; }
// FIXME: This function is entirely broken from the looks of it. int visual_audio_get_sample_mixed_all (VisAudio *audio, VisBuffer *buffer, int divide) { VisListEntry *le = NULL; VisAudioSamplePool *samplepool; VisAudioSamplePoolChannel *channel; VisBuffer temp; int first = TRUE; visual_return_val_if_fail (audio != NULL, -VISUAL_ERROR_AUDIO_NULL); visual_return_val_if_fail (buffer != NULL, -VISUAL_ERROR_AUDIO_SAMPLEPOOL_NULL); visual_buffer_init_allocate (&temp, visual_buffer_get_size (buffer), visual_buffer_destroyer_free); samplepool = visual_audio_samplepool_new (); // this function's broken. This line was added to get rid of a compile warning. Not sure what samplepool's supposed to be, because it appears the below code expects an already existing VisAudioSamplePool. Dunno. while ((channel = visual_list_next (samplepool->channels, &le)) != NULL) { if (visual_audio_get_sample (audio, &temp, channel->channelid) == VISUAL_OK) { if (first == TRUE) { visual_audio_sample_buffer_mix (buffer, &temp, FALSE, 1.0); first = FALSE; } else { visual_audio_sample_buffer_mix (buffer, &temp, divide, 1.0); } } } visual_object_unref (VISUAL_OBJECT (&temp)); return VISUAL_OK; }
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_audio_get_sample_mixed (VisAudio *audio, VisBuffer *buffer, int divide, int channels, ...) { VisBuffer temp; char **chanids; double *chanmuls; va_list ap; int i; int first = TRUE; visual_return_val_if_fail (audio != NULL, -VISUAL_ERROR_AUDIO_NULL); visual_return_val_if_fail (buffer != NULL, -VISUAL_ERROR_BUFFER_NULL); visual_buffer_init_allocate (&temp, visual_buffer_get_size (buffer), visual_buffer_destroyer_free); chanids = visual_mem_malloc (channels * sizeof (char *)); chanmuls = visual_mem_malloc (channels * sizeof (double)); va_start (ap, channels); /* Retrieving mixing data from valist */ for (i = 0; i < channels; i++) chanids[i] = va_arg (ap, char *); for (i = 0; i < channels; i++) chanmuls[i] = va_arg (ap, double); visual_buffer_fill (buffer, 0); /* The mixing loop */ for (i = 0; i < channels; i++) { if (visual_audio_get_sample (audio, &temp, chanids[i]) == VISUAL_OK) { if (first == TRUE) { visual_audio_sample_buffer_mix (buffer, &temp, FALSE, chanmuls[i]); first = FALSE; } else { visual_audio_sample_buffer_mix (buffer, &temp, divide, chanmuls[i]); } } } va_end (ap); visual_object_unref (VISUAL_OBJECT (&temp)); visual_mem_free (chanids); visual_mem_free (chanmuls); return VISUAL_OK; }
int visual_audio_get_spectrum (VisAudio *audio, VisBuffer *buffer, int samplelen, const char *channelid, int normalised) { VisBuffer sample; 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); visual_buffer_init_allocate (&sample, samplelen, visual_buffer_destroyer_free); if (visual_audio_get_sample (audio, &sample, channelid) == VISUAL_OK) visual_audio_get_spectrum_for_sample (buffer, &sample, normalised); else visual_buffer_fill (buffer, 0); visual_object_unref (VISUAL_OBJECT (&sample)); 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; }