ofxPiMapper fixed for C++17 & oF 12.0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

148 lines
4.8 KiB

//
// MediaServer.cpp
// example
//
// Created by felix on 13.09.14.
//
//
#include "MediaServer.h"
namespace ofx {
namespace piMapper {
MediaServer::MediaServer():
videoWatcher(ofToDataPath(DEFAULT_VIDEOS_DIR, true), MediaType::MEDIA_TYPE_VIDEO),
imageWatcher(ofToDataPath(DEFAULT_IMAGES_DIR, true), MediaType::MEDIA_TYPE_IMAGE) {
addWatcherListeners();
}
MediaServer::~MediaServer() {
removeWatcherListeners();
};
int MediaServer::getNumImages() { return imageWatcher.getFilePaths().size(); }
int MediaServer::getNumVideos() { return videoWatcher.getFilePaths().size(); }
std::vector<std::string>& MediaServer::getImagePaths() {
return imageWatcher.getFilePaths();
}
std::vector<std::string>& MediaServer::getVideoPaths() {
return videoWatcher.getFilePaths();
}
std::vector<std::string> MediaServer::getImageNames() {
std::vector<std::string> imageNames;
for (int i = 0; i < getNumImages(); i++) {
// Split image path
std::vector<std::string> pathParts = ofSplitString(getImagePaths()[i], "/");
// And get only the last piece
std::string name = pathParts[pathParts.size()-1];
imageNames.push_back(name);
}
return imageNames;
}
void MediaServer::loadImage(string& path) {
// Check if this image is already loaded
bool isImageLoaded = false;
for (int i = 0; i < loadedImagePaths.size(); i++) {
if (path == loadedImagePaths[i]) {
isImageLoaded = true;
break;
}
}
// If image is loaded
if (isImageLoaded) {
// Notify objects registered to onImageLoaded event
std::stringstream ss;
ss << "Image " << path << " already loaded";
ofLogNotice("MediaServer") << ss.str();
ofNotifyEvent(onImageLoaded, path, this);
} else {
// Load image and add to vector if loading success
ofImage image;
if (image.loadImage(path)) {
loadedImages.push_back(image);
loadedImagePaths.push_back(path); // Save also path
// Notify objects registered to onImageLoaded event
ofNotifyEvent(onImageLoaded, path, this);
} else {
ofLogFatalError("MediaServer") << "Failed to load image";
std::exit(EXIT_FAILURE);
}
}
}
void MediaServer::unloadImage(string& path) {
// Search for given path in loaded image paths
for (int i = 0; i < loadedImagePaths.size(); i++) {
// If found
if (loadedImagePaths[i] == path) {
// Remove path and unload image as well as remove it from storage
loadedImagePaths.erase(loadedImagePaths.begin() + i);
loadedImages[i].clear();
loadedImages.erase(loadedImages.begin() + i);
ofNotifyEvent(onImageUnloaded, path, this);
break;
}
}
}
ofTexture* MediaServer::getImageTexture(string &path) {
// Find image index by path
for (int i = 0; i < loadedImagePaths.size(); i++) {
if (path == loadedImagePaths[i]) {
if (loadedImages[i].isAllocated()) {
return &loadedImages[i].getTextureReference();
}
}
}
// If we havent returned yet, that means that there is no image
// and we need to sort this out somehow
ofLogError("MediaServer::getImageTexture", "Image not found");
return NULL;
}
void MediaServer::handleImageAdded(string& path) {
/*
cout << "onImageAdded: " << path << endl;
cout << "numImages: " << getNumImages() << endl;
*/
ofNotifyEvent(onImageAdded, path, this);
}
void MediaServer::handleImageRemoved(string& path) {
/*
cout << "onImageRemoved: " << path << endl;
cout << "numImages: " << getNumImages() << endl;
*/
ofNotifyEvent(onImageRemoved, path, this);
}
void MediaServer::handleVideoAdded(string& path) {
//cout << "onVideoAdded: " << path << endl;
ofNotifyEvent(onVideoAdded, path, this);
}
void MediaServer::handleVideoRemoved(string& path) {
//cout << "onVideoRemoved: " << path << endl;
ofNotifyEvent(onVideoRemoved, path, this);
}
void MediaServer::addWatcherListeners() {
ofAddListener(imageWatcher.onItemAdded, this, &MediaServer::handleImageAdded);
ofAddListener(imageWatcher.onItemRemoved, this, &MediaServer::handleImageRemoved);
ofAddListener(videoWatcher.onItemAdded, this, &MediaServer::handleVideoAdded);
ofAddListener(videoWatcher.onItemRemoved, this, &MediaServer::handleVideoRemoved);
}
void MediaServer::removeWatcherListeners() {
ofRemoveListener(imageWatcher.onItemAdded, this, &MediaServer::handleImageAdded);
ofRemoveListener(imageWatcher.onItemRemoved, this, &MediaServer::handleImageRemoved);
ofRemoveListener(videoWatcher.onItemAdded, this, &MediaServer::handleVideoAdded);
ofRemoveListener(videoWatcher.onItemRemoved, this, &MediaServer::handleVideoRemoved);
}
} // namespace piMapper
} // namespace ofx