@@ -19,41 +19,26 @@ Packagers can make use of the 'PREFIX' and 'DESTDIR' variable during install, li | |||
The required build dependencies are: <i>(devel packages of these)</i> | |||
- JACK | |||
- liblo | |||
- Qt4 | |||
- PyQt4 | |||
- Python3 | |||
- PyQt4 (Py3 version) | |||
Optional but recommended: | |||
- FluidSynth | |||
- LinuxSampler | |||
Optional for extended LV2 UIs support: | |||
- Gtk2 | |||
- Gtk3 | |||
- Suil | |||
On Debian and Ubuntu, use these commands to install all dependencies: <br/> | |||
`$ sudo apt-get install libjack-dev liblo-dev libqt4-dev libfluidsynth-dev` <br/> | |||
On Debian and Ubuntu, use these commands to install all build dependencies: <br/> | |||
`$ sudo apt-get install libjack-dev libqt4-dev` <br/> | |||
`$ sudo apt-get install qt4-dev-tools python-qt4-dev python3-pyqt4 pyqt4-dev-tools` | |||
NOTE: linuxsampler is not packaged in either Debian or Ubuntu, but it's available in KXStudio. <br/> | |||
<br/> | |||
To run all the apps/tools, you'll additionally need: | |||
- python3-dbus | |||
- python3-liblo | |||
- python3-dbus.mainloop.qt | |||
Optional but recommended: | |||
- a2jmidid | |||
- jack-capture | |||
- python3-rdflib | |||
- pulseaudio-module-jack | |||
- pulseaudio[-module-jack] | |||
The 'Cadence' and 'Catia' apps rely on jackdbus to work properly (either JACK2 or JACK1+DBus patch). <br/> | |||
The 'Cadence' app relies on jackdbus to work properly (either JACK2 or JACK1+DBus patch). <br/> | |||
Claudia is a LADISH frontend, so it will obviously require LADISH to run. | |||
The python version used and tested is python3.2. <br/> | |||
@@ -67,28 +52,39 @@ All tools require Python3 and Qt4, some of them work on Windows and Mac. <br/> | |||
Here's the required run-time dependencies of each of the main tools: | |||
### Cadence | |||
Recommends a2jmidid (>= 8) and jackdbus <br/> | |||
Recommends a2jmidid (>= 7) and jackdbus <br/> | |||
Suggests pulseaudio[-module-jack] <br/> | |||
<br/> | |||
### Cadence-JackMeter | |||
Requires jack <br/> | |||
<br/> | |||
### Cadence-JackSettings | |||
Requires jackdbus <br/> | |||
<br/> | |||
### Cadence-Logs | |||
No special requirements <br/> | |||
<br/> | |||
### Cadence-Render | |||
Requires jack-capture <br/> | |||
<br/> | |||
### Cadence-XY Controller | |||
Requires jack <br/> | |||
<br/> | |||
### Catarina | |||
No special requirements <br/> | |||
<br/> | |||
### Catia | |||
Recommends a2jmidid (>= 8) and jackdbus <br/> | |||
Recommends a2jmidid (>= 7) and jackdbus <br/> | |||
<br/> | |||
### Claudia [Linux only] <br/> | |||
Requires jackdbus and ladish <br/> | |||
Recommends a2jmidid <br/> | |||
<br/> | |||
### Carla | |||
Requires liblo <br/> | |||
Recommends python3-rdflib (for LADSPA-RDF support) <br/> | |||
<br/> | |||
### Carla-Control | |||
Requires python3-liblo <br/> | |||
<br/> |
@@ -24,7 +24,7 @@ all: UI RES CPP | |||
# ------------------------------------------------------------------------------------------------------------------------------------------------------ | |||
UI: cadence catarina catia claudia carla tools | |||
UI: cadence catarina catia claudia tools | |||
cadence: src/ui_cadence.py \ | |||
src/ui_cadence_tb_jack.py src/ui_cadence_tb_alsa.py src/ui_cadence_tb_a2j.py src/ui_cadence_tb_pa.py \ | |||
@@ -42,132 +42,126 @@ claudia: src/ui_claudia.py \ | |||
src/ui_claudia_createroom.py src/ui_claudia_projectname.py src/ui_claudia_projectproperties.py \ | |||
src/ui_claudia_runcustom.py src/ui_claudia_launcher.py src/ui_claudia_launcher_app.py | |||
carla: src/ui_carla.py src/ui_carla_control.py \ | |||
src/ui_carla_about.py src/ui_carla_database.py src/ui_carla_edit.py src/ui_carla_parameter.py src/ui_carla_plugin.py src/ui_carla_refresh.py \ | |||
src/ui_inputdialog_value.py | |||
caitlyn: src/ui_caitlyn.py | |||
tools: \ | |||
src/ui_logs.py src/ui_render.py \ | |||
src/ui_settings_app.py src/ui_settings_jack.py | |||
src/ui_cadence.py: resources/ui/cadence.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_cadence_tb_jack.py: resources/ui/cadence_tb_jack.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_cadence_tb_alsa.py: resources/ui/cadence_tb_alsa.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_cadence_tb_a2j.py: resources/ui/cadence_tb_a2j.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_cadence_tb_pa.py: resources/ui/cadence_tb_pa.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_cadence_rwait.py: resources/ui/cadence_rwait.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_catarina.py: resources/ui/catarina.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_catarina_addgroup.py: resources/ui/catarina_addgroup.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_catarina_removegroup.py: resources/ui/catarina_removegroup.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_catarina_renamegroup.py: resources/ui/catarina_renamegroup.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_catarina_addport.py: resources/ui/catarina_addport.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_catarina_removeport.py: resources/ui/catarina_removeport.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_catarina_renameport.py: resources/ui/catarina_renameport.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_catarina_connectports.py: resources/ui/catarina_connectports.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_catarina_disconnectports.py: resources/ui/catarina_disconnectports.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_catia.py: resources/ui/catia.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_claudia.py: resources/ui/claudia.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_claudia_studioname.py: resources/ui/claudia_studioname.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_claudia_studiolist.py: resources/ui/claudia_studiolist.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_claudia_createroom.py: resources/ui/claudia_createroom.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_claudia_projectname.py: resources/ui/claudia_projectname.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_claudia_projectproperties.py: resources/ui/claudia_projectproperties.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_claudia_runcustom.py: resources/ui/claudia_runcustom.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_claudia_launcher.py: resources/ui/claudia_launcher.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_claudia_launcher_app.py: resources/ui/claudia_launcher_app.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_caitlyn.py: resources/ui/caitlyn.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_carla.py: resources/ui/carla.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_carla_control.py: resources/ui/carla_control.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_carla_about.py: resources/ui/carla_about.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_carla_database.py: resources/ui/carla_database.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_carla_edit.py: resources/ui/carla_edit.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_carla_parameter.py: resources/ui/carla_parameter.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_carla_plugin.py: resources/ui/carla_plugin.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_carla_refresh.py: resources/ui/carla_refresh.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_logs.py: resources/ui/logs.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_render.py: resources/ui/render.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_settings_app.py: resources/ui/settings_app.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_settings_jack.py: resources/ui/settings_jack.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_inputdialog_value.py: resources/ui/inputdialog_value.ui | |||
$(PYUIC) $< -o $@ | |||
src/ui_%.py: resources/ui/%.ui | |||
$(PYUIC) $< -o $@ | |||
# | |||
# src/ui_cadence_tb_jack.py: resources/ui/cadence_tb_jack.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_cadence_tb_alsa.py: resources/ui/cadence_tb_alsa.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_cadence_tb_a2j.py: resources/ui/cadence_tb_a2j.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_cadence_tb_pa.py: resources/ui/cadence_tb_pa.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_cadence_rwait.py: resources/ui/cadence_rwait.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_catarina.py: resources/ui/catarina.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_catarina_addgroup.py: resources/ui/catarina_addgroup.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_catarina_removegroup.py: resources/ui/catarina_removegroup.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_catarina_renamegroup.py: resources/ui/catarina_renamegroup.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_catarina_addport.py: resources/ui/catarina_addport.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_catarina_removeport.py: resources/ui/catarina_removeport.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_catarina_renameport.py: resources/ui/catarina_renameport.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_catarina_connectports.py: resources/ui/catarina_connectports.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_catarina_disconnectports.py: resources/ui/catarina_disconnectports.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_catia.py: resources/ui/catia.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_claudia.py: resources/ui/claudia.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_claudia_studioname.py: resources/ui/claudia_studioname.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_claudia_studiolist.py: resources/ui/claudia_studiolist.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_claudia_createroom.py: resources/ui/claudia_createroom.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_claudia_projectname.py: resources/ui/claudia_projectname.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_claudia_projectproperties.py: resources/ui/claudia_projectproperties.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_claudia_runcustom.py: resources/ui/claudia_runcustom.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_claudia_launcher.py: resources/ui/claudia_launcher.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_claudia_launcher_app.py: resources/ui/claudia_launcher_app.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_caitlyn.py: resources/ui/caitlyn.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_carla.py: resources/ui/carla.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_carla_control.py: resources/ui/carla_control.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_carla_about.py: resources/ui/carla_about.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_carla_database.py: resources/ui/carla_database.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_carla_edit.py: resources/ui/carla_edit.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_carla_parameter.py: resources/ui/carla_parameter.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_carla_plugin.py: resources/ui/carla_plugin.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_carla_refresh.py: resources/ui/carla_refresh.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_logs.py: resources/ui/logs.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_render.py: resources/ui/render.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_settings_app.py: resources/ui/settings_app.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_settings_jack.py: resources/ui/settings_jack.ui | |||
# $(PYUIC) $< -o $@ | |||
# | |||
# src/ui_inputdialog_value.py: resources/ui/inputdialog_value.ui | |||
# $(PYUIC) $< -o $@ | |||
# ------------------------------------------------------------------------------------------------------------------------------------------------------ | |||
@@ -178,34 +172,7 @@ src/resources_rc.py: resources/resources.qrc | |||
# ------------------------------------------------------------------------------------------------------------------------------------------------------ | |||
CPP: caitlib carla-backend carla-bridge carla-discovery jackmeter xycontroller | |||
caitlib: | |||
$(MAKE) -C c++/caitlib | |||
carla-backend: carla-engine carla-native carla-plugin | |||
$(MAKE) -C c++/carla-backend | |||
carla-bridge: | |||
$(MAKE) -C c++/carla-bridge | |||
carla-discovery: | |||
$(MAKE) -C c++/carla-discovery NATIVE=1 | |||
carla-engine: | |||
$(MAKE) -C c++/carla-engine | |||
carla-lilv: | |||
$(MAKE) -C c++/carla-lilv | |||
carla-native: | |||
$(MAKE) -C c++/carla-native | |||
carla-plugin: | |||
$(MAKE) -C c++/carla-plugin | |||
carla-rtmempool: | |||
$(MAKE) -C c++/carla-rtmempool | |||
CPP: jackmeter xycontroller | |||
jackmeter: | |||
$(MAKE) -C c++/jackmeter | |||
@@ -218,62 +185,16 @@ xycontroller: | |||
debug: | |||
$(MAKE) DEBUG=true | |||
doxygen: | |||
$(MAKE) doxygen -C c++/caitlib | |||
$(MAKE) doxygen -C c++/carla-backend | |||
$(MAKE) doxygen -C c++/carla-bridge | |||
$(MAKE) doxygen -C c++/carla-engine | |||
$(MAKE) doxygen -C c++/carla-native | |||
$(MAKE) doxygen -C c++/carla-plugin | |||
# ------------------------------------------------------------------------------------------------------------------------------------------------------ | |||
posix32: | |||
$(MAKE) -C c++/carla-bridge posix32 | |||
$(MAKE) -C c++/carla-discovery posix32 | |||
posix64: | |||
$(MAKE) -C c++/carla-bridge posix64 | |||
$(MAKE) -C c++/carla-discovery posix64 | |||
win32: | |||
$(MAKE) -C c++/carla-bridge win32 | |||
$(MAKE) -C c++/carla-discovery win32 | |||
win64: | |||
$(MAKE) -C c++/carla-bridge win64 | |||
$(MAKE) -C c++/carla-discovery win64 | |||
wine32: | |||
$(MAKE) -C c++/carla-jackbridge wine32 | |||
cp c++/carla-jackbridge/libcarla-jackbridge-win32.dll.so c++/carla-bridge/libcarla-jackbridge-win32.dll | |||
wine64: | |||
$(MAKE) -C c++/carla-jackbridge wine64 | |||
cp c++/carla-jackbridge/libcarla-jackbridge-win64.dll.so c++/carla-bridge/libcarla-jackbridge-win64.dll | |||
# ------------------------------------------------------------------------------------------------------------------------------------------------------ | |||
clean: | |||
$(MAKE) clean -C c++/caitlib | |||
$(MAKE) clean -C c++/carla-backend | |||
$(MAKE) clean -C c++/carla-bridge | |||
$(MAKE) clean -C c++/carla-discovery | |||
$(MAKE) clean -C c++/carla-engine | |||
$(MAKE) clean -C c++/carla-jackbridge | |||
$(MAKE) clean -C c++/carla-lilv | |||
$(MAKE) clean -C c++/carla-native | |||
$(MAKE) clean -C c++/carla-plugin | |||
$(MAKE) clean -C c++/carla-rtmempool | |||
$(MAKE) clean -C c++/jackmeter | |||
$(MAKE) clean -C c++/xycontroller | |||
rm -f *~ src/*~ src/*.pyc src/ui_*.py src/resources_rc.py | |||
rm -rf c++/*/doxygen | |||
install: | |||
# Create directories | |||
install -d $(DESTDIR)$(PREFIX)/bin/ | |||
install -d $(DESTDIR)$(PREFIX)/lib/cadence/ | |||
install -d $(DESTDIR)$(PREFIX)/share/applications/ | |||
install -d $(DESTDIR)$(PREFIX)/share/icons/hicolor/16x16/apps/ | |||
install -d $(DESTDIR)$(PREFIX)/share/icons/hicolor/48x48/apps/ | |||
@@ -300,14 +221,9 @@ install: | |||
data/catia \ | |||
data/claudia \ | |||
data/claudia-launcher \ | |||
data/carla \ | |||
data/carla-control \ | |||
data/carla-standalone \ | |||
data/caitlyn \ | |||
c++/jackmeter/cadence-jackmeter \ | |||
c++/xycontroller/cadence-xycontroller \ | |||
$(DESTDIR)$(PREFIX)/bin/ | |||
# data/cadence-cpufreq | |||
# Install desktop files | |||
install -m 644 data/*.desktop $(DESTDIR)$(PREFIX)/share/applications/ | |||
@@ -318,8 +234,6 @@ install: | |||
install -m 644 resources/16x16/catia.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/16x16/apps/ | |||
install -m 644 resources/16x16/claudia.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/16x16/apps/ | |||
install -m 644 resources/16x16/claudia-launcher.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/16x16/apps/ | |||
install -m 644 resources/16x16/carla.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/16x16/apps/ | |||
install -m 644 resources/16x16/carla-control.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/16x16/apps/ | |||
# Install icons, 48x48 | |||
install -m 644 resources/48x48/cadence.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/48x48/apps/ | |||
@@ -327,8 +241,6 @@ install: | |||
install -m 644 resources/48x48/catia.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/48x48/apps/ | |||
install -m 644 resources/48x48/claudia.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/48x48/apps/ | |||
install -m 644 resources/48x48/claudia-launcher.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/48x48/apps/ | |||
install -m 644 resources/48x48/carla.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/48x48/apps/ | |||
install -m 644 resources/48x48/carla-control.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/48x48/apps/ | |||
# Install icons, 128x128 | |||
install -m 644 resources/128x128/cadence.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/128x128/apps/ | |||
@@ -336,8 +248,6 @@ install: | |||
install -m 644 resources/128x128/catia.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/128x128/apps/ | |||
install -m 644 resources/128x128/claudia.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/128x128/apps/ | |||
install -m 644 resources/128x128/claudia-launcher.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/128x128/apps/ | |||
install -m 644 resources/128x128/carla.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/128x128/apps/ | |||
install -m 644 resources/128x128/carla-control.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/128x128/apps/ | |||
# Install icons, 256x256 | |||
install -m 644 resources/256x256/cadence.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/256x256/apps/ | |||
@@ -345,8 +255,6 @@ install: | |||
install -m 644 resources/256x256/catia.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/256x256/apps/ | |||
install -m 644 resources/256x256/claudia.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/256x256/apps/ | |||
install -m 644 resources/256x256/claudia-launcher.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/256x256/apps/ | |||
install -m 644 resources/256x256/carla.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/256x256/apps/ | |||
install -m 644 resources/256x256/carla-control.png $(DESTDIR)$(PREFIX)/share/icons/hicolor/256x256/apps/ | |||
# Install icons, scalable | |||
install -m 644 resources/scalable/cadence.svg $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/ | |||
@@ -354,19 +262,10 @@ install: | |||
install -m 644 resources/scalable/catia.svg $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/ | |||
install -m 644 resources/scalable/claudia.svg $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/ | |||
install -m 644 resources/scalable/claudia-launcher.svg $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/ | |||
install -m 644 resources/scalable/carla.svg $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/ | |||
install -m 644 resources/scalable/carla-control.svg $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/ | |||
# Install main code | |||
install -m 755 src/*.py $(DESTDIR)$(PREFIX)/share/cadence/src/ | |||
install -m 755 \ | |||
c++/caitlib/*.so \ | |||
c++/carla-backend/*.so \ | |||
c++/carla-bridge/carla-bridge-* \ | |||
c++/carla-discovery/carla-discovery-* \ | |||
$(DESTDIR)$(PREFIX)/lib/cadence/ | |||
# Install addtional stuff for Cadence | |||
install -m 644 data/pulse2jack/* $(DESTDIR)$(PREFIX)/share/cadence/pulse2jack/ | |||
install -m 644 data/70cadence-plugin-paths $(X11_RC_DIR) | |||
@@ -389,47 +288,30 @@ install: | |||
$(DESTDIR)$(PREFIX)/bin/catia \ | |||
$(DESTDIR)$(PREFIX)/bin/claudia \ | |||
$(DESTDIR)$(PREFIX)/bin/claudia-launcher \ | |||
$(DESTDIR)$(PREFIX)/bin/carla \ | |||
$(DESTDIR)$(PREFIX)/bin/carla-control \ | |||
$(DESTDIR)$(PREFIX)/bin/carla-standalone \ | |||
$(DESTDIR)$(PREFIX)/bin/caitlyn \ | |||
$(X11_RC_DIR)/70cadence-plugin-paths \ | |||
$(X11_RC_DIR)/99cadence-session-start | |||
# $(DESTDIR)$(PREFIX)/bin/cadence-cpufreq | |||
# Remove unfinished | |||
rm $(DESTDIR)$(PREFIX)/bin/caitlyn | |||
rm $(DESTDIR)$(PREFIX)/share/applications/caitlyn.desktop | |||
uninstall: | |||
rm -f $(DESTDIR)$(PREFIX)/bin/cadence* | |||
rm -f $(DESTDIR)$(PREFIX)/bin/catarina | |||
rm -f $(DESTDIR)$(PREFIX)/bin/catia | |||
rm -f $(DESTDIR)$(PREFIX)/bin/claudia* | |||
rm -f $(DESTDIR)$(PREFIX)/bin/carla* | |||
rm -f $(DESTDIR)$(PREFIX)/share/applications/cadence.desktop | |||
rm -f $(DESTDIR)$(PREFIX)/share/applications/catarina.desktop | |||
rm -f $(DESTDIR)$(PREFIX)/share/applications/catia.desktop | |||
rm -f $(DESTDIR)$(PREFIX)/share/applications/claudia.desktop | |||
rm -f $(DESTDIR)$(PREFIX)/share/applications/claudia-launcher.desktop | |||
rm -f $(DESTDIR)$(PREFIX)/share/applications/carla.desktop | |||
rm -f $(DESTDIR)$(PREFIX)/share/applications/carla-control.desktop | |||
rm -f $(DESTDIR)$(PREFIX)/share/applications/caitlyn.desktop | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/*/apps/cadence.png | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/*/apps/catarina.png | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/*/apps/catia.png | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/*/apps/claudia.png | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/*/apps/claudia-launcher.png | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/*/apps/carla.png | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/*/apps/carla-control.png | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/cadence.svg | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/catarina.svg | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/catia.svg | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/claudia.svg | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/claudia-launcher.svg | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/carla.svg | |||
rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/carla-control.svg | |||
rm -f $(X11_RC_DIR)/70cadence-plugin-paths | |||
rm -f $(X11_RC_DIR)/99cadence-session-start | |||
rm -rf $(DESTDIR)$(PREFIX)/lib/cadence/ | |||
rm -rf $(DESTDIR)$(PREFIX)/share/cadence/ |
@@ -7,8 +7,6 @@ The tools share the same base source code, so most of them look quite similar (w | |||
Also, lots of custom widgets were coded when needed (like pixmapdial, pixmapkeyboard, patchcanvas and systray). <br/> | |||
They can be re-used in other projects. Contact the author if you need help on that. | |||
Note that the main focus goes to JACK2 (or JACK1+DBus); JACK1 (raw) may not work properly at this point. | |||
===== DESCRIPTIONS ===== | |||
------------------------ | |||
@@ -57,13 +55,3 @@ A multimedia application launcher with LADISH support. <br/> | |||
It searches for installed packages (not binaries), and displays the respective content as a launcher. <br/> | |||
The content is got through an hardcoded database, created and/or modified to suit the target distribution. <br/> | |||
Currently supports Debian and ArchLinux based distros. | |||
### [Carla](http://kxstudio.sourceforge.net/KXStudio:Applications:Carla) | |||
Multi-plugin host for JACK. <br/> | |||
It has some nice features like automation of parameters via MIDI CCs (and send control outputs back to MIDI too) and full OSC control. <br/> | |||
Currently supports LADSPA (including LRDF), DSSI, LV2, and VST plugin formats, with additional GIG, SF2 and SFZ file support via FluidSynth and LinuxSampler. | |||
### [Carla-Control](http://kxstudio.sourceforge.net/KXStudio:Applications:Carla-Control) | |||
An OSC Control GUI for Carla (you get the OSC address from the Carla's about dialog, and connect to it).<br/> | |||
Supports controlling main UI components (Dry/Wet, Volume and Balance), and all plugins parameters. <br/> | |||
Peak values and control outputs are displayed as well. |
@@ -26,9 +26,6 @@ BASE_FLAGS = -O2 -ffast-math -mtune=generic -msse -mfpmath=sse -Wall -Wextra | |||
BASE_FLAGS += -DNDEBUG | |||
endif | |||
32BIT_FLAGS = -m32 | |||
64BIT_FLAGS = -m64 | |||
BUILD_C_FLAGS = $(BASE_FLAGS) -std=c99 $(CFLAGS) | |||
BUILD_CXX_FLAGS = $(BASE_FLAGS) -std=c++0x $(CXXFLAGS) | |||
LINK_FLAGS = $(LDFLAGS) | |||
@@ -37,40 +34,9 @@ ifneq ($(DEBUG),true) | |||
BUILD_CXX_FLAGS += -DQT_NO_DEBUG -DQT_NO_DEBUG_STREAM -DQT_NO_DEBUG_OUTPUT | |||
endif | |||
# -------------------------------------------------------------- | |||
# Modify to enable/disable specific features | |||
# Support for LADSPA, DSSI, LV2 and VST plugins | |||
CARLA_PLUGIN_SUPPORT = true | |||
# Support for GIG, SF2 and SFZ sample banks (through fluidsynth and linuxsampler) | |||
CARLA_SAMPLERS_SUPPORT = true | |||
# Support for Native Audio (ALSA and/or PulseAudio in Linux) | |||
CARLA_RTAUDIO_SUPPORT = true | |||
# Comment this line to not use vestige header | |||
BUILD_CXX_FLAGS += -DVESTIGE_HEADER | |||
# -------------------------------------------------------------- | |||
HAVE_QT5 = $(shell pkg-config --atleast-version 5 QtCore && echo true) | |||
HAVE_JACK = $(shell pkg-config --exists jack && echo true) | |||
# HAVE_JACKSESSION = $(shell pkg-config --atleast-version=0.121.0 jack && echo true) | |||
ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||
HAVE_SUIL = $(shell pkg-config --exists suil-0 && echo true) | |||
endif | |||
ifeq ($(CARLA_SAMPLERS_SUPPORT),true) | |||
HAVE_FLUIDSYNTH = $(shell pkg-config --exists fluidsynth && echo true) | |||
HAVE_LINUXSAMPLER = $(shell pkg-config --exists linuxsampler && echo true) | |||
endif | |||
ifeq ($(CARLA_RTAUDIO_SUPPORT),true) | |||
HAVE_ALSA = $(shell pkg-config --exists alsa && echo true) | |||
HAVE_PULSEAUDIO = $(shell pkg-config --exists libpulse-simple && echo true) | |||
endif | |||
HAVE_QT5 = $(shell pkg-config --atleast-version 5 QtCore && echo true) | |||
HAVE_ZYN_DEPS = $(shell pkg-config --exists fftw3 mxml && echo true) | |||
# Currently broken | |||
# HAVE_JACKSESSION = $(shell pkg-config --atleast-version=0.121.0 jack && echo true) |
@@ -1,36 +0,0 @@ | |||
#!/usr/bin/make -f | |||
# Makefile for caitlib # | |||
# ----------------------------- # | |||
# Created by falkTX | |||
# | |||
include ../Makefile.mk | |||
BUILD_C_FLAGS += -D_GNU_SOURCE -I. | |||
BUILD_C_FLAGS += -fvisibility=hidden -fPIC -std=gnu99 -Werror | |||
BUILD_C_FLAGS += $(shell pkg-config --cflags jack) | |||
LINK_FLAGS += -fPIC -shared -lm -lpthread | |||
LINK_FLAGS += $(shell pkg-config --libs jack) | |||
OBJS = \ | |||
caitlib.o \ | |||
memory_atomic.o \ | |||
# -------------------------------------------------------------- | |||
all: caitlib.so | |||
caitlib.so: $(OBJS) | |||
$(CC) $^ $(LINK_FLAGS) -o $@ && $(STRIP) $@ | |||
doxygen: caitlib.doxygen | |||
doxygen $< | |||
# -------------------------------------------------------------- | |||
.c.o: | |||
$(CC) -c $< $(BUILD_C_FLAGS) -o $@ | |||
clean: | |||
rm -f $(OBJS) *.so *.dll |
@@ -1,697 +0,0 @@ | |||
/* | |||
* Caitlib | |||
* Copyright (C) 2007 Nedko Arnaudov <nedko@arnaudov.name> | |||
* Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program 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 | |||
* any later version. | |||
* | |||
* This program 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 more details. | |||
* | |||
* For a full copy of the GNU General Public License see the COPYING file | |||
*/ | |||
#include <math.h> | |||
#include <stdbool.h> | |||
#include <stdlib.h> | |||
#include <stdio.h> | |||
#include <string.h> | |||
#include <pthread.h> | |||
#include <jack/jack.h> | |||
#include <jack/midiport.h> | |||
#include "caitlib.h" | |||
#include "list.h" | |||
#include "memory_atomic.h" | |||
#define MAX_EVENT_DATA_SIZE 100 | |||
#define MIN_PREALLOCATED_EVENT_COUNT 100 | |||
#define MAX_PREALLOCATED_EVENT_COUNT 1000 | |||
//#define USE_LIST_HEAD_OUTS // incomplete | |||
// ------------------------------------------------------------------------------------------ | |||
typedef struct list_head ListHead; | |||
typedef pthread_mutex_t Mutex; | |||
typedef struct _RawMidiEvent { | |||
ListHead siblings; | |||
jack_midi_data_t data[MAX_EVENT_DATA_SIZE]; | |||
size_t dataSize; | |||
jack_nframes_t time; | |||
double value; // used for special events | |||
} RawMidiEvent; | |||
typedef struct _CaitlibOutPort { | |||
#ifdef USE_LIST_HEAD_OUTS | |||
ListHead siblings; | |||
#endif | |||
uint32_t id; | |||
ListHead queue; | |||
jack_port_t* port; | |||
} CaitlibOutPort; | |||
typedef struct _CaitlibInstance { | |||
bool doProcess, wantEvents; | |||
jack_client_t* client; | |||
jack_port_t* midiIn; | |||
#ifdef USE_LIST_HEAD_OUTS | |||
ListHead outPorts; | |||
#else | |||
uint32_t midiOutCount; | |||
CaitlibOutPort** midiOuts; | |||
#endif | |||
ListHead inQueue; | |||
ListHead inQueuePendingRT; | |||
Mutex mutex; | |||
rtsafe_memory_pool_handle mempool; | |||
} CaitlibInstance; | |||
// ------------------------------------------------------------------------------------------ | |||
#define handlePtr ((CaitlibInstance*)ptr) | |||
static | |||
int jack_process(jack_nframes_t nframes, void* ptr) | |||
{ | |||
if (! handlePtr->doProcess) | |||
return 0; | |||
void* portBuffer; | |||
RawMidiEvent* eventPtr; | |||
jack_position_t transportPos; | |||
jack_transport_state_t transportState = jack_transport_query(handlePtr->client, &transportPos); | |||
if (transportPos.unique_1 != transportPos.unique_2) | |||
transportPos.frame = 0; | |||
// MIDI In | |||
if (handlePtr->wantEvents) | |||
{ | |||
jack_midi_event_t inEvent; | |||
jack_nframes_t inEventCount; | |||
portBuffer = jack_port_get_buffer(handlePtr->midiIn, nframes); | |||
inEventCount = jack_midi_get_event_count(portBuffer); | |||
for (jack_nframes_t i = 0 ; i < inEventCount; i++) | |||
{ | |||
if (jack_midi_event_get(&inEvent, portBuffer, i) != 0) | |||
break; | |||
if (inEvent.size > MAX_EVENT_DATA_SIZE) | |||
continue; | |||
/* allocate memory for buffer copy */ | |||
eventPtr = rtsafe_memory_pool_allocate(handlePtr->mempool); | |||
if (eventPtr == NULL) | |||
{ | |||
//LOG_ERROR("Ignored midi event with size %u because memory allocation failed.", (unsigned int)inEvent.size); | |||
continue; | |||
} | |||
/* copy buffer data */ | |||
memcpy(eventPtr->data, inEvent.buffer, inEvent.size); | |||
eventPtr->dataSize = inEvent.size; | |||
eventPtr->time = transportPos.frame + inEvent.time; | |||
/* Add event buffer to inQueuePendingRT list */ | |||
list_add(&eventPtr->siblings, &handlePtr->inQueuePendingRT); | |||
} | |||
} | |||
if (pthread_mutex_trylock(&handlePtr->mutex) != 0) | |||
return 0; | |||
if (handlePtr->wantEvents) | |||
list_splice_init(&handlePtr->inQueuePendingRT, &handlePtr->inQueue); | |||
#ifdef USE_LIST_HEAD_OUTS | |||
if (transportState == JackTransportRolling) | |||
{ | |||
} | |||
#else | |||
// MIDI Out | |||
if (transportState == JackTransportRolling && handlePtr->midiOutCount > 0) | |||
{ | |||
ListHead* entryPtr; | |||
CaitlibOutPort* outPortPtr; | |||
for (uint32_t i = 0; i < handlePtr->midiOutCount; i++) | |||
{ | |||
outPortPtr = handlePtr->midiOuts[i]; | |||
portBuffer = jack_port_get_buffer(outPortPtr->port, nframes); | |||
jack_midi_clear_buffer(portBuffer); | |||
list_for_each(entryPtr, &outPortPtr->queue) | |||
{ | |||
eventPtr = list_entry(entryPtr, RawMidiEvent, siblings); | |||
if (transportPos.frame > eventPtr->time || transportPos.frame + nframes <= eventPtr->time) | |||
continue; | |||
if (jack_midi_event_write(portBuffer, eventPtr->time - transportPos.frame, eventPtr->data, eventPtr->dataSize) != 0) | |||
break; | |||
} | |||
} | |||
} | |||
#endif | |||
pthread_mutex_unlock(&handlePtr->mutex); | |||
return 0; | |||
} | |||
#undef handlePtr | |||
// ------------------------------------------------------------------------------------------ | |||
// Initialization | |||
CaitlibHandle caitlib_init(const char* instanceName) | |||
{ | |||
CaitlibInstance* handlePtr = (CaitlibInstance*)malloc(sizeof(CaitlibInstance)); | |||
if (handlePtr == NULL) | |||
goto fail; | |||
handlePtr->doProcess = true; | |||
handlePtr->wantEvents = false; | |||
#ifdef USE_LIST_HEAD_OUTS | |||
INIT_LIST_HEAD(&handlePtr->outPorts); | |||
#else | |||
handlePtr->midiOuts = NULL; | |||
handlePtr->midiOutCount = 0; | |||
#endif | |||
INIT_LIST_HEAD(&handlePtr->inQueue); | |||
INIT_LIST_HEAD(&handlePtr->inQueuePendingRT); | |||
if (! rtsafe_memory_pool_create(sizeof(RawMidiEvent), MIN_PREALLOCATED_EVENT_COUNT, MAX_PREALLOCATED_EVENT_COUNT, &handlePtr->mempool)) | |||
goto fail_free; | |||
pthread_mutex_init(&handlePtr->mutex, NULL); | |||
handlePtr->client = jack_client_open(instanceName, JackNullOption, 0); | |||
if (handlePtr->client == NULL) | |||
goto fail_destroyMutex; | |||
handlePtr->midiIn = jack_port_register(handlePtr->client, "midi-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0); | |||
if (handlePtr->midiIn == NULL) | |||
goto fail_closeJack; | |||
if (jack_set_process_callback(handlePtr->client, jack_process, handlePtr) != 0) | |||
goto fail_closeJack; | |||
if (jack_activate(handlePtr->client) != 0) | |||
goto fail_closeJack; | |||
return handlePtr; | |||
fail_closeJack: | |||
jack_client_close(handlePtr->client); | |||
fail_destroyMutex: | |||
pthread_mutex_destroy(&handlePtr->mutex); | |||
//fail_destroy_pool: | |||
rtsafe_memory_pool_destroy(handlePtr->mempool); | |||
fail_free: | |||
free(handlePtr); | |||
fail: | |||
return NULL; | |||
} | |||
#define handlePtr ((CaitlibInstance*)handle) | |||
void caitlib_close(CaitlibHandle handle) | |||
{ | |||
// wait for jack processing to end | |||
handlePtr->doProcess = false; | |||
pthread_mutex_lock(&handlePtr->mutex); | |||
if (handlePtr->client) | |||
{ | |||
#ifdef USE_LIST_HEAD_OUTS | |||
ListHead* entryPtr; | |||
CaitlibOutPort* outPortPtr; | |||
#endif | |||
jack_deactivate(handlePtr->client); | |||
jack_port_unregister(handlePtr->client, handlePtr->midiIn); | |||
#ifdef USE_LIST_HEAD_OUTS | |||
list_for_each(entryPtr, &handlePtr->outPorts) | |||
{ | |||
outPortPtr = list_entry(entryPtr, CaitlibOutPort, siblings); | |||
jack_port_unregister(handlePtr->client, outPortPtr->port); | |||
} | |||
#else | |||
for (uint32_t i = 0; i < handlePtr->midiOutCount; i++) | |||
{ | |||
jack_port_unregister(handlePtr->client, handlePtr->midiOuts[i]->port); | |||
free(handlePtr->midiOuts[i]); | |||
} | |||
#endif | |||
jack_client_close(handlePtr->client); | |||
} | |||
pthread_mutex_unlock(&handlePtr->mutex); | |||
pthread_mutex_destroy(&handlePtr->mutex); | |||
rtsafe_memory_pool_destroy(handlePtr->mempool); | |||
free(handlePtr); | |||
} | |||
uint32_t caitlib_create_port(CaitlibHandle handle, const char* portName) | |||
{ | |||
uint32_t nextId = 0; | |||
// wait for jack processing to end | |||
handlePtr->doProcess = false; | |||
pthread_mutex_lock(&handlePtr->mutex); | |||
// re-allocate pointers (midiOutCount + 1) and find next available ID | |||
{ | |||
#ifdef USE_LIST_HEAD_OUTS | |||
ListHead* entryPtr; | |||
CaitlibOutPort* outPortPtr; | |||
list_for_each(entryPtr, &handlePtr->outPorts) | |||
{ | |||
outPortPtr = list_entry(entryPtr, CaitlibOutPort, siblings); | |||
if (outPortPtr->id == nextId) | |||
{ | |||
nextId++; | |||
continue; | |||
} | |||
} | |||
#else | |||
CaitlibOutPort* oldMidiOuts[handlePtr->midiOutCount]; | |||
for (uint32_t i = 0; i < handlePtr->midiOutCount; i++) | |||
{ | |||
oldMidiOuts[i] = handlePtr->midiOuts[i]; | |||
if (handlePtr->midiOuts[i]->id == nextId) | |||
nextId++; | |||
} | |||
if (handlePtr->midiOuts) | |||
free(handlePtr->midiOuts); | |||
handlePtr->midiOuts = (CaitlibOutPort**)malloc(sizeof(CaitlibOutPort*) * (handlePtr->midiOutCount+1)); | |||
for (uint32_t i = 0; i < handlePtr->midiOutCount; i++) | |||
handlePtr->midiOuts[i] = oldMidiOuts[i]; | |||
#endif | |||
} | |||
// we can continue normal operation now | |||
pthread_mutex_unlock(&handlePtr->mutex); | |||
handlePtr->doProcess = true; | |||
#ifdef USE_LIST_HEAD_OUTS | |||
#else | |||
// create new port | |||
{ | |||
CaitlibOutPort* newPort = (CaitlibOutPort*)malloc(sizeof(CaitlibOutPort)); | |||
newPort->id = nextId; | |||
newPort->port = jack_port_register(handlePtr->client, portName, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0); | |||
INIT_LIST_HEAD(&newPort->queue); | |||
handlePtr->midiOuts[handlePtr->midiOutCount++] = newPort; | |||
} | |||
#endif | |||
return nextId; | |||
} | |||
void caitlib_destroy_port(CaitlibHandle handle, uint32_t port) | |||
{ | |||
// wait for jack processing to end | |||
handlePtr->doProcess = false; | |||
pthread_mutex_lock(&handlePtr->mutex); | |||
#ifdef USE_LIST_HEAD_OUTS | |||
#else | |||
// re-allocate pointers (midiOutCount - 1) | |||
{ | |||
CaitlibOutPort* oldMidiOuts[handlePtr->midiOutCount]; | |||
for (uint32_t i = 0; i < handlePtr->midiOutCount; i++) | |||
oldMidiOuts[i] = handlePtr->midiOuts[i]; | |||
if (handlePtr->midiOuts) | |||
free(handlePtr->midiOuts); | |||
if (handlePtr->midiOutCount == 1) | |||
{ | |||
handlePtr->midiOuts = NULL; | |||
} | |||
else | |||
{ | |||
handlePtr->midiOuts = (CaitlibOutPort**)malloc(sizeof(CaitlibOutPort*) * (handlePtr->midiOutCount-1)); | |||
for (uint32_t i = 0, j = 0; i < handlePtr->midiOutCount; i++) | |||
{ | |||
if (oldMidiOuts[i]->id != port) | |||
handlePtr->midiOuts[j++] = oldMidiOuts[i]; | |||
} | |||
} | |||
handlePtr->midiOutCount--; | |||
} | |||
#endif | |||
pthread_mutex_unlock(&handlePtr->mutex); | |||
handlePtr->doProcess = true; | |||
return; | |||
(void)port; | |||
} | |||
// ------------------------------------------------------------------------------------------ | |||
// Input | |||
void caitlib_want_events(CaitlibHandle handle, bool yesNo) | |||
{ | |||
pthread_mutex_lock(&handlePtr->mutex); | |||
handlePtr->wantEvents = yesNo; | |||
pthread_mutex_unlock(&handlePtr->mutex); | |||
} | |||
MidiEvent* caitlib_get_event(CaitlibHandle handle) | |||
{ | |||
static MidiEvent midiEvent; | |||
ListHead* nodePtr; | |||
RawMidiEvent* rawEventPtr; | |||
pthread_mutex_lock(&handlePtr->mutex); | |||
if (list_empty(&handlePtr->inQueue)) | |||
{ | |||
pthread_mutex_unlock(&handlePtr->mutex); | |||
return NULL; | |||
} | |||
nodePtr = handlePtr->inQueue.prev; | |||
list_del(nodePtr); | |||
rawEventPtr = list_entry(nodePtr, RawMidiEvent, siblings); | |||
pthread_mutex_unlock(&handlePtr->mutex); | |||
midiEvent.channel = rawEventPtr->data[0] & 0x0F; | |||
midiEvent.time = rawEventPtr->time; | |||
// note off | |||
if (rawEventPtr->dataSize == 3 && (rawEventPtr->data[0] & 0xF0) == MIDI_EVENT_TYPE_NOTE_OFF) | |||
{ | |||
midiEvent.type = MIDI_EVENT_TYPE_NOTE_OFF; | |||
midiEvent.data.note.note = rawEventPtr->data[1]; | |||
midiEvent.data.note.velocity = rawEventPtr->data[2]; | |||
} | |||
// note on | |||
else if (rawEventPtr->dataSize == 3 && (rawEventPtr->data[0] & 0xF0) == MIDI_EVENT_TYPE_NOTE_ON) | |||
{ | |||
midiEvent.type = MIDI_EVENT_TYPE_NOTE_ON; | |||
midiEvent.data.note.note = rawEventPtr->data[1]; | |||
midiEvent.data.note.velocity = rawEventPtr->data[2]; | |||
} | |||
// aftertouch | |||
else if (rawEventPtr->dataSize == 3 && (rawEventPtr->data[0] & 0xF0) == MIDI_EVENT_TYPE_AFTER_TOUCH) | |||
{ | |||
midiEvent.type = MIDI_EVENT_TYPE_AFTER_TOUCH; | |||
midiEvent.data.note.note = rawEventPtr->data[1]; | |||
midiEvent.data.note.velocity = rawEventPtr->data[2]; | |||
} | |||
// control | |||
else if (rawEventPtr->dataSize == 3 && (rawEventPtr->data[0] & 0xF0) == MIDI_EVENT_TYPE_CONTROL) | |||
{ | |||
midiEvent.type = MIDI_EVENT_TYPE_CONTROL; | |||
midiEvent.data.control.controller = rawEventPtr->data[1]; | |||
midiEvent.data.control.value = rawEventPtr->data[2]; | |||
} | |||
// program | |||
else if (rawEventPtr->dataSize == 2 && (rawEventPtr->data[0] & 0xF0) == MIDI_EVENT_TYPE_PROGRAM) | |||
{ | |||
midiEvent.type = MIDI_EVENT_TYPE_PROGRAM; | |||
midiEvent.data.program.value = rawEventPtr->data[1]; | |||
} | |||
// channel pressure | |||
else if (rawEventPtr->dataSize == 2 && (rawEventPtr->data[0] & 0xF0) == MIDI_EVENT_TYPE_CHANNEL_PRESSURE) | |||
{ | |||
midiEvent.type = MIDI_EVENT_TYPE_CHANNEL_PRESSURE; | |||
midiEvent.data.pressure.value = rawEventPtr->data[1]; | |||
} | |||
// pitch wheel | |||
else if (rawEventPtr->dataSize == 3 && (rawEventPtr->data[0] & 0xF0) == MIDI_EVENT_TYPE_PITCH_WHEEL) | |||
{ | |||
midiEvent.type = MIDI_EVENT_TYPE_PITCH_WHEEL; | |||
midiEvent.data.pitchwheel.value = ((rawEventPtr->data[2] << 7) | rawEventPtr->data[1]) - 8192; | |||
} | |||
else | |||
{ | |||
midiEvent.type = MIDI_EVENT_TYPE_NULL; | |||
} | |||
rtsafe_memory_pool_deallocate(handlePtr->mempool, rawEventPtr); | |||
return &midiEvent; | |||
} | |||
// ------------------------------------------------------------------------------------------ | |||
// Output (utils) | |||
void caitlib_midi_encode_control(RawMidiEvent* eventPtr, uint8_t channel, uint8_t control, uint8_t value) | |||
{ | |||
eventPtr->data[0] = MIDI_EVENT_TYPE_CONTROL | (channel & 0x0F); | |||
eventPtr->data[1] = control; | |||
eventPtr->data[2] = value; | |||
eventPtr->dataSize = 3; | |||
} | |||
void caitlib_midi_encode_note_on(RawMidiEvent* eventPtr, uint8_t channel, uint8_t note, uint8_t velocity) | |||
{ | |||
eventPtr->data[0] = MIDI_EVENT_TYPE_NOTE_ON | (channel & 0x0F); | |||
eventPtr->data[1] = note; | |||
eventPtr->data[2] = velocity; | |||
eventPtr->dataSize = 3; | |||
} | |||
void caitlib_midi_encode_note_off(RawMidiEvent* eventPtr, uint8_t channel, uint8_t note, uint8_t velocity) | |||
{ | |||
eventPtr->data[0] = MIDI_EVENT_TYPE_NOTE_OFF | (channel & 0x0F); | |||
eventPtr->data[1] = note; | |||
eventPtr->data[2] = velocity; | |||
eventPtr->dataSize = 3; | |||
} | |||
void caitlib_midi_encode_aftertouch(RawMidiEvent* eventPtr, uint8_t channel, uint8_t note, uint8_t pressure) | |||
{ | |||
eventPtr->data[0] = MIDI_EVENT_TYPE_AFTER_TOUCH | (channel & 0x0F); | |||
eventPtr->data[1] = note; | |||
eventPtr->data[2] = pressure; | |||
eventPtr->dataSize = 3; | |||
} | |||
void caitlib_midi_encode_channel_pressure(RawMidiEvent* eventPtr, uint8_t channel, uint8_t pressure) | |||
{ | |||
eventPtr->data[0] = MIDI_EVENT_TYPE_CHANNEL_PRESSURE | (channel & 0x0F); | |||
eventPtr->data[1] = pressure; | |||
eventPtr->dataSize = 2; | |||
} | |||
void caitlib_midi_encode_program(RawMidiEvent* eventPtr, uint8_t channel, uint8_t program) | |||
{ | |||
eventPtr->data[0] = MIDI_EVENT_TYPE_PROGRAM | (channel & 0x0F); | |||
eventPtr->data[1] = program; | |||
eventPtr->dataSize = 2; | |||
} | |||
void caitlib_midi_encode_pitchwheel(RawMidiEvent* eventPtr, uint8_t channel, int16_t pitchwheel) | |||
{ | |||
pitchwheel += 8192; | |||
eventPtr->data[0] = MIDI_EVENT_TYPE_PITCH_WHEEL | (channel & 0x0F); | |||
eventPtr->data[1] = pitchwheel & 0x7F; | |||
eventPtr->data[2] = pitchwheel >> 7; | |||
eventPtr->dataSize = 3; | |||
} | |||
// ------------------------------------------------------------------------------------------ | |||
// Output | |||
void caitlib_put_event(CaitlibHandle handle, uint32_t port, const MidiEvent* event) | |||
{ | |||
#ifdef USE_LIST_HEAD_OUTS | |||
ListHead* entryPtr; | |||
#endif | |||
RawMidiEvent* eventPtr; | |||
CaitlibOutPort* outPortPtr; | |||
bool portFound = false; | |||
eventPtr = rtsafe_memory_pool_allocate_sleepy(handlePtr->mempool); | |||
eventPtr->time = event->time; | |||
switch (event->type) | |||
{ | |||
case MIDI_EVENT_TYPE_CONTROL: | |||
caitlib_midi_encode_control(eventPtr, event->channel, event->data.control.controller, event->data.control.value); | |||
break; | |||
case MIDI_EVENT_TYPE_NOTE_ON: | |||
caitlib_midi_encode_note_on(eventPtr, event->channel, event->data.note.note, event->data.note.velocity); | |||
break; | |||
case MIDI_EVENT_TYPE_NOTE_OFF: | |||
caitlib_midi_encode_note_off(eventPtr, event->channel, event->data.note.note, event->data.note.velocity); | |||
break; | |||
case MIDI_EVENT_TYPE_AFTER_TOUCH: | |||
caitlib_midi_encode_aftertouch(eventPtr, event->channel, event->data.note.note, event->data.note.velocity); | |||
break; | |||
case MIDI_EVENT_TYPE_CHANNEL_PRESSURE: | |||
caitlib_midi_encode_channel_pressure(eventPtr, event->channel, event->data.pressure.value); | |||
break; | |||
case MIDI_EVENT_TYPE_PROGRAM: | |||
caitlib_midi_encode_program(eventPtr, event->channel, event->data.program.value); | |||
break; | |||
case MIDI_EVENT_TYPE_PITCH_WHEEL: | |||
caitlib_midi_encode_pitchwheel(eventPtr, event->channel, event->data.pitchwheel.value); | |||
break; | |||
default: | |||
return; | |||
} | |||
pthread_mutex_lock(&handlePtr->mutex); | |||
#ifdef USE_LIST_HEAD_OUTS | |||
list_for_each(entryPtr, &handlePtr->outPorts) | |||
{ | |||
outPortPtr = list_entry(entryPtr, CaitlibOutPort, siblings); | |||
if (outPortPtr->id == port) | |||
{ | |||
list_add_tail(&eventPtr->siblings, &outPortPtr->queue); | |||
break; | |||
} | |||
} | |||
#else | |||
for (uint32_t i = 0; i < handlePtr->midiOutCount; i++) | |||
{ | |||
outPortPtr = handlePtr->midiOuts[i]; | |||
if (outPortPtr->id == port) | |||
{ | |||
portFound = true; | |||
list_add_tail(&eventPtr->siblings, &outPortPtr->queue); | |||
break; | |||
} | |||
} | |||
#endif | |||
if (! portFound) | |||
printf("caitlib_put_event(%p, %i, %p) - failed to find port", handle, port, event); | |||
pthread_mutex_unlock(&handlePtr->mutex); | |||
} | |||
void caitlib_put_control(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t control, uint8_t value) | |||
{ | |||
MidiEvent event; | |||
event.type = MIDI_EVENT_TYPE_CONTROL; | |||
event.channel = channel; | |||
event.time = time; | |||
event.data.control.controller = control; | |||
event.data.control.value = value; | |||
caitlib_put_event(handle, port, &event); | |||
} | |||
void caitlib_put_note_on(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t note, uint8_t velocity) | |||
{ | |||
MidiEvent event; | |||
event.type = MIDI_EVENT_TYPE_NOTE_ON; | |||
event.channel = channel; | |||
event.time = time; | |||
event.data.note.note = note; | |||
event.data.note.velocity = velocity; | |||
caitlib_put_event(handle, port, &event); | |||
} | |||
void caitlib_put_note_off(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t note, uint8_t velocity) | |||
{ | |||
MidiEvent event; | |||
event.type = MIDI_EVENT_TYPE_NOTE_OFF; | |||
event.channel = channel; | |||
event.time = time; | |||
event.data.note.note = note; | |||
event.data.note.velocity = velocity; | |||
caitlib_put_event(handle, port, &event); | |||
} | |||
void caitlib_put_aftertouch(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t note, uint8_t pressure) | |||
{ | |||
MidiEvent event; | |||
event.type = MIDI_EVENT_TYPE_AFTER_TOUCH; | |||
event.channel = channel; | |||
event.time = time; | |||
event.data.note.note = note; | |||
event.data.note.velocity = pressure; | |||
caitlib_put_event(handle, port, &event); | |||
} | |||
void caitlib_put_channel_pressure(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t pressure) | |||
{ | |||
MidiEvent event; | |||
event.type = MIDI_EVENT_TYPE_CHANNEL_PRESSURE; | |||
event.channel = channel; | |||
event.time = time; | |||
event.data.pressure.value = pressure; | |||
caitlib_put_event(handle, port, &event); | |||
} | |||
void caitlib_put_program(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t program) | |||
{ | |||
MidiEvent event; | |||
event.type = MIDI_EVENT_TYPE_PROGRAM; | |||
event.channel = channel; | |||
event.time = time; | |||
event.data.program.value = program; | |||
caitlib_put_event(handle, port, &event); | |||
} | |||
void caitlib_put_pitchwheel(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, int16_t value) | |||
{ | |||
MidiEvent event; | |||
event.type = MIDI_EVENT_TYPE_PITCH_WHEEL; | |||
event.channel = channel; | |||
event.time = time; | |||
event.data.pitchwheel.value = value; | |||
caitlib_put_event(handle, port, &event); | |||
} |
@@ -1,287 +0,0 @@ | |||
# Doxyfile 1.7.6.1 | |||
#--------------------------------------------------------------------------- | |||
# Project related configuration options | |||
#--------------------------------------------------------------------------- | |||
DOXYFILE_ENCODING = UTF-8 | |||
PROJECT_NAME = "Caitlib" | |||
PROJECT_NUMBER = | |||
PROJECT_BRIEF = | |||
PROJECT_LOGO = | |||
OUTPUT_DIRECTORY = ../../doc/caitlib | |||
CREATE_SUBDIRS = NO | |||
OUTPUT_LANGUAGE = English | |||
BRIEF_MEMBER_DESC = YES | |||
REPEAT_BRIEF = YES | |||
ABBREVIATE_BRIEF = | |||
ALWAYS_DETAILED_SEC = NO | |||
INLINE_INHERITED_MEMB = NO | |||
FULL_PATH_NAMES = YES | |||
STRIP_FROM_PATH = | |||
STRIP_FROM_INC_PATH = | |||
SHORT_NAMES = NO | |||
JAVADOC_AUTOBRIEF = NO | |||
QT_AUTOBRIEF = NO | |||
MULTILINE_CPP_IS_BRIEF = NO | |||
INHERIT_DOCS = YES | |||
SEPARATE_MEMBER_PAGES = NO | |||
TAB_SIZE = 4 | |||
ALIASES = | |||
TCL_SUBST = | |||
OPTIMIZE_OUTPUT_FOR_C = NO | |||
OPTIMIZE_OUTPUT_JAVA = NO | |||
OPTIMIZE_FOR_FORTRAN = NO | |||
OPTIMIZE_OUTPUT_VHDL = NO | |||
EXTENSION_MAPPING = | |||
BUILTIN_STL_SUPPORT = NO | |||
CPP_CLI_SUPPORT = NO | |||
SIP_SUPPORT = NO | |||
IDL_PROPERTY_SUPPORT = YES | |||
DISTRIBUTE_GROUP_DOC = NO | |||
SUBGROUPING = YES | |||
INLINE_GROUPED_CLASSES = NO | |||
INLINE_SIMPLE_STRUCTS = NO | |||
TYPEDEF_HIDES_STRUCT = NO | |||
SYMBOL_CACHE_SIZE = 0 | |||
LOOKUP_CACHE_SIZE = 0 | |||
#--------------------------------------------------------------------------- | |||
# Build related configuration options | |||
#--------------------------------------------------------------------------- | |||
EXTRACT_ALL = YES | |||
EXTRACT_PRIVATE = NO | |||
EXTRACT_STATIC = NO | |||
EXTRACT_LOCAL_CLASSES = YES | |||
EXTRACT_LOCAL_METHODS = NO | |||
EXTRACT_ANON_NSPACES = NO | |||
HIDE_UNDOC_MEMBERS = NO | |||
HIDE_UNDOC_CLASSES = NO | |||
HIDE_FRIEND_COMPOUNDS = NO | |||
HIDE_IN_BODY_DOCS = NO | |||
INTERNAL_DOCS = NO | |||
CASE_SENSE_NAMES = YES | |||
HIDE_SCOPE_NAMES = NO | |||
SHOW_INCLUDE_FILES = YES | |||
FORCE_LOCAL_INCLUDES = NO | |||
INLINE_INFO = YES | |||
SORT_MEMBER_DOCS = NO | |||
SORT_BRIEF_DOCS = NO | |||
SORT_MEMBERS_CTORS_1ST = NO | |||
SORT_GROUP_NAMES = NO | |||
SORT_BY_SCOPE_NAME = NO | |||
STRICT_PROTO_MATCHING = NO | |||
GENERATE_TODOLIST = YES | |||
GENERATE_TESTLIST = YES | |||
GENERATE_BUGLIST = YES | |||
GENERATE_DEPRECATEDLIST= YES | |||
ENABLED_SECTIONS = | |||
MAX_INITIALIZER_LINES = 30 | |||
SHOW_USED_FILES = YES | |||
SHOW_DIRECTORIES = NO | |||
SHOW_FILES = YES | |||
SHOW_NAMESPACES = YES | |||
FILE_VERSION_FILTER = | |||
LAYOUT_FILE = | |||
CITE_BIB_FILES = | |||
#--------------------------------------------------------------------------- | |||
# configuration options related to warning and progress messages | |||
#--------------------------------------------------------------------------- | |||
QUIET = NO | |||
WARNINGS = YES | |||
WARN_IF_UNDOCUMENTED = YES | |||
WARN_IF_DOC_ERROR = YES | |||
WARN_NO_PARAMDOC = NO | |||
WARN_FORMAT = "$file:$line: $text" | |||
WARN_LOGFILE = | |||
#--------------------------------------------------------------------------- | |||
# configuration options related to the input files | |||
#--------------------------------------------------------------------------- | |||
INPUT = | |||
INPUT_ENCODING = UTF-8 | |||
FILE_PATTERNS = | |||
RECURSIVE = NO | |||
EXCLUDE = caitlib.c list.h memory_atomic.h memory_atomic.c | |||
EXCLUDE_SYMLINKS = NO | |||
EXCLUDE_PATTERNS = | |||
EXCLUDE_SYMBOLS = | |||
EXAMPLE_PATH = | |||
EXAMPLE_PATTERNS = | |||
EXAMPLE_RECURSIVE = NO | |||
IMAGE_PATH = | |||
INPUT_FILTER = | |||
FILTER_PATTERNS = | |||
FILTER_SOURCE_FILES = NO | |||
FILTER_SOURCE_PATTERNS = | |||
#--------------------------------------------------------------------------- | |||
# configuration options related to source browsing | |||
#--------------------------------------------------------------------------- | |||
SOURCE_BROWSER = NO | |||
INLINE_SOURCES = NO | |||
STRIP_CODE_COMMENTS = YES | |||
REFERENCED_BY_RELATION = NO | |||
REFERENCES_RELATION = NO | |||
REFERENCES_LINK_SOURCE = YES | |||
USE_HTAGS = NO | |||
VERBATIM_HEADERS = YES | |||
#--------------------------------------------------------------------------- | |||
# configuration options related to the alphabetical class index | |||
#--------------------------------------------------------------------------- | |||
ALPHABETICAL_INDEX = YES | |||
COLS_IN_ALPHA_INDEX = 5 | |||
IGNORE_PREFIX = | |||
#--------------------------------------------------------------------------- | |||
# configuration options related to the HTML output | |||
#--------------------------------------------------------------------------- | |||
GENERATE_HTML = YES | |||
HTML_OUTPUT = . | |||
HTML_FILE_EXTENSION = .html | |||
HTML_HEADER = | |||
HTML_FOOTER = | |||
HTML_STYLESHEET = | |||
HTML_EXTRA_FILES = | |||
HTML_COLORSTYLE_HUE = 220 | |||
HTML_COLORSTYLE_SAT = 100 | |||
HTML_COLORSTYLE_GAMMA = 80 | |||
HTML_TIMESTAMP = YES | |||
HTML_ALIGN_MEMBERS = YES | |||
HTML_DYNAMIC_SECTIONS = NO | |||
GENERATE_DOCSET = NO | |||
DOCSET_FEEDNAME = "Doxygen generated docs" | |||
DOCSET_BUNDLE_ID = org.doxygen.Project | |||
DOCSET_PUBLISHER_ID = org.doxygen.Publisher | |||
DOCSET_PUBLISHER_NAME = Publisher | |||
GENERATE_HTMLHELP = NO | |||
CHM_FILE = | |||
HHC_LOCATION = | |||
GENERATE_CHI = NO | |||
CHM_INDEX_ENCODING = | |||
BINARY_TOC = NO | |||
TOC_EXPAND = NO | |||
GENERATE_QHP = NO | |||
QCH_FILE = | |||
QHP_NAMESPACE = org.doxygen.Project | |||
QHP_VIRTUAL_FOLDER = doc | |||
QHP_CUST_FILTER_NAME = | |||
QHP_CUST_FILTER_ATTRS = | |||
QHP_SECT_FILTER_ATTRS = | |||
QHG_LOCATION = | |||
GENERATE_ECLIPSEHELP = NO | |||
ECLIPSE_DOC_ID = org.doxygen.Project | |||
DISABLE_INDEX = NO | |||
GENERATE_TREEVIEW = NO | |||
ENUM_VALUES_PER_LINE = 4 | |||
USE_INLINE_TREES = NO | |||
TREEVIEW_WIDTH = 250 | |||
EXT_LINKS_IN_WINDOW = NO | |||
FORMULA_FONTSIZE = 10 | |||
FORMULA_TRANSPARENT = YES | |||
USE_MATHJAX = NO | |||
MATHJAX_RELPATH = http://www.mathjax.org/mathjax | |||
MATHJAX_EXTENSIONS = | |||
SEARCHENGINE = YES | |||
SERVER_BASED_SEARCH = NO | |||
#--------------------------------------------------------------------------- | |||
# configuration options related to the LaTeX output | |||
#--------------------------------------------------------------------------- | |||
GENERATE_LATEX = NO | |||
LATEX_OUTPUT = latex | |||
LATEX_CMD_NAME = latex | |||
MAKEINDEX_CMD_NAME = makeindex | |||
COMPACT_LATEX = NO | |||
PAPER_TYPE = a4 | |||
EXTRA_PACKAGES = | |||
LATEX_HEADER = | |||
LATEX_FOOTER = | |||
PDF_HYPERLINKS = YES | |||
USE_PDFLATEX = YES | |||
LATEX_BATCHMODE = NO | |||
LATEX_HIDE_INDICES = NO | |||
LATEX_SOURCE_CODE = NO | |||
LATEX_BIB_STYLE = plain | |||
#--------------------------------------------------------------------------- | |||
# configuration options related to the RTF output | |||
#--------------------------------------------------------------------------- | |||
GENERATE_RTF = NO | |||
RTF_OUTPUT = rtf | |||
COMPACT_RTF = NO | |||
RTF_HYPERLINKS = NO | |||
RTF_STYLESHEET_FILE = | |||
RTF_EXTENSIONS_FILE = | |||
#--------------------------------------------------------------------------- | |||
# configuration options related to the man page output | |||
#--------------------------------------------------------------------------- | |||
GENERATE_MAN = NO | |||
MAN_OUTPUT = man | |||
MAN_EXTENSION = .3 | |||
MAN_LINKS = NO | |||
#--------------------------------------------------------------------------- | |||
# configuration options related to the XML output | |||
#--------------------------------------------------------------------------- | |||
GENERATE_XML = NO | |||
XML_OUTPUT = xml | |||
XML_SCHEMA = | |||
XML_DTD = | |||
XML_PROGRAMLISTING = YES | |||
#--------------------------------------------------------------------------- | |||
# configuration options for the AutoGen Definitions output | |||
#--------------------------------------------------------------------------- | |||
GENERATE_AUTOGEN_DEF = NO | |||
#--------------------------------------------------------------------------- | |||
# configuration options related to the Perl module output | |||
#--------------------------------------------------------------------------- | |||
GENERATE_PERLMOD = NO | |||
PERLMOD_LATEX = NO | |||
PERLMOD_PRETTY = YES | |||
PERLMOD_MAKEVAR_PREFIX = | |||
#--------------------------------------------------------------------------- | |||
# Configuration options related to the preprocessor | |||
#--------------------------------------------------------------------------- | |||
ENABLE_PREPROCESSING = YES | |||
MACRO_EXPANSION = NO | |||
EXPAND_ONLY_PREDEF = NO | |||
SEARCH_INCLUDES = YES | |||
INCLUDE_PATH = | |||
INCLUDE_FILE_PATTERNS = | |||
PREDEFINED = DOXYGEN | |||
EXPAND_AS_DEFINED = | |||
SKIP_FUNCTION_MACROS = YES | |||
#--------------------------------------------------------------------------- | |||
# Configuration::additions related to external references | |||
#--------------------------------------------------------------------------- | |||
TAGFILES = | |||
GENERATE_TAGFILE = | |||
ALLEXTERNALS = NO | |||
EXTERNAL_GROUPS = YES | |||
PERL_PATH = /usr/bin/perl | |||
#--------------------------------------------------------------------------- | |||
# Configuration options related to the dot tool | |||
#--------------------------------------------------------------------------- | |||
CLASS_DIAGRAMS = YES | |||
MSCGEN_PATH = | |||
HIDE_UNDOC_RELATIONS = YES | |||
HAVE_DOT = NO | |||
DOT_NUM_THREADS = 0 | |||
DOT_FONTNAME = Helvetica | |||
DOT_FONTSIZE = 10 | |||
DOT_FONTPATH = | |||
CLASS_GRAPH = YES | |||
COLLABORATION_GRAPH = YES | |||
GROUP_GRAPHS = YES | |||
UML_LOOK = NO | |||
TEMPLATE_RELATIONS = NO | |||
INCLUDE_GRAPH = YES | |||
INCLUDED_BY_GRAPH = YES | |||
CALL_GRAPH = NO | |||
CALLER_GRAPH = NO | |||
GRAPHICAL_HIERARCHY = YES | |||
DIRECTORY_GRAPH = YES | |||
DOT_IMAGE_FORMAT = png | |||
INTERACTIVE_SVG = NO | |||
DOT_PATH = | |||
DOTFILE_DIRS = | |||
MSCFILE_DIRS = | |||
DOT_GRAPH_MAX_NODES = 50 | |||
MAX_DOT_GRAPH_DEPTH = 0 | |||
DOT_TRANSPARENT = NO | |||
DOT_MULTI_TARGETS = YES | |||
GENERATE_LEGEND = YES | |||
DOT_CLEANUP = YES |
@@ -1,268 +0,0 @@ | |||
/* | |||
* Caitlib | |||
* Copyright (C) 2007 Nedko Arnaudov <nedko@arnaudov.name> | |||
* Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program 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 | |||
* any later version. | |||
* | |||
* This program 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 more details. | |||
* | |||
* For a full copy of the GNU General Public License see the COPYING file | |||
*/ | |||
#ifndef CAITLIB_INCLUDED | |||
#define CAITLIB_INCLUDED | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#else | |||
# include <stdbool.h> | |||
#endif | |||
#include <stdint.h> | |||
#ifdef _WIN32 | |||
# define CAITLIB_EXPORT __declspec (dllexport) | |||
#else | |||
# define CAITLIB_EXPORT __attribute__ ((visibility("default"))) | |||
#endif | |||
/*! | |||
* @defgroup CaitlibAPI Caitlib API | |||
* | |||
* The Caitlib API | |||
* | |||
* @{ | |||
*/ | |||
/*! | |||
* Native handle for all Caitlib calls. | |||
*/ | |||
typedef void* CaitlibHandle; | |||
/*! | |||
* @defgroup MidiEventType MidiEvent Type | |||
* @{ | |||
*/ | |||
#define MIDI_EVENT_TYPE_NULL 0x00 //!< Null Event. | |||
#define MIDI_EVENT_TYPE_NOTE_OFF 0x80 //!< Note-Off Event, uses Note data. | |||
#define MIDI_EVENT_TYPE_NOTE_ON 0x90 //!< Note-On Event, uses Note data. | |||
#define MIDI_EVENT_TYPE_AFTER_TOUCH 0xA0 //!< [Key] AfterTouch Event, uses Note data. | |||
#define MIDI_EVENT_TYPE_CONTROL 0xB0 //!< Control Event, uses Control data. | |||
#define MIDI_EVENT_TYPE_PROGRAM 0xC0 //!< Program Event, uses Program data. | |||
#define MIDI_EVENT_TYPE_CHANNEL_PRESSURE 0xD0 //!< Channel Pressure Event, uses Pressure data. | |||
#define MIDI_EVENT_TYPE_PITCH_WHEEL 0xE0 //!< PitchWheel Event, uses PitchWheel data. | |||
#define MIDI_EVENT_TYPE_TIME 0xF1 //!< Time Event, uses Time Data. | |||
/**@}*/ | |||
/*! | |||
* MidiEvent in Caitlib | |||
*/ | |||
typedef struct _MidiEvent | |||
{ | |||
/*! | |||
* MidiEvent Type | |||
*/ | |||
uint16_t type; | |||
/*! | |||
* MidiEvent Channel (0 - 16) | |||
*/ | |||
uint8_t channel; | |||
/*! | |||
* MidiEvent Data (values depend on type). | |||
* \note Time event types ignore channel value. | |||
*/ | |||
union MidiEventData { | |||
struct MidiEventControl { | |||
uint8_t controller; | |||
uint8_t value; | |||
} control; | |||
struct MidiEventNote { | |||
uint8_t note; | |||
uint8_t velocity; | |||
} note; | |||
struct MidiEventPressure { | |||
uint8_t value; | |||
} pressure; | |||
struct MidiEventProgram { | |||
uint8_t value; | |||
} program; | |||
struct MidiEventPitchWheel { | |||
int16_t value; | |||
} pitchwheel; | |||
struct MidiEventTime { | |||
double bpm; | |||
uint8_t sigNum; | |||
uint8_t sigDenum; | |||
} time; | |||
#ifndef DOXYGEN | |||
// padding for future events | |||
struct _MidiEventPadding { | |||
uint8_t pad[128]; | |||
} __padding; | |||
#endif | |||
} data; | |||
/*! | |||
* MidiEvent Time (in frames) | |||
*/ | |||
uint32_t time; | |||
} MidiEvent; | |||
// ------------------------------------------------------------------------------------------ | |||
/*! | |||
* @defgroup Initialization | |||
* | |||
* Functions for initialization and destruction of Caitlib instances. | |||
* @{ | |||
*/ | |||
/*! | |||
* Initialize a new Caitlib instance with name \a instanceName.\n | |||
* Must be closed when no longer needed with caitlib_close(). | |||
* | |||
* \note MIDI Input is disabled by default, call caitlib_want_events() to enable them. | |||
* \note There are no MIDI Output ports by default, call caitlib_create_port() for that. | |||
*/ | |||
CAITLIB_EXPORT | |||
CaitlibHandle caitlib_init(const char* instanceName); | |||
/*! | |||
* Close a previously opened Caitlib instance.\n | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_close(CaitlibHandle handle); | |||
/*! | |||
* Create a new MIDI Output port with name \a portName.\n | |||
* The return value is the ID for the port, which must be passed for any functions in the Output group.\n | |||
* The ID will be >= 0 for a valid port, or -1 if an error occurred. | |||
*/ | |||
CAITLIB_EXPORT | |||
uint32_t caitlib_create_port(CaitlibHandle handle, const char* portName); | |||
/*! | |||
* Close a previously opened Caitlib instance.\n | |||
* There's no need to call this function before caitlib_close(). | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_destroy_port(CaitlibHandle handle, uint32_t port); | |||
/**@}*/ | |||
// ------------------------------------------------------------------------------------------ | |||
/*! | |||
* @defgroup Input | |||
* | |||
* Functions for MIDI Input handling. | |||
* @{ | |||
*/ | |||
/*! | |||
* Tell a Caitlib instance wherever if we're interested in MIDI Input.\n | |||
* By default MIDI Input is disabled.\n | |||
* It's safe to call this function multiple times during the lifetime of an instance. | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_want_events(CaitlibHandle handle, bool yesNo); | |||
/*! | |||
* Get a MidiEvent from a Caitlib instance buffer.\n | |||
* When there are no more messages in the buffer, this function returns NULL. | |||
*/ | |||
CAITLIB_EXPORT | |||
MidiEvent* caitlib_get_event(CaitlibHandle handle); | |||
/**@}*/ | |||
// ------------------------------------------------------------------------------------------ | |||
/*! | |||
* @defgroup Output | |||
* | |||
* Functions for putting data into Caitlib instances (MIDI Output). | |||
* @{ | |||
*/ | |||
/*! | |||
* Put a MIDI event into a Caitlib instance port. | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_put_event(CaitlibHandle handle, uint32_t port, const MidiEvent* event); | |||
/*! | |||
* Put a MIDI Control event into a Caitlib instance port. | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_put_control(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t controller, uint8_t value); | |||
/*! | |||
* Put a MIDI Note On event into a Caitlib instance port. | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_put_note_on(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t note, uint8_t velocity); | |||
/*! | |||
* Put a MIDI Note Off event into a Caitlib instance port. | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_put_note_off(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t note, uint8_t velocity); | |||
/*! | |||
* Put a MIDI AfterTouch event into a Caitlib instance port. | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_put_aftertouch(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t note, uint8_t pressure); | |||
/*! | |||
* Put a MIDI Channel Pressure event into a Caitlib instance port. | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_put_channel_pressure(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t pressure); | |||
/*! | |||
* Put a MIDI Program event into a Caitlib instance port. | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_put_program(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, uint8_t program); | |||
/*! | |||
* Put a MIDI PitchWheel event into a Caitlib instance port. | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_put_pitchwheel(CaitlibHandle handle, uint32_t port, uint32_t time, uint8_t channel, int16_t value); | |||
/*! | |||
* Put a MIDI Time event into a Caitlib instance. | |||
*/ | |||
CAITLIB_EXPORT | |||
void caitlib_put_time(CaitlibHandle handle, uint32_t time, double bpm, uint8_t sigNum, uint8_t sigDenum); | |||
/**@}*/ | |||
// ------------------------------------------------------------------------------------------ | |||
/**@}*/ | |||
#ifdef __cplusplus | |||
} | |||
#endif | |||
#endif // CAITLIB_INCLUDED |
@@ -1,33 +0,0 @@ | |||
# QtCreator project file | |||
CONFIG = debug | |||
CONFIG += link_pkgconfig warn_on # plugin shared | |||
DEFINES = DEBUG | |||
DEFINES += QTCREATOR_TEST | |||
DEFINES += _GNU_SOURCE | |||
PKGCONFIG = jack | |||
TARGET = caitlib | |||
TEMPLATE = app # lib | |||
VERSION = 0.0.1 | |||
SOURCES = \ | |||
caitlib.c \ | |||
memory_atomic.c | |||
SOURCES += \ | |||
test.c | |||
HEADERS = \ | |||
caitlib.h | |||
INCLUDEPATH = . | |||
QMAKE_CFLAGS *= -fvisibility=hidden -fPIC -Wextra -Werror -std=gnu99 | |||
unix { | |||
LIBS = -lm -lpthread | |||
} |
@@ -1,874 +0,0 @@ | |||
/* -*- Mode: C ; c-basic-offset: 2 -*- */ | |||
/***************************************************************************** | |||
* | |||
* Linux kernel header adapted for user-mode | |||
* The 2.6.17-rt1 version was used. | |||
* | |||