/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2021 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * * projectM-sdl * This is an implementation of projectM using libSDL2 * * main.cpp * Authors: Created by Mischa Spiegelmock on 6/3/15. * * * RobertPancoast77@gmail.com : * experimental Stereoscopic SBS driver functionality * WASAPI looback implementation * * */ #include "pmSDL.hpp" static int mainLoop(void *userData) { projectMSDL **appRef = (projectMSDL **)userData; auto app = *appRef; #if UNLOCK_FPS auto start = startUnlockedFPSCounter(); #endif // frame rate limiter int fps = app->settings()->fps; if (fps <= 0) fps = 60; const Uint32 frame_delay = 1000/fps; Uint32 last_time = SDL_GetTicks(); // loop while (! app->done) { // render app->renderFrame(); if (app->fakeAudio) app->addFakePCM(); processLoopbackFrame(app); #if UNLOCK_FPS advanceUnlockedFPSCounterFrame(start); #else app->pollEvent(); Uint32 elapsed = SDL_GetTicks() - last_time; if (elapsed < frame_delay) SDL_Delay(frame_delay - elapsed); last_time = SDL_GetTicks(); #endif } return 0; } int main(int argc, char *argv[]) { projectMSDL *app = setupSDLApp(); int status = mainLoop(&app); // SDL_Thread *mainLoopThread; // int threadReturnValue; // // mainLoopThread = SDL_CreateThread(mainLoop, "MainLoop", &app); // // if (NULL == mainLoopThread) { // printf("SDL_CreateThread failed: %s\n", SDL_GetError()); // return PROJECTM_ERROR; // } else { // SDL_WaitThread(mainLoopThread, &threadReturnValue); // printf("Thread returned value: %d\n", threadReturnValue); // } // Write back config with current app settings (if we loaded from a config file to begin with) std::string configFilePath = getConfigFilePath(DATADIR_PATH); if (!configFilePath.empty()) { projectm_write_config(configFilePath.c_str(), app->settings()); } // cleanup SDL_GL_DeleteContext(app->glCtx); #if !FAKE_AUDIO if (!app->wasapi) // not currently using WASAPI, so we need to endAudioCapture. app->endAudioCapture(); #endif delete app; return status; }