From 7ae1f870faebb65e9ee3a064fc43ef2fc6955a84 Mon Sep 17 00:00:00 2001 From: Comment Date: Thu, 29 Nov 2012 19:13:19 +0000 Subject: work on asterisk plugin --- vfg/src/Asterisk.cpp | 22 +++++++++++++++++++--- vfg/src/Asterisk.h | 2 ++ vfg/src/music.cpp | 53 ++++++++++++++++++++++++++++++++-------------------- vfg/src/music.h | 18 ++++++++++-------- vfg/src/testApp.cpp | 25 +++++++++++++++++-------- vfg/src/testApp.h | 1 + vfg/vfg.layout | 10 +++++----- 7 files changed, 87 insertions(+), 44 deletions(-) (limited to 'vfg') diff --git a/vfg/src/Asterisk.cpp b/vfg/src/Asterisk.cpp index 5392ade..ae85269 100755 --- a/vfg/src/Asterisk.cpp +++ b/vfg/src/Asterisk.cpp @@ -2,6 +2,7 @@ //there is no notification that there is someone in the queue +//but there is a status message you can check periodically... Asterisk::Asterisk() { @@ -10,13 +11,25 @@ Asterisk::Asterisk() udpConnection.SetNonBlocking(true); cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"database put GAME passcode 1234\"'"); state=WAITING; + printf("Asterisk: created socket and connected to server\n"); } void Asterisk::startGame(){ - //if (state=IDLE) { + if (state!=PLAYING) { cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"devstate change Custom:GAME NOT_INUSE\"'"); + printf("Asterisk: attempting to dequeue\n"); state=STARTING; - //} + } +} +void Asterisk::endGame(string score){ + if (state==PLAYING) { + cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"database put GAME statuscode "+score+"\"'"); + string emsg="ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"hangup request "+playerCode+"\"'"; + printf("%s\n",emsg.c_str()); + cmd(emsg); + printf("Asterisk: hanging up %s\n",playerCode.c_str()); + state=WAITING; + } } void Asterisk::cmd(string s) { file = popen(s.c_str(), "r"); @@ -26,6 +39,7 @@ void Asterisk::cmd(string s) { } int Asterisk::update(){ + //how to capture stdin response from popen /* if (state==WAITING||state==STARTING) { char buf[100]; @@ -47,16 +61,18 @@ int Asterisk::update(){ udpConnection.Receive(udpMessage,10000); string msg=udpMessage; if(msg!=""){ + printf("Asterisk: %s\n",msg.c_str()); if (msg.length()>3) { //printf("status msg: %s\n",msg.c_str()); if (msg.substr(0,5)=="Local") { state=PLAYING; + playerCode=msg.substr(0,msg.length()-1); + printf("Asterisk: game started: code %s\n",playerCode.c_str()); return 1000; } return 0; } else { - //printf("cmd: %s\n",msg.c_str()); return ofToInt(msg); } } diff --git a/vfg/src/Asterisk.h b/vfg/src/Asterisk.h index b3c5fd5..c9ce864 100755 --- a/vfg/src/Asterisk.h +++ b/vfg/src/Asterisk.h @@ -46,6 +46,7 @@ class Asterisk Asterisk(); virtual ~Asterisk(); void startGame(); + void endGame(string score); int update(); void cmd(string s); @@ -57,6 +58,7 @@ class Asterisk FILE *file; int filenum; ofxUDPManager udpConnection; + string playerCode; }; #endif // ASTERISK_H diff --git a/vfg/src/music.cpp b/vfg/src/music.cpp index 32f9d3e..d3d7807 100755 --- a/vfg/src/music.cpp +++ b/vfg/src/music.cpp @@ -124,6 +124,12 @@ void musicscore::parseMidi(string filename){ iter1--; printf("processed %s: length %f, %i notes in %f seconds\n",filename.c_str(),((float)(iter1->first+iter1->second->duration)*.001f),notes.size(),ofGetElapsedTimef()-wt); } +void musicscore::printNotes() { + map::iterator iter; + for (iter = notes.begin(); iter != notes.end(); iter++) { + printf("%i: %i, %i for %i\n",iter->first,iter->second->num,iter->second->velocity,iter->second->duration); + } +} void musicscore::makeFlakes(int threshStart,int threshEnd,levelscore *levels){ flakes.clear(); //decimate notes to generate flakes that can be interacted with @@ -147,10 +153,12 @@ void musicscore::makeFlakes(int threshStart,int threshEnd,levelscore *levels){ missedFlake=flakes.end(); missedNote=-1; } -void musicscore::setTimeframe(int millis) {timeframe=millis;} -void musicscore::setNowpoint(float pct) {nowpoint=pct;} +void musicscore::setTimeframe(int millis) { + timeframe=millis; + nowpoint=timeframe*0.33f; +} void musicscore::drawNotes(levelscore *levels) { - int scoreStart=ofGetElapsedTimeMillis()-startTime-((1.0f-nowpoint)*timeframe); + int scoreStart=ofGetElapsedTimeMillis()-startTime-nowpoint; int scoreEnd=scoreStart+timeframe; //note drawing 46h - 52h int numnotes=16; @@ -167,12 +175,16 @@ void musicscore::drawNotes(levelscore *levels) { ofSetColor(ofColor::fromHsb(((float)thisnote*255)/numnotes,200,100),(((float)(thisstart*heightStep))/ofGetHeight()*128)+32); ofRect(thisnote*widthStep,ofGetHeight()-(thisstart*heightStep),widthStep,-(thislength*heightStep)); } + //visualise keyThreshold + ofSetColor(255,0,0,70); + ofRect(0,ofGetHeight()-(nowpoint*heightStep),ofGetWidth(),keyThresh*heightStep); } void musicscore::drawFlakes(levelscore *levels,float scale) { ofEnableAlphaBlending(); - int scoreStart=ofGetElapsedTimeMillis()-startTime-((1.0f-nowpoint)*timeframe); - int scoreEnd=scoreStart+timeframe; + int now=ofGetElapsedTimeMillis()-startTime; + int screenStart=now-nowpoint; + int screenEnd=screenStart+timeframe; //note drawing 46h - 52h int numnotes=16; int firstnote=70; @@ -180,9 +192,9 @@ void musicscore::drawFlakes(levelscore *levels,float scale) { float heightStep=((float)ofGetHeight())/timeframe; map::iterator iter; //draw flakes - for (iter = flakes.lower_bound(scoreStart); iter != flakes.upper_bound(scoreEnd); iter++) { + for (iter = flakes.lower_bound(screenStart); iter != flakes.upper_bound(screenEnd); iter++) { int thisnote=iter->second->num-firstnote; - int thisstart=iter->first-scoreStart; + int thisstart=iter->first-screenStart; int thislength=iter->second->duration; //if (iter->second->activated) ofSetColor(255,255,255); @@ -195,21 +207,24 @@ void musicscore::drawFlakes(levelscore *levels,float scale) { //todo - make all drawing resolution independent } - //check for unactivated flakes within this segment: is there a more efficient way? - //need to know when a flake has just been missed - + //check for unactivated flakes within this level: is there a more efficient way? + //need to know when a flake has just been missed + //this seems to mess up a little bit when switching levels + //also: when the window for hitting flakes gets too big, it messes up missedFlakes=0; missedLast=false; map::iterator missed=flakes.end(); - int scoreTime=ofGetElapsedTimeMillis()-startTime; - for (iter = flakes.lower_bound(levels->getLowerBound(levels->getLevel(scoreStart))); iter != flakes.lower_bound(scoreStart); iter++){ + int lvlstart=levels->getLowerBound(levels->getLevel(now)); + int window=max(lvlstart,now-keyThresh); + for (iter = flakes.lower_bound(lvlstart); iter != flakes.lower_bound(window); iter++){ if (!iter->second->activated) { missedFlakes++; missed=iter; } missedLast=!iter->second->activated; } - //at this point missed points to the latest unactivated flake in the level if there is one + //at this point missed points to the latest unactivated flake in the level if there is one or else flakes.end() + if ((missed!=flakes.end())&&(missedFlake!=missed)) { missedFlake=missed; missedNote=notemap(missed->second->num); @@ -218,10 +233,10 @@ void musicscore::drawFlakes(levelscore *levels,float scale) { ofDisableAlphaBlending(); } -void musicscore::playerControl(int key,int threshold){ +void musicscore::playerControl(int key){ map::iterator iter; - int scoreTime=ofGetElapsedTimeMillis()-startTime; - for (iter = flakes.lower_bound(scoreTime-threshold); iter != flakes.upper_bound(scoreTime+threshold); iter++) { + int now=ofGetElapsedTimeMillis()-startTime; + for (iter = flakes.lower_bound(now-keyThresh); iter != flakes.upper_bound(now); iter++) { if (key==notemap(iter->second->num)) { iter->second->activate(); hitNote=key; @@ -236,11 +251,9 @@ song::song(string backfile,string melfile,string musfile,string lyricfile,string lyrics.load(lyricfile); levels.load(levelfile); isPlaying=false; - keyThresh=500; - notes.setNowpoint(0.8f); } void song::setTimeframe(int millis) {notes.setTimeframe(millis);} -void song::setKeythresh(int millis) {keyThresh=millis;} +void song::setKeyThresh(int millis) {notes.keyThresh=millis;} void song::setFlakeThresh(int tS,int tE) { fThreshStart=tS; fThreshEnd=tE; @@ -304,7 +317,7 @@ void song::draw(float scale){ ofDrawBitmapString(ofToString((float)songTime/1000.0f,1)+" "+ofToString(levels.getLevel(songTime))+" "+ofToString(notes.missedFlakes)+" of "+ofToString(levels.getLives(songTime)),10,(ofGetHeight()*gridY[1])-3); } void song::playerControl(int key){ - notes.playerControl(key,keyThresh); + notes.playerControl(key); } int song::missedNote(){ return notes.missedNote; diff --git a/vfg/src/music.h b/vfg/src/music.h index a1eddc4..3a9f299 100755 --- a/vfg/src/music.h +++ b/vfg/src/music.h @@ -156,18 +156,18 @@ class musicscore: public score { public: musicscore(); void parseMidi(string filename); - void setTimeframe(int millis); - void setNowpoint(float pct); + void setTimeframe(int millis); void drawNotes(levelscore *levels); void drawFlakes(levelscore *levels,float scale); - void playerControl(int key,int threshold); + void playerControl(int key); void makeFlakes(int threshStart,int threshEnd,levelscore *levels); - + void printNotes(); int missedFlakes; int missedNote; int hitNote; bool missedLast; bool perfect; + int keyThresh; private: map notes; @@ -175,7 +175,7 @@ class musicscore: public score { map::iterator missedFlake; int timeframe; float nowpoint; - + vector snowflakes; }; @@ -188,7 +188,7 @@ class song { void preRoll(long preroll); void setTimeframe(int millis); void setFlakeThresh(int tS,int tE); - void setKeythresh(int millis); + void setKeyThresh(int millis); void drawNotes(); void draw(float scale); int missedNote(); @@ -197,16 +197,18 @@ class song { void playerControl(int key); int getLevel(long time); int getCurrentTime(); + + musicscore notes; private: ofSoundPlayer backing; ofSoundPlayer melody; lyricscore lyrics; - musicscore notes; + levelscore levels; long startTime; bool isPreroll; - int fThreshStart,fThreshEnd,keyThresh; + int fThreshStart,fThreshEnd; }; //--------------------------------------------------------------------------------------------------------------------------------------------- /* diff --git a/vfg/src/testApp.cpp b/vfg/src/testApp.cpp index d1cb41c..53cfa95 100755 --- a/vfg/src/testApp.cpp +++ b/vfg/src/testApp.cpp @@ -3,14 +3,16 @@ //-------------------------------------------------------------- void testApp::setup(){ - songs.push_back(new song("WeWishYouAMerryChistmas_v.2.1/VODA_MUS_WEWISHU_Backing_v.2.1.mp3","WeWishYouAMerryChistmas_v.2.1/VODA_MUS_WEWISHU_Lead_v.2.1.mp3","VODA_MUS_WEWISHU_Midi_v.2.1.xml","Lyrics_WeWishYou.2.1.xml","Levels_WeWishYou.2.1.xml")); + //songs.push_back(new song("WeWishYouAMerryChistmas_v.2.1/VODA_MUS_WEWISHU_Backing_v.2.1.mp3","WeWishYouAMerryChistmas_v.2.1/VODA_MUS_WEWISHU_Lead_v.2.1.mp3","VODA_MUS_WEWISHU_Midi_v.2.1.xml","Lyrics_WeWishYou.2.1.xml","Levels_WeWishYou.2.1.xml")); + songs.push_back(new song("DeckTheHalls_v.4.0/VODA_MUS_DeckTheHalls-Backing_v.4.0.mp3","DeckTheHalls_v.4.0/VODA_MUS_DeckTheHalls-Lead_v.4.0.mp3","VODA_MIDI_DeckTheHalls-v.4.0.xml","Lyrics_DeckTheHalls.4.0.xml","Levels_DeckTheHalls.4.0.xml")); songs.push_back(new song("DingDong.v.2.2/VODA_MUS_DingDong_Backing_v.2.2.mp3","DingDong.v.2.2/VODA_MUS_DingDong_Melody_v.2.2.mp3","VODA_MIDI_DingDong_v.2.2.xml","Lyrics_DingDong.2.2.xml","Levels_DingDong.2.2.xml")); songs.push_back(new song("JingleBells_v.4.0/VODA_MUS_JingleBells_Backing_v.4.0.mp3","JingleBells_v.4.0/VODA_MUS_JingleBells_Melody_v.4.0.mp3","VODA_MUS_JingleBells_MIDI_v.4.0.xml","Lyrics_JingleBells.4.0.xml","Levels_JingleBells.4.0.xml")); - songs.push_back(new song("DeckTheHalls_v.4.0/VODA_MUS_DeckTheHalls-Backing_v.4.0.mp3","DeckTheHalls_v.4.0/VODA_MUS_DeckTheHalls-Lead_v.4.0.mp3","VODA_MIDI_DeckTheHalls-v.4.0.xml","Lyrics_DeckTheHalls.4.0.xml","Levels_DeckTheHalls.4.0.xml")); ofSetBackgroundAuto(false); ofBackground(0,0,0); - + + //printf("we wish you a merry xmas:\n"); + //songs[0]->notes.printNotes(); for (int i=0;i<3;i++) penguins.push_back(Animal()); penguins[0].load("Penguin-Blue.xml"); @@ -54,7 +56,8 @@ void testApp::setup(){ vignette.loadImage("Vignette.png"); - showFPS=false; + showFPS=true; + showVis=true; currentsong=0; nextsong=0; @@ -91,8 +94,10 @@ void testApp::update(){ currentsong=nextsong; songs[currentsong]->setTimeframe(3000); songs[currentsong]->setFlakeThresh(1000,100); + songs[currentsong]->setKeyThresh(1000); songs[currentsong]->preRoll(750); tags[0]->play(); + nextsong=(nextsong+1)%songs.size(); } else if (ret>48&&ret<52) { songs[currentsong]->playerControl(ret-48); @@ -133,7 +138,7 @@ void testApp::draw(){ if (songs[currentsong]->isPlaying) { ofSetColor(255,255,255); - songs[currentsong]->drawNotes(); + if (showVis) songs[currentsong]->drawNotes(); int missed=songs[currentsong]->missedNote(); if (missed>-1) (*playanimal)[missed].playNow("Shudder"); int hit=songs[currentsong]->hitNote(); @@ -167,14 +172,15 @@ void testApp::draw(){ void testApp::keyPressed(int key){ switch (key) { case ' ': - nextsong=(nextsong+1)%songs.size(); if (!songs[currentsong]->isPlaying) { currentlevel=0; currentsong=nextsong; - songs[currentsong]->setTimeframe(3000); - songs[currentsong]->setFlakeThresh(1000,100); + songs[currentsong]->setTimeframe(5000); + songs[currentsong]->setFlakeThresh(2000,500); + songs[currentsong]->setKeyThresh(1500); songs[currentsong]->preRoll(750); tags[0]->play(); + nextsong=(nextsong+1)%songs.size(); } break; case '1': @@ -189,6 +195,9 @@ void testApp::keyPressed(int key){ case 'f': showFPS=!showFPS; break; + case 'v': + showVis=!showVis; + break; case 'r': //loadanimals("Raccoons"); playanimal =&raccoons; diff --git a/vfg/src/testApp.h b/vfg/src/testApp.h index 143885c..2d17cd0 100755 --- a/vfg/src/testApp.h +++ b/vfg/src/testApp.h @@ -104,6 +104,7 @@ class testApp : public ofBaseApp{ Asterisk game; bool showFPS; + bool showVis; int currentsong,nextsong; diff --git a/vfg/vfg.layout b/vfg/vfg.layout index 4f82781..59eb91b 100644 --- a/vfg/vfg.layout +++ b/vfg/vfg.layout @@ -16,22 +16,22 @@ - + - - + + - + - + -- cgit v1.2.3