From 6b37e76f16fa1e51cd6d6f347a3d5e1206348a49 Mon Sep 17 00:00:00 2001
From: David Robillard <d@drobilla.net>
Date: Tue, 20 May 2008 00:31:34 +0000
Subject: Add files I yet again forgot to add.

git-svn-id: http://svn.drobilla.net/lad/ingen@1219 a436a847-0d15-0410-975c-d299462d15a1
---
 src/libs/shared/LV2Features.cpp | 65 ++++++++++++++++++++++++++++++++++++++++
 src/libs/shared/LV2Features.hpp | 63 +++++++++++++++++++++++++++++++++++++++
 src/libs/shared/LV2URIMap.cpp   | 66 +++++++++++++++++++++++++++++++++++++++++
 src/libs/shared/LV2URIMap.hpp   | 57 +++++++++++++++++++++++++++++++++++
 src/libs/shared/Makefile.am     |  9 ++++++
 5 files changed, 260 insertions(+)
 create mode 100644 src/libs/shared/LV2Features.cpp
 create mode 100644 src/libs/shared/LV2Features.hpp
 create mode 100644 src/libs/shared/LV2URIMap.cpp
 create mode 100644 src/libs/shared/LV2URIMap.hpp
 create mode 100644 src/libs/shared/Makefile.am

(limited to 'src')

diff --git a/src/libs/shared/LV2Features.cpp b/src/libs/shared/LV2Features.cpp
new file mode 100644
index 00000000..b86f45dc
--- /dev/null
+++ b/src/libs/shared/LV2Features.cpp
@@ -0,0 +1,65 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2008 Dave Robillard <http://drobilla.net>
+ * 
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ * 
+ * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "LV2Features.hpp"
+#include "LV2URIMap.hpp"
+
+using namespace std;
+
+namespace Ingen {
+namespace Shared {
+	
+	
+LV2Features::LV2Features()
+	: _lv2_features((LV2_Feature**)malloc(sizeof(LV2_Feature*)))
+{
+	_lv2_features[0] = NULL;
+
+	LV2URIMap* controller = new LV2URIMap();
+	add_feature(LV2_URI_MAP_URI, &controller->uri_map_feature, controller);
+}
+
+
+const LV2Features::Feature*
+LV2Features::feature(const std::string& uri)
+{
+	Features::const_iterator i = _features.find(uri);
+	if (i != _features.end())
+		return &i->second;
+	else
+		return NULL;
+}
+
+
+void
+LV2Features::add_feature(const std::string& uri, LV2_Feature* feature, void* controller)
+{
+#ifndef NDEBUG
+	Features::const_iterator i = _features.find(uri);
+	assert(i == _features.end());
+	assert(_lv2_features[_features.size()] == NULL);
+#endif
+	_features.insert(make_pair(uri, Feature(feature, controller)));
+
+	_lv2_features = (LV2_Feature**)realloc(_lv2_features, _features.size() + 1);
+	_lv2_features[_features.size()-1] = feature;
+	_lv2_features[_features.size()] = NULL;
+}
+	
+
+} // namespace Shared
+} // namespace Ingen
diff --git a/src/libs/shared/LV2Features.hpp b/src/libs/shared/LV2Features.hpp
new file mode 100644
index 00000000..3a174aa2
--- /dev/null
+++ b/src/libs/shared/LV2Features.hpp
@@ -0,0 +1,63 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2008 Dave Robillard <http://drobilla.net>
+ * 
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ * 
+ * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef LV2FEATURES_HPP
+#define LV2FEATURES_HPP
+
+#include CONFIG_H_PATH
+#ifndef HAVE_SLV2
+#error "This file requires SLV2, but HAVE_SLV2 is not defined.  Please report."
+#endif
+
+#include <map>
+#include <string>
+#include <slv2/slv2.h>
+	
+namespace Ingen {
+namespace Shared {
+	
+
+/** Stuff that may need to be passed to an LV2 plugin (i.e. LV2 features).
+ */
+class LV2Features {
+public:
+	LV2Features();
+
+	struct Feature {
+		Feature(LV2_Feature* f, void* c=NULL) : feature(f), controller(c) {}
+		LV2_Feature* feature;    ///< LV2 feature struct (plugin exposed)
+		void*        controller; ///< Ingen internals, not exposed to plugin
+	};
+
+	typedef std::map<std::string, Feature> Features;
+	
+	const Feature* feature(const std::string& uri);
+	
+	void add_feature(const std::string& uri, LV2_Feature* feature, void* controller);
+
+	LV2_Feature** lv2_features() const { return _lv2_features; }
+
+private:
+	Features      _features;
+	LV2_Feature** _lv2_features;
+};
+
+
+} // namespace Shared
+} // namespace Ingen
+
+#endif // LV2FEATURES_HPP
diff --git a/src/libs/shared/LV2URIMap.cpp b/src/libs/shared/LV2URIMap.cpp
new file mode 100644
index 00000000..3c38886f
--- /dev/null
+++ b/src/libs/shared/LV2URIMap.cpp
@@ -0,0 +1,66 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2008 Dave Robillard <http://drobilla.net>
+ * 
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ * 
+ * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#define __STDC_LIMIT_MACROS 1
+#include <cassert>
+#include <iostream>
+#include <stdint.h>
+#include "LV2URIMap.hpp"
+
+using namespace std;
+
+namespace Ingen {
+namespace Shared {
+	
+
+LV2URIMap::LV2URIMap()
+	: next_uri_id(1)
+{
+	uri_map_feature_data.uri_to_id = &LV2URIMap::uri_map_uri_to_id;
+	uri_map_feature_data.callback_data = this;
+	uri_map_feature.URI = LV2_URI_MAP_URI;
+	uri_map_feature.data = &uri_map_feature_data;
+}
+
+
+uint32_t
+LV2URIMap::uri_map_uri_to_id(LV2_URI_Map_Callback_Data callback_data,
+                             const char*               map,
+                             const char*               uri)
+{
+	// TODO: map ignored, < UINT16_MAX assumed
+	
+	LV2URIMap* me = (LV2URIMap*)callback_data;
+	uint32_t ret = 0;
+
+	URIMap::iterator i = me->uri_map.find(uri);
+	if (i != me->uri_map.end()) {
+		ret = i->second;
+	} else {
+		ret = me->next_uri_id++;
+		me->uri_map.insert(make_pair(string(uri), ret));
+	}
+	
+	cout << "URI MAP (" << map << "): " << uri << " -> " << ret << endl; 
+
+	assert(ret <= UINT16_MAX);
+	return ret;
+}
+
+
+} // namespace Shared
+} // namespace Ingen
diff --git a/src/libs/shared/LV2URIMap.hpp b/src/libs/shared/LV2URIMap.hpp
new file mode 100644
index 00000000..0c947560
--- /dev/null
+++ b/src/libs/shared/LV2URIMap.hpp
@@ -0,0 +1,57 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2008 Dave Robillard <http://drobilla.net>
+ * 
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ * 
+ * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef LV2URIMAP_HPP
+#define LV2URIMAP_HPP
+
+#include CONFIG_H_PATH
+#ifndef HAVE_SLV2
+#error "This file requires SLV2, but HAVE_SLV2 is not defined.  Please report."
+#endif
+
+#include <map>
+#include <string>
+#include <slv2/slv2.h>
+#include "common/lv2ext/lv2_uri_map.h"
+	
+namespace Ingen {
+namespace Shared {
+	
+
+/** Stuff that may need to be passed to an LV2 plugin (i.e. LV2 features).
+ */
+class LV2URIMap {
+public:
+	LV2URIMap();
+
+	typedef std::map<std::string, uint32_t> URIMap;
+	
+	LV2_Feature         uri_map_feature;
+	LV2_URI_Map_Feature uri_map_feature_data;
+	URIMap              uri_map;
+	uint32_t            next_uri_id;
+
+	static uint32_t uri_map_uri_to_id(LV2_URI_Map_Callback_Data callback_data,
+	                                  const char*               map,
+	                                  const char*               uri);
+};
+
+
+} // namespace Shared
+} // namespace Ingen
+
+#endif // LV2URIMAP_HPP
diff --git a/src/libs/shared/Makefile.am b/src/libs/shared/Makefile.am
new file mode 100644
index 00000000..4609926f
--- /dev/null
+++ b/src/libs/shared/Makefile.am
@@ -0,0 +1,9 @@
+noinst_LTLIBRARIES = libingen_shared.la
+
+libingen_shared_la_CXXFLAGS = @INGEN_CFLAGS@
+
+libingen_shared_la_SOURCES = \
+	LV2Features.hpp \
+	LV2Features.cpp \
+	LV2URIMap.cpp \
+	LV2URIMap.hpp
-- 
cgit v1.2.1