OpenFrameworksで、マルチプロジェクション用QuickTimeプレイヤー

友人が展示に使いたいとの事で、
3面に3つのPCから映像を同期再生。

QuartzCompozerでOSCとか使えば一瞬だ。と思ったが、OSX10.2のマックがあるらしい。
そこで最近勉強中のopenFrameworksで作ってみようと。でも10.2で動くのかな?まあいいか。

以下、ソース。
マックデフォルトのファイル選択ウィンドウから、ファイルを選べたらいいな、と思ったのだが出来なかったため。いろいろ勝手に決めている。
ムービーファイルは"/Users/Shared/movie.mov"におく。
同期する2つのパソコンのIPアドレスは"192.168.1.20"と"192.168.1.21"。

メインパソコンのスペースバーで再生、停止。他の2つも同期する。
ひどいな。全然OF分からん。でもProcessing(Java)より、quicktimeは安定している。そりゃそうか。もっと勉強します。



testApp.h

#ifndef _TEST_APP
#define _TEST_APP

#include "ofMain.h"

#define OF_ADDON_USING_OFXOSC
#include "ofAddons.h"

#define HOST0 "localhost"
#define HOST1 "192.168.1.20"
#define HOST2 "192.168.1.21"
#define PORT 3333
#define MOVIE_FILE "/Users/Shared/movie.mov"


class testApp : public ofSimpleApp{
public:
	testApp();
	void setup();
	void update();
	void draw();

	void keyPressed  (int key);
	void mouseMoved(int x, int y );
	void mouseDragged(int x, int y, int button);
	void mousePressed(int x, int y, int button);
	void mouseReleased();

	
private:
	ofVideoPlayer	movie;
	ofxOscSender	oscS0;
	ofxOscSender	oscS1;
	ofxOscSender	oscS2;
	ofxOscReceiver	oscR;
	
	bool bPlaying;
	bool bMainPC;
	void play();
	void pause();
	void allPlay();
	void allPause();
	
};

#endif


testApp.cpp

#include "testApp.h"




//--------------------------------------------------------------
testApp::testApp() {
}

//--------------------------------------------------------------
void testApp::setup(){
	ofBackground(0, 0, 0);
	ofHideCursor();
	ofSetFrameRate(60);
	bPlaying = 0;
	bMainPC = 0;
	
	movie.loadMovie(MOVIE_FILE);
	movie.setLoopState(0x01);
	
	//movie.getDuration();
	oscS0.setup(HOST0, PORT);
	oscS1.setup(HOST1, PORT);
	oscS2.setup(HOST2, PORT);
	oscR.setup(PORT);
}

//--------------------------------------------------------------
void testApp::update(){
	//ofBackground(100,100,100);
    movie.idleMovie();
	movie.setLoopState(0x01);
	
	//printf("%f \n", ofGetFrameRate());
	while( oscR.hasWaitingMessages() ) {
		ofxOscMessage msg;
		oscR.getNextMessage(&msg);
		if(strcmp(msg.getAddress(), "/qtmovie") == 0) {
			if(strcmp(msg.getArgAsString(0), "play") == 0) {
				play();
			} else if (strcmp(msg.getArgAsString(0), "pause") == 0) {
				pause();
			}
		}
	}
	
	if(bMainPC) {
		if(movie.getPosition() >= 1) {
			allPause();
			//pause();
			ofSleepMillis(1 * 1000);
			allPlay();
			cout << "looppppDAYO" << "\n";
		}
	}
	
	
	

}

//--------------------------------------------------------------
void testApp::draw(){
	movie.draw(0,0,ofGetScreenWidth(),ofGetScreenHeight());
}


//--------------------------------------------------------------
void testApp::keyPressed  (int key){ 
	
	switch (key){
		case ' ':
			bPlaying = !bPlaying;
			bMainPC = true;
			if(bPlaying == 1) {
				allPlay();
			} else {
				allPause();
			}
			break;
	}
}

//--------------------------------------------------------------
void testApp::mouseMoved(int x, int y ){
}	

//--------------------------------------------------------------
void testApp::mouseDragged(int x, int y, int button){
}

//--------------------------------------------------------------
void testApp::mousePressed(int x, int y, int button){
}

//--------------------------------------------------------------
void testApp::mouseReleased(){

}

//-------------------------------------------------------------
void testApp::play() {
	movie.play();
	movie.setPaused(false);
	bPlaying = true;
}
//--------------------------------------------------------------
void testApp::pause() {
	movie.setPosition(0.0);
	movie.setPaused(true);
	bPlaying = false;
}

//--------------------------------------------------------------
void testApp::allPlay() {
	// send osc message
	ofxOscMessage msg;
	msg.setAddress("/qtmovie");
	msg.addStringArg("play");
	oscS1.sendMessage(msg);
	oscS2.sendMessage(msg);
	oscS0.sendMessage(msg);
}
//--------------------------------------------------------------
void testApp::allPause() {
	// send osc message
	ofxOscMessage msg;
	msg.setAddress("/qtmovie");
	msg.addStringArg("pause");
	oscS1.sendMessage(msg);
	oscS2.sendMessage(msg);
	oscS0.sendMessage(msg);
}


main.mm


#include "ofMain.h"
#include "testApp.h"


//========================================================================
int main( ){

	ofSetupOpenGL(720, 480, OF_FULLSCREEN);		
	
	// this kicks off the running of my app
	// can be OF_WINDOW or OF_FULLSCREEN
	// pass in width and height too:
	
	//FileOpener * fileOpener = [[FileOpener alloc] init];
	//[fileOpener open];
	
	ofRunApp(new testApp());
	
}