summaryrefslogtreecommitdiffstats
path: root/abs/core/projectm-complete
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core/projectm-complete')
-rw-r--r--abs/core/projectm-complete/PKGBUILD9
-rw-r--r--abs/core/projectm-complete/error-handling.patch308
2 files changed, 315 insertions, 2 deletions
diff --git a/abs/core/projectm-complete/PKGBUILD b/abs/core/projectm-complete/PKGBUILD
index e6a975d..59fd26f 100644
--- a/abs/core/projectm-complete/PKGBUILD
+++ b/abs/core/projectm-complete/PKGBUILD
@@ -2,7 +2,7 @@
pkgname=projectm-complete
pkgver=2.0.1
-pkgrel=2
+pkgrel=3
pkgdesc="A music visualizer which uses 3D accelerated iterative image based rendering (all components)"
arch=('i686' 'x86_64')
url="http://projectm.sourceforge.net/"
@@ -12,16 +12,21 @@ provides=('projectm' 'projectm-qt' 'projectm-libvisual' 'projectm-libvisual-alsa
conflicts=('projectm' 'projectm-qt' 'projectm-libvisual' 'projectm-libvisual-alsa')
makedepends=('pkgconfig' 'xproto' 'cmake')
source=("http://sourceforge.net/projects/projectm/files/2.0.1/projectM-complete-2.0.1-Source.tar.gz/download"
- "libprojectm-2.0.1-pcfix.patch")
+ "libprojectm-2.0.1-pcfix.patch"
+ "error-handling.patch")
md5sums=('9d32fa1357622c7a945a2e10620ee945' '9e2d9b03748fd6511181366b8d025425')
build() {
cd $srcdir/projectM-complete-$pkgver-Source/ || return 1
patch -p1 -i ../libprojectm-2.0.1-pcfix.patch
+ patch -p1 -i ../error-handling.patch
cd src
cmake -D CMAKE_INSTALL_PREFIX=/usr -D CMAKE_BUILD_TYPE=Release -D USE_FBO=OFF . || return 1
make all || return 1
make DESTDIR=$pkgdir install || return 1
rm -rf $srcdir/projectM-complete-$pkgver-Source
}
+md5sums=('9d32fa1357622c7a945a2e10620ee945'
+ '9e2d9b03748fd6511181366b8d025425'
+ '9b6e5a862603e7b9e45bfc51313c6a04')
diff --git a/abs/core/projectm-complete/error-handling.patch b/abs/core/projectm-complete/error-handling.patch
new file mode 100644
index 0000000..4154884
--- /dev/null
+++ b/abs/core/projectm-complete/error-handling.patch
@@ -0,0 +1,308 @@
+Description: Error handling
+ * Guard against reinitializing the builtin milkdrop functions.
+ Hides a deeper issue where something is double loading the preset factories, most
+ likely.
+ * Playlist file / directory error handling fixes, resize playlist refresh fix
+
+Forwarded: yes
+Author: Carmelo Piccione <carmelo.piccione@gmail.com>
+Last-Update: 2010-07-29
+--- a/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.cpp
++++ b/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.cpp
+@@ -29,7 +29,7 @@
+ /* Create new function */
+ func = new Func(name, func_ptr, num_args);
+
+- if (func == NULL)
++ if (func == 0)
+ return PROJECTM_OUTOFMEM_ERROR;
+
+ retval = insert_func( func );
+@@ -115,12 +115,18 @@
+ return PROJECTM_SUCCESS;
+ }
+
++volatile bool BuiltinFuncs::initialized = false;
+
+ /* Initialize the builtin function database.
+ Should only be necessary once */
+ int BuiltinFuncs::init_builtin_func_db() {
+ int retval;
+
++ if (initialized) {
++ return 0;
++ } else
++ initialized = true;
++
+ retval = load_all_builtin_func();
+ return retval;
+ }
+@@ -134,7 +140,7 @@
+ traverse<TraverseFunctors::Delete<Func> >(builtin_func_tree);
+
+ builtin_func_tree.clear();
+-
++initialized = false;
+ return PROJECTM_SUCCESS;
+ }
+
+@@ -142,13 +148,24 @@
+ int BuiltinFuncs::insert_func( Func *func ) {
+
+ assert(func);
+- std::pair<std::map<std::string, Func*>::iterator, bool> inserteePair =
+- builtin_func_tree.insert(std::make_pair(std::string(func->getName()), func));
+
++ if (func == 0) {
++ std::cerr << "Received a null function object, ignoring...." << std::endl;
++ return PROJECTM_ERROR;
++ }
++
++// //std::cout << "inserting function " << func->getName() << std::endl;
++
++ const std::pair<std::string, Func*> pair = std::make_pair(std::string(func->getName()), func);
++
++ assert(pair.second);
++
++ const std::pair<std::map<std::string, Func*>::iterator, bool> inserteePair =
++ builtin_func_tree.insert(pair);
++
+ if (!inserteePair.second) {
+ std::cerr << "Failed to insert builtin function \"" << func->getName() << "\" into collection! Bailing..." << std::endl;
+ abort();
+-
+ }
+
+ return PROJECTM_SUCCESS;
+--- a/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.hpp
++++ b/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.hpp
+@@ -229,6 +229,7 @@
+ static Func *find_func( const std::string & name );
+ private:
+ static std::map<std::string, Func*> builtin_func_tree;
++ static volatile bool initialized;
+ };
+
+ #endif
+--- a/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.cpp
++++ b/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.cpp
+@@ -26,7 +26,7 @@
+ Eval::init_infix_ops();
+
+ _presetOutputs = createPresetOutputs(gx,gy);
+- _presetOutputs2 = createPresetOutputs(gx, gy);
++ _presetOutputs2 = createPresetOutputs(gx, gy);
+ }
+
+ MilkdropPresetFactory::~MilkdropPresetFactory() {
+@@ -37,13 +37,13 @@
+ BuiltinFuncs::destroy_builtin_func_db();
+ std::cerr << "[~MilkdropPresetFactory] delete preset out puts" << std::endl;
+ delete(_presetOutputs);
+- delete(_presetOutputs2);
++ delete(_presetOutputs2);
+ std::cerr << "[~MilkdropPresetFactory] done" << std::endl;
+
+ }
+
+ /* Reinitializes the engine variables to a default (conservative and sane) value */
+-void resetPresetOutputs(PresetOutputs *presetOutputs)
++void resetPresetOutputs(PresetOutputs * presetOutputs)
+ {
+
+ presetOutputs->zoom=1.0;
+--- a/src/libprojectM/PresetFactoryManager.cpp
++++ b/src/libprojectM/PresetFactoryManager.cpp
+@@ -20,7 +20,7 @@
+ #endif
+
+ #include <sstream>
+-PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0) {}
++PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0), initialized(false) {}
+
+ PresetFactoryManager::~PresetFactoryManager() {
+ for (std::vector<PresetFactory *>::iterator pos = _factoryList.begin();
+@@ -29,11 +29,20 @@
+ delete(*pos);
+ }
+
+-
++ initialized = false;
+ }
++
+ void PresetFactoryManager::initialize(int gx, int gy) {
+ _gx = gx;
+ _gy = gy;
++
++ if (!initialized) {
++ initialized = true;
++ } else {
++ std::cout << "already initialized " << std::endl;
++ return;
++ }
++
+ PresetFactory * factory;
+
+ #ifndef DISABLE_MILKDROP_PRESETS
+--- a/src/libprojectM/PresetFactoryManager.hpp
++++ b/src/libprojectM/PresetFactoryManager.hpp
+@@ -21,7 +21,7 @@
+ virtual ~PresetFactoryException() throw() {}
+ const std::string & message() const { return _message; }
+
+- private:
++ private:
+ std::string _message;
+ };
+
+@@ -54,6 +54,6 @@
+ mutable std::map<std::string, PresetFactory *> _factoryMap;
+ mutable std::vector<PresetFactory *> _factoryList;
+ void registerFactory(const std::string & extension, PresetFactory * factory);
+-
++ volatile bool initialized;
+ };
+ #endif
+--- a/src/libprojectM/projectM.cpp
++++ b/src/libprojectM/projectM.cpp
+@@ -222,7 +222,6 @@
+ projectM_init ( _settings.meshX, _settings.meshY, _settings.fps,
+ _settings.textureSize, _settings.windowWidth,_settings.windowHeight);
+
+-
+ _settings.beatSensitivity = beatDetect->beat_sensitivity = config.read<float> ( "Hard Cut Sensitivity", 10.0 );
+
+ if ( config.read ( "Aspect Correction", true ) )
+--- a/src/projectM-pulseaudio/QPulseAudioThread.cpp
++++ b/src/projectM-pulseaudio/QPulseAudioThread.cpp
+@@ -296,9 +296,7 @@
+ {
+ assert ( mainloop_api );
+ mainloop_api->quit ( mainloop_api, ret );
+- if (*s_qprojectM_MainWindowPtr)
+- delete(*s_qprojectM_MainWindowPtr);
+- *s_qprojectM_MainWindowPtr = 0;
++
+ }
+
+
+@@ -315,7 +313,8 @@
+ {
+ fprintf ( stderr, "pa_stream_peek() failed: %s\n", pa_strerror ( pa_context_errno ( context ) ) );
+ pulseQuit ( 1 );
+- return;
++ return
++;
+ }
+
+ if ((!s_qprojectM_MainWindowPtr) || (!*s_qprojectM_MainWindowPtr))
+@@ -352,16 +351,16 @@
+ switch ( pa_stream_get_state ( s ) )
+ {
+ case PA_STREAM_UNCONNECTED:
+-// qDebug() << "UNCONNECTED";
++ qDebug() << "UNCONNECTED";
+ break;
+ case PA_STREAM_CREATING:
+-// qDebug() << "CREATED";
++ qDebug() << "CREATED";
+ break;
+ case PA_STREAM_TERMINATED:
+-// qDebug() << "TERMINATED";
++ qDebug() << "TERMINATED";
+ break;
+ case PA_STREAM_READY:
+-// qDebug() << "READY";
++ qDebug() << "READY";
+ if ( verbose )
+ {
+ const pa_buffer_attr *a;
+--- a/src/projectM-qt/qplaylisttableview.hpp
++++ b/src/projectM-qt/qplaylisttableview.hpp
+@@ -93,14 +93,14 @@
+ }
+
+ inline void resizeEvent(QResizeEvent * event) {
+-
++ QTableView::resizeEvent(event);
+ emit(resized(event));
+ }
+
+ inline void mousePressEvent(QMouseEvent * event) {
+ QAbstractItemView::mousePressEvent(event);
+ if (event->button() == Qt::RightButton) {
+- emit(mousePressed(event, selectedIndexes()));
++ emit(mousePressed(event, selectedIndexes()));
+ }
+ else
+ ;
+--- a/src/projectM-qt/qprojectm_mainwindow.cpp
++++ b/src/projectM-qt/qprojectm_mainwindow.cpp
+@@ -98,7 +98,8 @@
+
+ connect(ui->tableView, SIGNAL(resized(QResizeEvent *)), this, SLOT(refreshHeaders(QResizeEvent*)));
+
+- connect(ui->tableView, SIGNAL(mousePressed(QMouseEvent*, const QModelIndexList &)), this, SLOT(popupPlaylistContextMenu(QMouseEvent*, const QModelIndexList &)));
++ connect(ui->tableView, SIGNAL(mousePressed(QMouseEvent*, const QModelIndexList &)), this,
++ SLOT(popupPlaylistContextMenu(QMouseEvent*, const QModelIndexList &)));
+
+ connect ( m_QProjectMWidget, SIGNAL ( projectM_Initialized(QProjectM*) ),
+ this, SLOT ( postProjectM_Initialize() ) );
+@@ -662,7 +663,7 @@
+ // Add 1 to skip the Name column
+ hHeader->setResizeMode (i+1, QHeaderView::ResizeToContents);
+ sizeTotal += hHeader->sectionSize(i+1);
+- }
++ }
+ hHeader->resizeSection(0, ui->tableView->size().width()-20-sizeTotal);
+
+
+@@ -883,11 +884,13 @@
+ QString url = m_QPlaylistFileDialog->selectedFiles() [0];
+
+
+- if ( !playlistModel->readPlaylist ( url ) ) {
++ const bool loadedOk = playlistModel->readPlaylist ( url );
++
++ if (!loadedOk) {
+ qDebug() << "could not open playlist";
+ url = QString();
+-
+- }
++ }
++
+ qDebug() << "url: " << url;
+ updatePlaylistUrl(url);
+
+--- a/src/projectM-qt/qprojectmwidget.hpp
++++ b/src/projectM-qt/qprojectmwidget.hpp
+@@ -22,6 +22,7 @@
+ #ifndef QPROJECTM_WIDGET_HPP
+ #define QPROJECTM_WIDGET_HPP
+
++#include <iostream>
+ #include "qprojectm.hpp"
+ #include <QGLWidget>
+ #include <QMutex>
+@@ -111,7 +112,7 @@
+
+ void resetProjectM()
+ {
+-
++ std::cout << "reseting" << std::endl;
+ qDebug() << "reset start";
+
+ emit ( projectM_BeforeDestroy() );
+@@ -246,8 +247,10 @@
+ void initializeGL()
+ {
+
+- this->m_projectM = new QProjectM ( m_config_file );
+- projectM_Initialized ( m_projectM );
++ if (m_projectM == 0) {
++ this->m_projectM = new QProjectM ( m_config_file );
++ projectM_Initialized ( m_projectM );
++ }
+ }
+
+ inline void paintGL()