void *projectM::thread_func(void *vptr_args) { // printf("in thread: %f\n", timeKeeper->PresetProgressB()); while (true) { if (!worker_sync.wait_for_work()) return NULL; evaluateSecondPreset(); worker_sync.finished_work(); } }
void *projectM::thread_func(void *vptr_args) { pthread_mutex_lock( &mutex ); // printf("in thread: %f\n", timeKeeper->PresetProgressB()); while (true) { pthread_cond_wait( &condition, &mutex ); if(!running) { pthread_mutex_unlock( &mutex ); return NULL; } evaluateSecondPreset(); } }
void projectM::renderFrame() { #ifdef SYNC_PRESET_SWITCHES pthread_mutex_lock(&preset_mutex); #endif #ifdef DEBUG char fname[1024]; FILE *f = NULL; int index = 0; int x, y; #endif timeKeeper->UpdateTimers(); /* if (timeKeeper->IsSmoothing()) { printf("Smoothing A:%f, B:%f, S:%f\n", timeKeeper->PresetProgressA(), timeKeeper->PresetProgressB(), timeKeeper->SmoothRatio()); } else { printf(" A:%f\n", timeKeeper->PresetProgressA()); }*/ mspf= ( int ) ( 1000.0/ ( float ) settings().fps ); //milliseconds per frame /// @bug who is responsible for updating this now?" pipelineContext().time = timeKeeper->GetRunningTime(); pipelineContext().frame = timeKeeper->PresetFrameA(); pipelineContext().progress = timeKeeper->PresetProgressA(); //m_activePreset->Render(*beatDetect, pipelineContext()); beatDetect->detectFromSamples(); //m_activePreset->evaluateFrame(); //if the preset isn't locked and there are more presets if ( renderer->noSwitch==false && !m_presetChooser->empty() ) { //if preset is done and we're not already switching if ( timeKeeper->PresetProgressA()>=1.0 && !timeKeeper->IsSmoothing()) { if (settings().shuffleEnabled) selectRandom(false); else selectNext(false); } else if ((beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) && timeKeeper->CanHardCut()) { // printf("Hard Cut\n"); if (settings().shuffleEnabled) selectRandom(true); else selectNext(true); } } if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() <= 1.0 && !m_presetChooser->empty() ) { // printf("start thread\n"); assert ( m_activePreset2.get() ); #ifdef USE_THREADS pthread_cond_signal(&condition); pthread_mutex_unlock( &mutex ); #endif m_activePreset->Render(*beatDetect, pipelineContext()); #ifdef USE_THREADS pthread_mutex_lock( &mutex ); #else evaluateSecondPreset(); #endif Pipeline pipeline; pipeline.setStaticPerPixel(settings().meshX, settings().meshY); assert(_matcher); PipelineMerger::mergePipelines( m_activePreset->pipeline(), m_activePreset2->pipeline(), pipeline, _matcher->matchResults(), *_merger, timeKeeper->SmoothRatio()); renderer->RenderFrame(pipeline, pipelineContext()); pipeline.drawables.clear(); /* while (!pipeline.drawables.empty()) { delete(pipeline.drawables.back()); pipeline.drawables.pop_back(); } */ } else { if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() > 1.0 ) { //printf("End Smooth\n"); m_activePreset = m_activePreset2; timeKeeper->EndSmoothing(); } //printf("Normal\n"); m_activePreset->Render(*beatDetect, pipelineContext()); renderer->RenderFrame (m_activePreset->pipeline(), pipelineContext()); } // std::cout<< m_activePreset->absoluteFilePath()<<std::endl; // renderer->presetName = m_activePreset->absoluteFilePath(); count++; #ifndef WIN32 /** Frame-rate limiter */ /** Compute once per preset */ if ( this->count%100==0 ) { this->renderer->realfps=100.0/ ( ( getTicks ( &timeKeeper->startTime )-this->fpsstart ) /1000 ); this->fpsstart=getTicks ( &timeKeeper->startTime ); } int timediff = getTicks ( &timeKeeper->startTime )-this->timestart; if ( timediff < this->mspf ) { // printf("%s:",this->mspf-timediff); int sleepTime = ( unsigned int ) ( this->mspf-timediff ) * 1000; // DWRITE ( "usleep: %d\n", sleepTime ); if ( sleepTime > 0 && sleepTime < 100000 ) { if ( usleep ( sleepTime ) != 0 ) {}} } this->timestart=getTicks ( &timeKeeper->startTime ); #endif /** !WIN32 */ #ifdef SYNC_PRESET_SWITCHES pthread_mutex_unlock(&preset_mutex); #endif }
DLLEXPORT void projectM::renderFrame() { #ifdef DEBUG char fname[1024]; FILE *f = NULL; int index = 0; int x, y; #endif timeKeeper->UpdateTimers(); //printf("A:%f, B:%f, S:%f\n", timeKeeper->PresetProgressA(), timeKeeper->PresetProgressB(), timeKeeper->SmoothRatio()); mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); //milliseconds per frame setupPresetInputs(&m_activePreset->presetInputs()); m_activePreset->presetInputs().frame = timeKeeper->PresetFrameA(); m_activePreset->presetInputs().progress= timeKeeper->PresetProgressA(); beatDetect->detectFromSamples(); //m_activePreset->evaluateFrame(); if ( renderer->noSwitch==false && !m_presetChooser->empty() ) { if ( timeKeeper->PresetProgressA()>=1.0 && !timeKeeper->IsSmoothing()) { timeKeeper->StartSmoothing(); // printf("Start Smooth\n"); // if(timeKeeper->IsSmoothing())printf("Confirmed\n"); switchPreset(m_activePreset2, &m_activePreset->presetInputs() == &presetInputs ? presetInputs2 : presetInputs, &m_activePreset->presetOutputs() == &presetOutputs ? presetOutputs2 : presetOutputs); presetSwitchedEvent(false, **m_presetPos); } else if ( ( beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) && timeKeeper->CanHardCut() ) { // printf("Hard Cut\n"); switchPreset(m_activePreset, presetInputs, presetOutputs); timeKeeper->StartPreset(); presetSwitchedEvent(true, **m_presetPos); } } if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() <= 1.0 && !m_presetChooser->empty() ) { // printf("start thread\n"); assert ( m_activePreset.get() ); #ifdef USE_THREADS pthread_cond_signal(&condition); pthread_mutex_unlock( &mutex ); #endif m_activePreset->evaluateFrame(); renderer->PerPixelMath ( &m_activePreset->presetOutputs(), &presetInputs ); renderer->WaveformMath ( &m_activePreset->presetOutputs(), &presetInputs, true ); #ifdef USE_THREADS pthread_mutex_lock( &mutex ); #else evaluateSecondPreset(); #endif PresetMerger::MergePresets ( m_activePreset->presetOutputs(),m_activePreset2->presetOutputs(),timeKeeper->SmoothRatio(),presetInputs.gx, presetInputs.gy ); } else { if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() > 1.0 ) { //printf("End Smooth\n"); m_activePreset = m_activePreset2; timeKeeper->EndSmoothing(); } //printf("Normal\n"); m_activePreset->evaluateFrame(); renderer->PerPixelMath ( &m_activePreset->presetOutputs(), &presetInputs ); renderer->WaveformMath ( &m_activePreset->presetOutputs(), &presetInputs, false ); } // std::cout<< m_activePreset->absoluteFilePath()<<std::endl; // renderer->presetName = m_activePreset->absoluteFilePath(); renderer->RenderFrame ( &m_activePreset->presetOutputs(), &presetInputs ); count++; #ifndef WIN32 /** Frame-rate limiter */ /** Compute once per preset */ if ( this->count%100==0 ) { this->renderer->realfps=100.0/ ( ( getTicks ( &timeKeeper->startTime )-this->fpsstart ) /1000 ); this->fpsstart=getTicks ( &timeKeeper->startTime ); } int timediff = getTicks ( &timeKeeper->startTime )-this->timestart; if ( timediff < this->mspf ) { // printf("%s:",this->mspf-timediff); int sleepTime = ( unsigned int ) ( this->mspf-timediff ) * 1000; // DWRITE ( "usleep: %d\n", sleepTime ); if ( sleepTime > 0 && sleepTime < 100000 ) { if ( usleep ( sleepTime ) != 0 ) {}} } this->timestart=getTicks ( &timeKeeper->startTime ); #endif /** !WIN32 */ }
Pipeline * projectM::renderFrameOnlyPass1(Pipeline *pPipeline) /*pPipeline is a pointer to a Pipeline for use in pass 2. returns the pointer if it was used, else returns NULL */ { #ifdef SYNC_PRESET_SWITCHES pthread_mutex_lock(&preset_mutex); #endif #ifdef DEBUG char fname[1024]; FILE *f = NULL; int index = 0; int x, y; #endif timeKeeper->UpdateTimers(); /* if (timeKeeper->IsSmoothing()) { printf("Smoothing A:%f, B:%f, S:%f\n", timeKeeper->PresetProgressA(), timeKeeper->PresetProgressB(), timeKeeper->SmoothRatio()); } else { printf(" A:%f\n", timeKeeper->PresetProgressA()); }*/ mspf= ( int ) ( 1000.0/ ( float ) settings().fps ); //milliseconds per frame /// @bug who is responsible for updating this now?" pipelineContext().time = timeKeeper->GetRunningTime(); pipelineContext().presetStartTime = timeKeeper->PresetTimeA(); pipelineContext().frame = timeKeeper->PresetFrameA(); pipelineContext().progress = timeKeeper->PresetProgressA(); beatDetect->detectFromSamples(); //m_activePreset->evaluateFrame(); //if the preset isn't locked and there are more presets if ( renderer->noSwitch==false && !m_presetChooser->empty() ) { //if preset is done and we're not already switching if ( timeKeeper->PresetProgressA()>=1.0 && !timeKeeper->IsSmoothing()) { if (settings().shuffleEnabled) selectRandom(false); else selectNext(false); } else if ((beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) && timeKeeper->CanHardCut()) { // printf("Hard Cut\n"); if (settings().shuffleEnabled) selectRandom(true); else selectNext(true); } } if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() <= 1.0 && !m_presetChooser->empty() ) { // printf("start thread\n"); assert ( m_activePreset2.get() ); #ifdef USE_THREADS worker_sync.wake_up_bg(); #endif m_activePreset->Render(*beatDetect, pipelineContext()); #ifdef USE_THREADS worker_sync.wait_for_bg_to_finish(); #else evaluateSecondPreset(); #endif pPipeline->setStaticPerPixel(settings().meshX, settings().meshY); assert(_matcher); PipelineMerger::mergePipelines( m_activePreset->pipeline(), m_activePreset2->pipeline(), *pPipeline, _matcher->matchResults(), *_merger, timeKeeper->SmoothRatio()); renderer->RenderFrameOnlyPass1(*pPipeline, pipelineContext()); return pPipeline; } else { if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() > 1.0 ) { //printf("End Smooth\n"); m_activePreset = std::move(m_activePreset2); timeKeeper->EndSmoothing(); } //printf("Normal\n"); m_activePreset->Render(*beatDetect, pipelineContext()); renderer->RenderFrameOnlyPass1 (m_activePreset->pipeline(), pipelineContext()); return NULL; // indicating no transition } // std::cout<< m_activePreset->absoluteFilePath()<<std::endl; // renderer->presetName = m_activePreset->absoluteFilePath(); }