blob: d2b6bddd059d93abc932e0ba66b0131c6c1c0eaf [file] [log] [blame]
* projectM -- Milkdrop-esque visualisation SDK
* Copyright (C)2003-2007 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
* 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
* $Id: projectM.hpp,v 2005/12/23 18:05:11 psperl Exp $
* Encapsulation of ProjectM engine
* $Log$
#ifdef WIN32
#include "win32-dirent.h"
#include <dirent.h>
#endif /** WIN32 */
#include <cmath>
#include <cstdio>
#include <string>
#include <cstdlib>
#ifndef WIN32
#include <unistd.h>
#include <sys/types.h>
#ifdef MACOS
//#include <MacWindows.h>
//#include <gl.h>
//#include <glu.h>
#ifdef WIN32
#include <windows.h>
#endif /** WIN32 */
#endif /** MACOS */
#ifdef WIN322
#define inline
#endif /** WIN32 */
#include "dlldefs.h"
#include "event.h"
#include "fatal.h"
class PipelineContext;
#include "PCM.hpp"
class BeatDetect;
class PCM;
class Func;
class Renderer;
class Preset;
class PresetIterator;
class PresetChooser;
class PresetLoader;
class TimeKeeper;
class Pipeline;
class RenderItemMatcher;
class MasterRenderItemMerge;
#include "Common.hpp"
#include <memory>
#ifdef WIN32
#pragma warning (disable:4244)
#pragma warning (disable:4305)
#endif /** WIN32 */
#ifdef MACOS2
#define inline
#define PROJECTM_VERSION "2.0.00"
#define PROJECTM_TITLE "projectM 2.0.00"
/** Interface types */
typedef enum {
} interface_t;
/// A functor class that allows users of this library to specify random preset behavior
class RandomizerFunctor {
RandomizerFunctor(PresetChooser & chooser) ;
virtual ~RandomizerFunctor();
virtual double operator() (int index);
const PresetChooser & m_chooser;
class DLLEXPORT projectM
static const int FLAG_NONE = 0;
static const int FLAG_DISABLE_PLAYLIST_LOAD = 1 << 0;
struct Settings {
int meshX;
int meshY;
int fps;
int textureSize;
int windowWidth;
int windowHeight;
std::string presetURL;
std::string titleFontURL;
std::string menuFontURL;
int smoothPresetDuration;
int presetDuration;
float beatSensitivity;
bool aspectCorrection;
float easterEgg;
bool shuffleEnabled;
bool softCutRatingsEnabled;
projectM(std::string config_file, int flags = FLAG_NONE);
projectM(Settings settings, int flags = FLAG_NONE);
//DLLEXPORT projectM(int gx, int gy, int fps, int texsize, int width, int height,std::string preset_url,std::string title_fonturl, std::string title_menuurl);
void projectM_resetGL( int width, int height );
void projectM_resetTextures();
void projectM_setTitle( std::string title );
void renderFrame();
unsigned initRenderToTexture();
void key_handler (projectMEvent event,
projectMKeycode keycode,
projectMModifier modifier);
virtual ~projectM();
void changeTextureSize(int size);
void changePresetDuration(int seconds);
const Settings & settings() const {
return _settings;
/// Writes a settings configuration to the specified file
static bool writeConfig(const std::string & configFile, const Settings & settings);
/// Sets preset iterator position to the passed in index
void selectPresetPosition(unsigned int index);
/// Plays a preset immediately
void selectPreset(unsigned int index, bool hardCut = true);
/// Removes a preset from the play list. If it is playing then it will continue as normal until next switch
void removePreset(unsigned int index);
/// Sets the randomization functor. If set to null, the traversal will move in order according to the playlist
void setRandomizer(RandomizerFunctor * functor);
/// Tell projectM to play a particular preset when it chooses to switch
/// If the preset is locked the queued item will be not switched to until the lock is released
/// Subsequent calls to this function effectively nullifies previous calls.
void queuePreset(unsigned int index);
/// Returns true if a preset is queued up to play next
bool isPresetQueued() const;
/// Removes entire playlist, The currently loaded preset will end up sticking until new presets are added
void clearPlaylist();
/// Turn on or off a lock that prevents projectM from switching to another preset
void setPresetLock(bool isLocked);
/// Returns true if the active preset is locked
bool isPresetLocked() const;
/// Returns index of currently active preset. In the case where the active
/// preset was removed from the playlist, this function will return the element
/// before active preset (thus the next in order preset is invariant with respect
/// to the removal)
bool selectedPresetIndex(unsigned int & index) const;
/// Add a preset url to the play list. Appended to bottom. Returns index of preset
unsigned int addPresetURL (const std::string & presetURL,
const std::string & presetName,
const RatingList & ratingList);
/// Insert a preset url to the play list at the suggested index.
void insertPresetURL (unsigned int index,
const std::string & presetURL,
const std::string & presetName,
const RatingList & ratingList);
/// Returns true if the selected preset position points to an actual preset in the
/// currently loaded playlist
bool presetPositionValid() const;
/// Returns the url associated with a preset index
std::string getPresetURL(unsigned int index) const;
/// Returns the preset name associated with a preset index
std::string getPresetName ( unsigned int index ) const;
void changePresetName ( unsigned int index, std::string name );
/// Returns the rating associated with a preset index
int getPresetRating (unsigned int index, const PresetRatingType ratingType) const;
void changePresetRating (unsigned int index, int rating, const PresetRatingType ratingType);
/// Returns the size of the play list
unsigned int getPlaylistSize() const;
void evaluateSecondPreset();
inline void setShuffleEnabled(bool value)
_settings.shuffleEnabled = value;
/// idea@ call a virtualfunction shuffleChanged()
inline bool isShuffleEnabled() const
return _settings.shuffleEnabled;
/// Occurs when active preset has switched. Switched to index is returned
virtual void presetSwitchedEvent(bool isHardCut, unsigned int index) const {};
virtual void shuffleEnabledValueChanged(bool isEnabled) const {};
/// Occurs whenever preset rating has changed via changePresetRating() method
virtual void presetRatingChanged(unsigned int index, int rating, PresetRatingType ratingType) const {};
inline PCM * pcm() {
return _pcm;
void *thread_func(void *vptr_args);
PipelineContext & pipelineContext() { return *_pipelineContext; }
PipelineContext & pipelineContext2() { return *_pipelineContext2; }
void selectPrevious(const bool);
void selectNext(const bool);
void selectRandom(const bool);
PCM * _pcm;
double sampledPresetDuration();
BeatDetect * beatDetect;
Renderer *renderer;
PipelineContext * _pipelineContext;
PipelineContext * _pipelineContext2;
Settings _settings;
int wvw; //windowed dimensions
int wvh;
/** Timing information */
int mspf;
int timed;
int timestart;
int count;
float fpsstart;
void readConfig(const std::string &configFile);
void readSettings(const Settings &settings);
void projectM_init(int gx, int gy, int fps, int texsize, int width, int height);
void projectM_reset();
void projectM_initengine();
void projectM_resetengine();
/// Initializes preset loading / management libraries
int initPresetTools(int gx, int gy);
/// Deinitialize all preset related tools. Usually done before projectM cleanup
void destroyPresetTools();
void default_key_handler( projectMEvent event, projectMKeycode keycode );
/// The current position of the directory iterator
PresetIterator * m_presetPos;
/// Required by the preset chooser. Manages a loaded preset directory
PresetLoader * m_presetLoader;
/// Provides accessor functions to choose presets
PresetChooser * m_presetChooser;
/// Currently loaded preset
std::auto_ptr<Preset> m_activePreset;
/// Destination preset when smooth preset switching
std::auto_ptr<Preset> m_activePreset2;
TimeKeeper *timeKeeper;
int m_flags;
RenderItemMatcher * _matcher;
MasterRenderItemMerge * _merger;
bool running;
Pipeline* currentPipe;
void switchPreset(std::auto_ptr<Preset> & targetPreset);