summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TRSS_02_rec/addons.make5
-rw-r--r--TRSS_02_rec/src/testApp.cpp199
-rwxr-xr-xvamphost/Makefile (renamed from TRSS_02_rec/Makefile)0
-rw-r--r--vamphost/addons.make1
-rwxr-xr-xvamphost/config.make (renamed from TRSS_02_rec/config.make)5
-rw-r--r--vamphost/src/main.cpp (renamed from TRSS_02_rec/src/main.cpp)2
-rw-r--r--vamphost/src/ofxVamphost.cpp212
-rw-r--r--vamphost/src/ofxVamphost.h49
-rw-r--r--vamphost/src/testApp.cpp69
-rw-r--r--vamphost/src/testApp.h (renamed from TRSS_02_rec/src/testApp.h)18
10 files changed, 337 insertions, 223 deletions
diff --git a/TRSS_02_rec/addons.make b/TRSS_02_rec/addons.make
deleted file mode 100644
index 0b4df47..0000000
--- a/TRSS_02_rec/addons.make
+++ /dev/null
@@ -1,5 +0,0 @@
-ofxOpenNI
-ofxFenster
-ofxGui
-ofxXmlSettings
-ofxMayaCam
diff --git a/TRSS_02_rec/src/testApp.cpp b/TRSS_02_rec/src/testApp.cpp
deleted file mode 100644
index 376d357..0000000
--- a/TRSS_02_rec/src/testApp.cpp
+++ /dev/null
@@ -1,199 +0,0 @@
-#include "testApp.h"
-
-//--------------------------------------------------------------
-void testApp::setup() {
-
- ofSetLogLevel(OF_LOG_NOTICE);
-
- numDevices = openNIRecorders[0].getNumDevices();
-
- for (int deviceID = 0; deviceID < numDevices; deviceID++){
- //openNIRecorders[deviceID].setLogLevel(OF_LOG_VERBOSE);
- openNIRecorders[deviceID].setup(false);
- openNIRecorders[deviceID].addDepthGenerator();
- openNIRecorders[deviceID].addImageGenerator();
- openNIRecorders[deviceID].setRegister(true); // this registers all the image pixels to the depth pixels
- openNIRecorders[deviceID].setMirror(true); // flips the image and depth sensors
- openNIRecorders[deviceID].start();
-
- openNIPlayers[deviceID].setup(false);
- openNIPlayers[deviceID].start();
-
- filenames[deviceID]="";
- }
-
- isLive=true;
- isRecording=false;
-
- verdana.loadFont(ofToDataPath("verdana.ttf"), 10);
-
- startSound.loadSound("tone1.wav");
- stopSound.loadSound("tone0.wav");;
-}
-
-
-string testApp::generateFileName(int cam) {
-
- string _root = "kinectRecord_";
-
- string _timestamp = ofToString(ofGetDay()) +
- ofToString(ofGetMonth()) +
- ofToString(ofGetYear()) +
- ofToString(ofGetHours()) +
- ofToString(ofGetMinutes()) +
- ofToString(ofGetSeconds());
-
- string _filename = (_root + ofToString(cam)+"_"+_timestamp + ".oni");
-
- return _filename;
-
-}
-
-//--------------------------------------------------------------
-void testApp::update(){
- for (int deviceID = 0; deviceID < numDevices; deviceID++){
- if (isLive) {
- openNIRecorders[deviceID].update();
- if (isRecording){
- recorded++;
- }
- }
- else {
- openNIPlayers[deviceID].update();
- }
- }
-}
-
-//--------------------------------------------------------------
-void testApp::draw(){
- ofBackground(0, 0, 0);
- ofSetColor(255, 255, 255);
-
- ofPushMatrix();
-
- for (int deviceID = 0; deviceID < numDevices; deviceID++){
- ofTranslate(0, deviceID * 450);
- if (isLive) {
- //openNIRecorders[deviceID].drawDebug(); // draws all generators
- openNIRecorders[deviceID].drawDepth(200, 0,600,450);
- openNIRecorders[deviceID].drawImage(800, 0,600,450);
- }
- else {
- //openNIPlayers[deviceID].drawDebug();
- openNIPlayers[deviceID].drawDepth(200, 0,600,450);
- openNIPlayers[deviceID].drawImage(800, 0,600,450);
- }
- }
-
- ofPopMatrix();
-
- ofSetColor(255, 255, 255);
- string msg = "MILLIS: " + ofToString(ofGetElapsedTimeMillis()) + "\nFPS: " + ofToString(ofGetFrameRate());
- if (isRecording) {
- msg +="\nrecorded "+ofToString(recorded);
- }
- if (!isLive) {
- msg +="\n"+filenames[0];
- }
- verdana.drawString(msg, 10, 10);
-}
-
-//--------------------------------------------------------------
-void testApp::exit(){
- for (int deviceID = 0; deviceID < numDevices; deviceID++){
- openNIRecorders[deviceID].stop();
- openNIPlayers[deviceID].stop();
- }
-}
-
-//--------------------------------------------------------------
-void testApp::keyPressed(int key){
- switch (key) {
- case 's':
- case 'S':
- if (isRecording) {
- for (int deviceID = 0; deviceID < numDevices; deviceID++){
- openNIRecorders[deviceID].stopRecording();
- stopSound.play();
- }
- isRecording = false;
- break;
- } else {
- for (int deviceID = 0; deviceID < numDevices; deviceID++){
- filenames[deviceID]=generateFileName(deviceID);
- openNIRecorders[deviceID].startRecording(generateFileName(deviceID));
- startSound.play();
- }
- isRecording = true;
- recorded=0;
- break;
- }
- break;
- case 'p':
- case 'P':
- if (filenames[0] != "" && !isRecording && isLive) {
- for (int deviceID = 0; deviceID < numDevices; deviceID++){
- openNIRecorders[deviceID].stopRecording();
- }
- for (int deviceID = 0; deviceID < numDevices; deviceID++){
- openNIPlayers[deviceID].startPlayer(filenames[deviceID]);
- }
- isLive = false;
- //whichUser=&playUser;
- //whichImage=&playImage;
- } else {
- isLive = true;
- //whichUser=&recordUser;
- //whichImage=&recordImage;
- }
- break;
- }
-
- /* why do this?
- switch (key) {
- case 't':
- for (int deviceID = 0; deviceID < numDevices; deviceID++){
- openNIRecorders[deviceID].toggleRegister();
- }
- break;
- case 'x':
- for (int deviceID = 0; deviceID < numDevices; deviceID++){
- openNIRecorders[deviceID].stop();
- }
- break;
- default:
- break;
- }
- */
-}
-
-//--------------------------------------------------------------
-void testApp::keyReleased(int key){
-
-}
-
-//--------------------------------------------------------------
-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(int x, int y, int button){
-
-}
-
-//--------------------------------------------------------------
-void testApp::windowResized(int w, int h){
-
-}
-
diff --git a/TRSS_02_rec/Makefile b/vamphost/Makefile
index 2d83a77..2d83a77 100755
--- a/TRSS_02_rec/Makefile
+++ b/vamphost/Makefile
diff --git a/vamphost/addons.make b/vamphost/addons.make
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/vamphost/addons.make
@@ -0,0 +1 @@
+
diff --git a/TRSS_02_rec/config.make b/vamphost/config.make
index 821a73a..a4db95a 100755
--- a/TRSS_02_rec/config.make
+++ b/vamphost/config.make
@@ -3,7 +3,8 @@
# OF_ROOT allows to move projects outside apps/* just set this variable to the
# absoulte path to the OF root folder
-OF_ROOT = ../../openFrameworks
+#OF_ROOT = ../../openFrameworks
+OF_ROOT = /home/tim/workspace/openFrameworks
# USER_CFLAGS allows to pass custom flags to the compiler
@@ -17,7 +18,7 @@ USER_CFLAGS = -I $(OF_ROOT)/addons/ofxOpenNI/include/openni -I $(OF_ROOT)/addons
# for example libraries like:
# USER_LDFLAGS = libs/libawesomelib.a
-USER_LDFLAGS = -lOpenNI
+USER_LDFLAGS = -lvamp-hostsdk
EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj"
diff --git a/TRSS_02_rec/src/main.cpp b/vamphost/src/main.cpp
index 87dc35f..1ef19ab 100644
--- a/TRSS_02_rec/src/main.cpp
+++ b/vamphost/src/main.cpp
@@ -7,7 +7,7 @@
int main( ){
ofAppGlutWindow window;
- ofSetupOpenGL(&window, 1600,900, OF_FULLSCREEN); // <-------- setup the GL context
+ ofSetupOpenGL(&window, 1024,768, OF_FULLSCREEN); // <-------- setup the GL context
// this kicks off the running of my app
// can be OF_WINDOW or OF_FULLSCREEN
diff --git a/vamphost/src/ofxVamphost.cpp b/vamphost/src/ofxVamphost.cpp
new file mode 100644
index 0000000..3da842b
--- /dev/null
+++ b/vamphost/src/ofxVamphost.cpp
@@ -0,0 +1,212 @@
+#include "ofxVamphost.h"
+
+using namespace std;
+
+bool Vamphost::init(const string &soname,const string &id,const int &_channels,const int &_bits,const int &_samples,const int &_rate,const int &_outputNo,const string &_output){
+
+ //stuff that only happens once
+ channels =_channels;
+ samples=_samples;
+ rate=_rate;
+ bits=_bits;
+ outputNo=_outputNo;
+ output=_output;
+
+ //http://www.mega-nerd.com/libsndfile/api.html#note1
+ //libsndfile returns -1..1 for fp data
+ bytes=(bits>>3);
+ stride=channels*bytes;
+ scale=(1.0f/pow(2.0f,bits));
+
+ features[0.0f]=0;
+
+ loader = PluginLoader::getInstance();
+ key = loader->composePluginKey(soname, id);
+ plugin = loader->loadPlugin(key, _rate, PluginLoader::ADAPT_ALL_SAFE);
+ if (!plugin) {
+ cerr << ": ERROR: Failed to load plugin \"" << id
+ << "\" from library \"" << soname << "\"" << endl;
+ return false;
+ }
+
+ cerr << "Running plugin: \"" << plugin->getIdentifier() << "\"..." << endl;
+
+ blockSize = plugin->getPreferredBlockSize();
+ stepSize = plugin->getPreferredStepSize();
+
+ if (blockSize == 0) {
+ blockSize = 1024;
+ }
+ if (stepSize == 0) {
+ if (plugin->getInputDomain() == Plugin::FrequencyDomain) {
+ stepSize = blockSize/2;
+ } else {
+ stepSize = blockSize;
+ }
+ }
+ else if (stepSize > blockSize) {
+ cerr << "WARNING: stepSize " << stepSize << " > blockSize " << blockSize << ", resetting blockSize to ";
+ if (plugin->getInputDomain() == Plugin::FrequencyDomain) {
+ blockSize = stepSize * 2;
+ } else {
+ blockSize = stepSize;
+ }
+ cerr << blockSize << endl;
+ }
+ overlapSize = blockSize - stepSize;
+ currentStep = 0;
+ finalStepsRemaining = max(1, (blockSize / stepSize) - 1); // at end of file, this many part-silent frames needed after we hit EOF
+
+ plugbuf = new float*[channels];
+ for (int c = 0; c < channels; ++c) plugbuf[c] = new float[blockSize + 2];
+
+ cerr << "Using block size = " << blockSize << ", step size = "
+ << stepSize << endl;
+
+ // The channel queries here are for informational purposes only --
+ // a PluginChannelAdapter is being used automatically behind the
+ // scenes, and it will take case of any channel mismatch
+
+ int minch = plugin->getMinChannelCount();
+ int maxch = plugin->getMaxChannelCount();
+ cerr << "Plugin accepts " << minch << " -> " << maxch << " channel(s)" << endl;
+ cerr << "Sound file has " << channels << " (will mix/augment if necessary)" << endl;
+
+ Plugin::OutputList outputs = plugin->getOutputDescriptors();
+ Plugin::OutputDescriptor od;
+
+ int returnValue = 1;
+ int prog = 0;
+
+ RealTime rt;
+ PluginWrapper *wrapper = 0;
+ RealTime adjustment = RealTime::zeroTime;
+
+ if (outputs.empty()) {
+ cerr << "ERROR: Plugin has no outputs!" << endl;
+ return false;
+ }
+
+ if (outputNo < 0) {
+ for (size_t oi = 0; oi < outputs.size(); ++oi) {
+ if (outputs[oi].identifier == output) {
+ outputNo = oi;
+ break;
+ }
+ }
+ if (outputNo < 0) {
+ cerr << "ERROR: Non-existent output \"" << output << "\" requested" << endl;
+ return false;
+ }
+ }
+ else {
+ if (int(outputs.size()) <= outputNo) {
+ cerr << "ERROR: Output " << outputNo << " requested, but plugin has only " << outputs.size() << " output(s)" << endl;
+ return false;
+ }
+ }
+ od = outputs[outputNo];
+ cerr << "Output is: \"" << od.identifier << "\"" << endl;
+
+ if (!plugin->initialise(channels, stepSize, blockSize)) {
+ cerr << "ERROR: Plugin initialise (channels = " << channels
+ << ", stepSize = " << stepSize << ", blockSize = "
+ << blockSize << ") failed." << endl;
+ return false;
+ }
+
+ wrapper = dynamic_cast<PluginWrapper *>(plugin);
+ if (wrapper) {
+ // See documentation for
+ // PluginInputDomainAdapter::getTimestampAdjustment
+ PluginInputDomainAdapter *ida =wrapper->getWrapper<PluginInputDomainAdapter>();
+ if (ida) adjustment = ida->getTimestampAdjustment();
+ }
+
+ //everything is prepared to start consuming data in blocks
+
+ in_block=0;
+ blocks_processed=0;
+ currentStep=0;
+
+ featureNo=1;
+
+ return true;
+}
+void Vamphost::process_frame(unsigned char *data,int samples_in_frame){
+ int sample=0;
+
+ //process the whole frame which may be f>1<f blocks
+ //when the frame is finished leave the partial block for the next frame
+ while(sample<samples_in_frame) {
+ while(sample<samples_in_frame&&in_block<blockSize) {
+ for (int i=0;i<channels;i++) {
+ unsigned int this_val=0;
+ for (int j=0;j<bytes;j++) {
+ this_val+=data[(sample*stride)+(i*bytes)+j]<<(j*8);
+ }
+ plugbuf[i][in_block]=((float)((short)this_val))*scale;
+ }
+ in_block++;
+ sample++;
+ }
+ if (in_block==blockSize) {
+ //block is ready to be processed
+ //cerr<<plugin->getIdentifier()<<" processed block "<<blocks_processed<<endl;
+
+ //I /think/ that the vamp plugin keeps processing through the plugbuf until it encounters 0s
+ rt = RealTime::frame2RealTime(currentStep * stepSize, rate);
+
+ Plugin::FeatureSet feat=plugin->process(plugbuf, rt);
+
+ for (unsigned int i = 0; i < feat[outputNo].size(); ++i) {
+ features[((float)feat[outputNo][i].timestamp.sec)+(((float)feat[outputNo][i].timestamp.nsec)*.000000001)]=featureNo;
+ featureNo++;
+ }
+
+ //shunt it down
+ for (int i=0;i<blockSize-stepSize;i++){
+ for (int j=0;j<channels;j++){
+ plugbuf[j][i]=plugbuf[j][i+stepSize];
+ }
+ }
+
+ in_block-=stepSize;
+ currentStep++;
+ }
+ }
+}
+void Vamphost::cleanup(){
+
+ //process final block
+ while(in_block<blockSize) {
+ for (int i=0;i<channels;i++) {
+ plugbuf[i][in_block]=0.0f;
+ }
+ in_block++;
+ }
+
+ rt = RealTime::frame2RealTime(currentStep * stepSize, rate);
+
+ Plugin::FeatureSet feat=plugin->process(plugbuf, rt);
+
+ for (unsigned int i = 0; i < feat[outputNo].size(); ++i) {
+ features[((float)feat[outputNo][i].timestamp.sec)+(((float)feat[outputNo][i].timestamp.nsec)*.000000001)]=featureNo;
+ featureNo++;
+ }
+
+ feat=plugin->getRemainingFeatures();
+
+ for (unsigned int i = 0; i < feat[outputNo].size(); ++i) {
+ features[((float)feat[outputNo][i].timestamp.sec)+(((float)feat[outputNo][i].timestamp.nsec)*.000000001)]=featureNo;
+ featureNo++;
+ }
+
+ cerr<<plugin->getIdentifier()<<" found "<<(features.size()-1)<<" features"<<endl;
+ //deal with left over data?
+ for (int c = 0; c < channels; ++c) {
+ delete[] plugbuf[c];
+ }
+ delete[] plugbuf;
+ delete plugin;
+}
diff --git a/vamphost/src/ofxVamphost.h b/vamphost/src/ofxVamphost.h
new file mode 100644
index 0000000..2eb6a83
--- /dev/null
+++ b/vamphost/src/ofxVamphost.h
@@ -0,0 +1,49 @@
+#ifndef OFXVAMPHOST_H_
+#define OFXVAMPHOST_H_
+
+#include <vamp-hostsdk/PluginHostAdapter.h>
+#include <vamp-hostsdk/PluginInputDomainAdapter.h>
+#include <vamp-hostsdk/PluginLoader.h>
+
+#include <map>
+#include <math.h>
+
+using Vamp::Plugin;
+using Vamp::PluginHostAdapter;
+using Vamp::RealTime;
+using Vamp::HostExt::PluginLoader;
+using Vamp::HostExt::PluginWrapper;
+using Vamp::HostExt::PluginInputDomainAdapter;
+
+#define HOST_VERSION "1.5"
+
+class Vamphost{
+ //can load any vamp analysis plugin and present its data with a unified interface
+ public:
+ bool init(const std::string &soname,const std::string &id,const int &_channels,const int &_bits,const int &_samples,const int &_rate,const int &_outputNo=0,const std::string &_output="");
+ void process_frame(unsigned char *data,int samples_in_frame);
+ void cleanup();
+
+ std::map<float,int> features;
+ //map<time,featureNo>
+ //this is the best way to store features: because map allows to search for the key below and above the present time
+
+ private:
+ PluginLoader *loader;
+ PluginLoader::PluginKey key;
+ Plugin *plugin;
+ RealTime rt;
+ int channels,bits,samples,rate;
+ int bytes,stride;
+ float scale;
+ int blockSize,stepSize,overlapSize,finalStepsRemaining,currentStep,outputNo;
+ int in_block,blocks_processed;
+ std::string output;
+ float **plugbuf;
+
+ int featureNo;
+
+};
+
+#endif
+
diff --git a/vamphost/src/testApp.cpp b/vamphost/src/testApp.cpp
new file mode 100644
index 0000000..adf7416
--- /dev/null
+++ b/vamphost/src/testApp.cpp
@@ -0,0 +1,69 @@
+#include "testApp.h"
+
+//--------------------------------------------------------------
+void testApp::setup() {
+
+
+}
+
+
+//--------------------------------------------------------------
+void testApp::update(){
+
+}
+
+//--------------------------------------------------------------
+void testApp::draw(){
+ ofBackground(0, 0, 0);
+ ofSetColor(255, 255, 255);
+
+
+}
+
+//--------------------------------------------------------------
+void testApp::exit(){
+
+}
+
+//--------------------------------------------------------------
+void testApp::keyPressed(int key){
+ switch (key) {
+ case 's':
+ case 'S':
+ break;
+ case 'p':
+ case 'P':
+ break;
+ }
+}
+
+//--------------------------------------------------------------
+void testApp::keyReleased(int key){
+
+}
+
+//--------------------------------------------------------------
+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(int x, int y, int button){
+
+}
+
+//--------------------------------------------------------------
+void testApp::windowResized(int w, int h){
+
+}
+
diff --git a/TRSS_02_rec/src/testApp.h b/vamphost/src/testApp.h
index ffb92e9..855889c 100644
--- a/TRSS_02_rec/src/testApp.h
+++ b/vamphost/src/testApp.h
@@ -1,10 +1,9 @@
#ifndef _TEST_APP
#define _TEST_APP
-#include "ofxOpenNI.h"
#include "ofMain.h"
+#include "ofxVamphost.h"
-#define MAX_DEVICES 2
class testApp : public ofBaseApp{
@@ -21,21 +20,8 @@ public:
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
- string generateFileName(int cam);
+
- int numDevices;
- ofxOpenNI openNIRecorders[MAX_DEVICES];
- ofxOpenNI openNIPlayers[MAX_DEVICES];
- string filenames[MAX_DEVICES];
-
- bool isLive, isRecording;
-
- ofTrueTypeFont verdana;
-
- ofSoundPlayer startSound;
- ofSoundPlayer stopSound;
-
- int recorded;
};