Skip to content

Commit f36c0c0

Browse files
SvenSven
authored andcommitted
A web service to remotely control the presets over HTTP from e.g. a smartphone. Screenshot:
http://sven.killig.de/projectM/HTTPRemoteControl.png Usage: [HTTP_PORT=<HTTP port> [HTTP_NAME=<HTML title>]] ./projectM-jack Requires LibQxt. Unfortunately, cmake doesn't come with a FindQxt.cmake yet. I modified the one available at http://dev.libqxt.org/libqxt/src in the folder "features" to work with Ubuntu 12.10: http://sven.killig.de/projectM/FindQxt.cmake Put it to /usr/share/cmake-2.8/Modules I first tried to start my web service in projectM-qt, but somehow it didn't work, so for now it's only available in projectM-jack. Perhaps someone more experienced with Q[x]t can fix this.
1 parent a357000 commit f36c0c0

File tree

4 files changed

+131
-4
lines changed

4 files changed

+131
-4
lines changed

src/projectM-jack/CMakeLists.txt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ INCLUDE(cmake/CPack-projectM.cmake)
88

99
OPTION(QT_JACK_SUPPORT "Enable Qt4 GUI Support for the projectM jack port" ON)
1010
OPTION(BUILD_PROJECTM_JACK_STATIC "Build a binary that only depends on jack and stnadard MACOSX libraries" OFF)
11+
OPTION(HTTP_REMOTE_CONTROL "Enable HTTP remote control" OFF)
1112

1213
if (QT_JACK_SUPPORT)
1314

@@ -55,24 +56,40 @@ MESSAGE( "JACK is NOT found. Please install jack from http://www.jackaudio.org."
5556
endif(JACK_FOUND)
5657

5758

59+
if(HTTP_REMOTE_CONTROL)
60+
set(projectM_jack_SRCS
61+
qprojectM-jack.cpp ConfigFile.h ConfigFile.cpp HTTPRemoteControl.cpp
62+
)
63+
else(HTTP_REMOTE_CONTROL)
5864
set(projectM_jack_SRCS
5965
qprojectM-jack.cpp ConfigFile.h ConfigFile.cpp
6066
)
67+
endif(HTTP_REMOTE_CONTROL)
6168

69+
if(HTTP_REMOTE_CONTROL)
6270
set(projectM_jack_MOC_HDRS
63-
71+
HTTPRemoteControl.h
6472
)
73+
endif(HTTP_REMOTE_CONTROL)
6574

6675

6776
# After this call, foo_MOC_SRCS = moc_Class1.cxx moc_Class2.cxx moc_Class3.cxx.
68-
qt4_wrap_cpp(projectM_jack_MOC_SRCS ${projectM_MOC_HDRS})
77+
qt4_wrap_cpp(projectM_jack_MOC_SRCS ${projectM_jack_MOC_HDRS})
6978

7079

7180
ADD_DEFINITIONS(-DLINUX)
7281
ADD_DEFINITIONS(${QT_DEFINITIONS})
7382
ADD_DEFINITIONS(-DQT_NO_DEBUG)
7483

7584

85+
if(HTTP_REMOTE_CONTROL)
86+
ADD_DEFINITIONS(-DHTTP_REMOTE_CONTROL)
87+
SET(QXT_USE_QXTWEB TRUE)
88+
SET(QXT_USE_QXTCORE TRUE)
89+
find_package(Qxt REQUIRED)
90+
endif(HTTP_REMOTE_CONTROL)
91+
92+
7693
if (${CMAKE_PROJECT_NAME} MATCHES "projectM-complete")
7794
set(PROJECTM_INCLUDE ${PROJECTM_ROOT_SOURCE_DIR}/libprojectM ${PROJECTM_ROOT_SOURCE_DIR}/projectM-qt)
7895
set(PROJECTM_LINK ${PROJECTM_ROOT_BINARY_DIR}/libprojectM ${PROJECTM_ROOT_BINARY_DIR}/projectM-qt)
@@ -84,7 +101,7 @@ elseif (${CMAKE_PROJECT_NAME} MATCHES ${PROJECT_NAME})
84101
endif (${CMAKE_PROJECT_NAME} MATCHES "projectM-complete")
85102

86103

87-
INCLUDE_DIRECTORIES(${PROJECTM_INCLUDE} ${JACK_INCLUDEDIR} ${SDL_INCLUDE_DIR} ${QT_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTOPENGL_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR})
104+
INCLUDE_DIRECTORIES(${PROJECTM_INCLUDE} ${JACK_INCLUDEDIR} ${SDL_INCLUDE_DIR} ${QT_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTOPENGL_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QXT_INCLUDE_DIRS} ${QT_QTNETWORK_INCLUDE_DIR})
88105

89106
LINK_DIRECTORIES(${PROJECTM_LINK})
90107

@@ -104,7 +121,7 @@ else (BUILD_PROJECTM_JACK_STATIC)
104121
SET(PACKAGED_LIBRARIES projectM-qt projectM)
105122
endif (BUILD_PROJECTM_JACK_STATIC)
106123

107-
TARGET_LINK_LIBRARIES(projectM-jack ${PACKAGED_LIBRARIES} jack ${QT_QTGUI_LIBRARIES} ${QT_QTOPENGL_LIBRARIES} ${QT_QTCORE_LIBRARIES} ${QT_LIBRARIES} ${OPENGL_LIBRARIES} ${QT_QTXML_LIBRARIES})
124+
TARGET_LINK_LIBRARIES(projectM-jack ${PACKAGED_LIBRARIES} jack ${QT_QTGUI_LIBRARIES} ${QT_QTOPENGL_LIBRARIES} ${QT_QTCORE_LIBRARIES} ${QT_LIBRARIES} ${OPENGL_LIBRARIES} ${QT_QTXML_LIBRARIES} ${QXT_LIBRARIES})
108125

109126
INSTALL(TARGETS projectM-jack DESTINATION ${CMAKE_INSTALL_PREFIX}/bin )
110127
install(FILES "projectM-jack.desktop" DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#include "HTTPRemoteControl.h"
2+
#include <sstream>
3+
4+
#define HARDCUT true
5+
6+
void HTTPRemoteControl::selectPrevious(QxtWebRequestEvent* event) {
7+
postEvent(new QxtWebPageEvent(event->sessionID, event->requestID, "selectPrevious"));
8+
parent3->selectPrevious(HARDCUT);
9+
}
10+
11+
void HTTPRemoteControl::selectNext(QxtWebRequestEvent* event) {
12+
postEvent(new QxtWebPageEvent(event->sessionID, event->requestID, "selectNext"));
13+
parent3->selectNext(HARDCUT);
14+
}
15+
16+
void HTTPRemoteControl::selectRandom(QxtWebRequestEvent* event) {
17+
postEvent(new QxtWebPageEvent(event->sessionID, event->requestID, "selectRandom"));
18+
parent3->selectRandom(HARDCUT);
19+
}
20+
21+
void HTTPRemoteControl::index(QxtWebRequestEvent* event) {
22+
QString s="";
23+
std::stringstream convert, convert2;
24+
s=s+"<html>";
25+
s=s+"<head><title>"+qgetenv("HTTP_NAME")+"</title><base target='datatransfer'></head>";
26+
s=s+"<body bgcolor='black' text='white' link='#9999FF' alink='#AAAAFF' vlink='#EE88EE'>";
27+
s=s+"<iframe name='datatransfer' style='display:none'></iframe>";
28+
s=s+"<a href='/selectPrevious'>&uarr;</a> <a href='/selectNext'>&darr;</a> <a href='/selectRandom'>Random</a> ";
29+
for(int i=1; i<=6; i++) {
30+
convert.str("");
31+
convert << i;
32+
s=s+"<a href='/changePresetRating/"+convert.str().c_str()+"'>"+convert.str().c_str()+"</a> ";
33+
}
34+
s=s+"<p>";
35+
for(int i=0; i<parent3->getPlaylistSize(); i++) {
36+
convert.str("");
37+
convert << i;
38+
std::string n=parent3->getPresetName(i);
39+
convert2.str("");
40+
convert2 << parent3->getPresetRating(i, FIRST_RATING_TYPE);
41+
s=s+"<a href='/selectPresetPosition/"+convert.str().c_str()+"'>"+n.substr(0, n.find(".milk")).c_str()+" ["+convert2.str().c_str()+"]</a><br>";
42+
}
43+
s=s+"</body>";
44+
s=s+"</html>";
45+
postEvent(new QxtWebPageEvent(event->sessionID, event->requestID, s.toUtf8()));
46+
}
47+
48+
void HTTPRemoteControl::selectPresetPosition(QxtWebRequestEvent* event, QString a) {
49+
postEvent(new QxtWebPageEvent(event->sessionID, event->requestID, "selectPresetPosition('"+a.toUtf8()+"')"));
50+
parent3->selectPreset(a.toUInt(), HARDCUT);
51+
}
52+
53+
void HTTPRemoteControl::changePresetRating(QxtWebRequestEvent* event, QString a) {
54+
postEvent(new QxtWebPageEvent(event->sessionID, event->requestID, "changePresetRating('"+a.toUtf8()+"')"));
55+
unsigned int index;
56+
parent3->selectedPresetIndex(index);
57+
parent3->changePresetRating(index, a.toUInt(), FIRST_RATING_TYPE);
58+
parent3->selectNext(HARDCUT);
59+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#ifndef HTTPREMOTECONTROL
2+
#define HTTPREMOTECONTROL
3+
4+
#include <QxtHttpServerConnector>
5+
#include <QxtHttpSessionManager>
6+
#include <QxtWebSlotService>
7+
#include <QxtWebPageEvent>
8+
#include "qprojectm.hpp"
9+
10+
class HTTPRemoteControl : public QxtWebSlotService {
11+
Q_OBJECT
12+
QProjectM * parent3;
13+
public:
14+
HTTPRemoteControl(QxtAbstractWebSessionManager * sm, QProjectM * parent2): QxtWebSlotService(sm, 0) {
15+
parent3=parent2;
16+
printf("HTTPRemoteControl()\n"); fflush(stdout);
17+
}
18+
public slots:
19+
void selectPrevious(QxtWebRequestEvent*);
20+
void selectNext(QxtWebRequestEvent*);
21+
void selectRandom(QxtWebRequestEvent*);
22+
void index(QxtWebRequestEvent*);
23+
void selectPresetPosition(QxtWebRequestEvent*, QString);
24+
void changePresetRating(QxtWebRequestEvent*, QString);
25+
};
26+
27+
#endif

src/projectM-jack/qprojectM-jack.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
#include <sys/stat.h> // for mkdir
3535
#include <jack/jack.h>
3636

37+
#ifdef HTTP_REMOTE_CONTROL
38+
#include "HTTPRemoteControl.h"
39+
#endif
40+
3741
#define QPROJECTM_JACK_CONFIG_FILE "/config.inp"
3842

3943
std::string read_config();
@@ -323,6 +327,26 @@ int main (int argc, char **argv) {
323327
}
324328

325329
free (ports);
330+
331+
332+
#ifdef HTTP_REMOTE_CONTROL
333+
uint port=qgetenv("HTTP_PORT").toUInt();
334+
QxtHttpServerConnector connector;
335+
336+
QxtHttpSessionManager session;
337+
printf("session.setPort(%i\n", port); fflush(stdout);
338+
session.setPort(port);
339+
session.setConnector(&connector);
340+
341+
HTTPRemoteControl s1(&session, mainWindow->qprojectM());
342+
session.setStaticContentService ( &s1);
343+
344+
printf("session.start()\n"); fflush(stdout);
345+
if(port>0) { // I think it didn't work when the conditional was further up
346+
session.start();
347+
}
348+
#endif
349+
326350

327351
//----------------------------------END
328352

0 commit comments

Comments
 (0)