Add a GUI!
This commit is contained in:
parent
1fc79effed
commit
f26a5265f6
4 changed files with 122 additions and 17 deletions
10
dynamite.ttl
10
dynamite.ttl
|
@ -3,6 +3,12 @@
|
|||
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
||||
@prefix doap: <http://usefulinc.com/ns/doap#> .
|
||||
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
|
||||
@prefix guiext: <http://lv2plug.in/ns/extensions/ui#>.
|
||||
@prefix ll: <http://ll-plugins.nongnu.org/lv2/namespace#>.
|
||||
|
||||
<https://github.com/aleksrutins/dynamite/gui> a guiext:GtkUI;
|
||||
guiext:binary <dynamite_gui.so>;
|
||||
guiext:requiredFeature guiext:makeResident.
|
||||
|
||||
<https://github.com/aleksrutins/dynamite> a lv2:Plugin , lv2:AmplifierPlugin , lv2:DistortionPlugin , doap:Project ;
|
||||
lv2:binary <dynamite.so> ;
|
||||
|
@ -14,7 +20,9 @@
|
|||
foaf:name "Aleks Rutins" ;
|
||||
] ;
|
||||
lv2:optionalFeature lv2:hardRTCapable ;
|
||||
|
||||
ll:pegName "p";
|
||||
guiext:ui <https://github.com/aleksrutins/dynamite/gui>;
|
||||
|
||||
lv2:port
|
||||
[
|
||||
a lv2:InputPort , lv2:AudioPort ;
|
||||
|
|
79
gui.cc
Normal file
79
gui.cc
Normal file
|
@ -0,0 +1,79 @@
|
|||
#include <glibmm.h>
|
||||
#include <gtkmm.h>
|
||||
#include <lv2gui.hpp>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "dynamite.peg"
|
||||
|
||||
using namespace sigc;
|
||||
using namespace Gtk;
|
||||
|
||||
namespace Dynamite {
|
||||
class LabeledWidget : public VBox {
|
||||
public:
|
||||
LabeledWidget(const Glib::ustring &label, Widget &child) {
|
||||
add(child);
|
||||
add(*manage(new Label(label)));
|
||||
}
|
||||
};
|
||||
|
||||
class DriveGUI : public LV2::GUI<DriveGUI> {
|
||||
protected:
|
||||
Scale *drive_scale;
|
||||
Scale *threshold_scale;
|
||||
Scale *gain_scale;
|
||||
Scale *mix_scale;
|
||||
Scale *create_vscale(p_port_enum nport) {
|
||||
auto port = p_ports[nport];
|
||||
auto result = manage(new VScale(port.min, port.max, 0.01));
|
||||
auto scale_slot = bind<0>(bind<0>(bind<0>(&DriveGUI::write_control_ptr, this), (uint32_t)nport), result);
|
||||
result->signal_value_changed().connect(scale_slot);
|
||||
return result;
|
||||
}
|
||||
public:
|
||||
DriveGUI(const std::string &url) {
|
||||
auto vbox = manage(new VBox(false, 6));
|
||||
auto hbox = manage(new HBox(false, 6));
|
||||
|
||||
vbox->add(*manage(new Label("Dynamite")));
|
||||
|
||||
drive_scale = create_vscale(p_drive);
|
||||
hbox->add(*manage(new LabeledWidget("Drive", *drive_scale)));
|
||||
threshold_scale = create_vscale(p_threshold);
|
||||
hbox->add(*manage(new LabeledWidget("Threshold", *threshold_scale)));
|
||||
gain_scale = create_vscale(p_gain);
|
||||
hbox->add(*manage(new LabeledWidget("Gain", *gain_scale)));
|
||||
|
||||
vbox->add(*hbox);
|
||||
|
||||
auto mix = p_ports[p_mix];
|
||||
mix_scale = manage(new HScale(mix.min, mix.max, 0.01));
|
||||
auto mix_slot = bind<0>(bind<0>(bind<0>(&DriveGUI::write_control_ptr, this), (uint32_t)p_mix), mix_scale);
|
||||
mix_scale->signal_value_changed().connect(mix_slot);
|
||||
vbox->add(*manage(new LabeledWidget("Mix", *mix_scale)));
|
||||
add(*vbox);
|
||||
}
|
||||
|
||||
static void write_control_ptr(DriveGUI *self, uint32_t port, Scale *ctrl) {
|
||||
self->write_control(port, ctrl->get_value());
|
||||
}
|
||||
|
||||
void port_event(uint32_t port, uint32_t buffer_size, uint32_t format, const void *buffer) {
|
||||
auto value = *static_cast<const float *>(buffer);
|
||||
switch((p_port_enum)port) {
|
||||
case p_drive:
|
||||
drive_scale->set_value(value); break;
|
||||
case p_threshold:
|
||||
threshold_scale->set_value(value); break;
|
||||
case p_gain:
|
||||
gain_scale->set_value(value); break;
|
||||
case p_mix:
|
||||
mix_scale->set_value(value); break;
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static int _ = Dynamite::DriveGUI::register_class("https://github.com/aleksrutins/dynamite/gui");
|
10
install.sh
10
install.sh
|
@ -1,10 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
: "${PREFIX:="$HOME/.lv2"}"
|
||||
|
||||
meson builddir
|
||||
ninja -C builddir
|
||||
|
||||
rm -rf $PREFIX/dynamite.lv2
|
||||
mkdir -p $PREFIX/dynamite.lv2
|
||||
cp {dynamite,manifest}.ttl builddir/dynamite.{so,dylib,dll} $PREFIX/dynamite.lv2/
|
40
meson.build
40
meson.build
|
@ -2,11 +2,6 @@ project('dynamite', 'cpp',
|
|||
version : '0.1',
|
||||
default_options : ['warning_level=3', 'cpp_std=c++14'])
|
||||
|
||||
srcs = [
|
||||
'dynamite.cc',
|
||||
'plugin.cc',
|
||||
]
|
||||
|
||||
# These arguments are only used to build the shared library
|
||||
# not the executables that use the library.
|
||||
lib_args = [
|
||||
|
@ -21,8 +16,24 @@ lib_args = [
|
|||
|
||||
cc = meson.get_compiler('cpp')
|
||||
|
||||
lv2peg = find_program('lv2peg')
|
||||
|
||||
peg = custom_target('dynamite.peg',
|
||||
output: 'dynamite.peg',
|
||||
input: 'dynamite.ttl',
|
||||
command: [lv2peg, '@INPUT@', '@OUTPUT@'],
|
||||
install: false
|
||||
)
|
||||
|
||||
srcs = [
|
||||
'dynamite.cc',
|
||||
'plugin.cc',
|
||||
peg
|
||||
]
|
||||
|
||||
shlib = shared_library('dynamite', srcs,
|
||||
install : false,
|
||||
install : true,
|
||||
install_dir : 'lib64/lv2/dynamite.lv2',
|
||||
cpp_args : lib_args,
|
||||
gnu_symbol_visibility : 'hidden',
|
||||
name_prefix : '',
|
||||
|
@ -34,6 +45,23 @@ shlib = shared_library('dynamite', srcs,
|
|||
]
|
||||
)
|
||||
|
||||
guilib = shared_library('dynamite_gui', ['gui.cc', peg],
|
||||
install: true,
|
||||
install_dir: 'lib64/lv2/dynamite.lv2',
|
||||
cpp_args: lib_args,
|
||||
gnu_symbol_visibility: 'hidden',
|
||||
name_prefix: '',
|
||||
dependencies: [
|
||||
dependency('lv2'),
|
||||
dependency('lv2-plugin'),
|
||||
dependency('lv2-gui'),
|
||||
dependency('threads'),
|
||||
dependency('gtkmm-2.4')
|
||||
]
|
||||
)
|
||||
|
||||
install_data(['manifest.ttl', 'dynamite.ttl'], install_dir: 'lib64/lv2/dynamite.lv2')
|
||||
|
||||
# test_exe = executable('dynamite_test', 'dynamite_test.cpp',
|
||||
# link_with : shlib)
|
||||
# test('dynamite', test_exe)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue