I've just reinvented remote-procedure-calls, strings, linked lists and
bunch of other stuff while writing the new standalone C implementation of
Ecasound Control Interface (ECI) (ugh, C, ugh ;)). But I think the work
was worth it. Next I'll demonstrate how to develop a simple app taking
advantage of both JACK and LADSPA (with real-time parameter control) with
a minimum amount of developer effort. If you are now wondering why I'm
writing about this, jump to (6). ;)
--
1. Requirements (for this specific example)
- jack-CVS installed and running
- Steve's plate reverb LADSPA plugin installed
- ecasound-CVS installed
--
2. The Application
--cut--
#include <ecasoundc.h>
int main(int argc, char *argv[])
{
eci_init();
/* create the chainsetup and one chain */
eci_command("cs-add jackdemo_chainsetup");
eci_command("c-add chain1");
/* add the audio inputs and outputs */
eci_command("ai-add foo.wav");
eci_command("ao-add jack_alsa,out");
/* add an LADSPA plate reverb */
eci_command("cop-add -el:plate,50,0.5,0.5");
/* select the 3rd param (wet/dry) for real-time control */
eci_command("copp-select 3");
/* connect the setup and start */
eci_command("cs-connect");
eci_command("start");
while(1) {
double curpos;
sleep(1);
/* fetch current play position */
eci_command("get-position");
curpos = eci_last_float();
if (curpos > 10.0) {
/* at pos=10sec, quit playing */
break;
}
else if (curpos > 5.0) {
/* at pos=5sec, set reverb length to 80% */
eci_command_float_arg("copp-set", 0.8);
}
}
eci_command("stop");
eci_command("cs-disconnect");
eci_cleanup();
return(0);
}
--cut--
---
3. Compiling
gcc -o jackdemo jackdemo.c -lecasoundc
---
4. Running
./jackdemo
---
5. Dependencies
--cut--
###| ~|$ ldd ./jackdemo
libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
###| ~|$ du -h jackdemo
52k jackdemo
###| ~|$ file jackdemo
jackdemo: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses
shared libs), not stripped
--cut--
---
6. The Catch
The created binary, jackdemo, does not rely on any external libraries. No
dependency to ecasound libraries, JACK libraries, C++ runtime, threading
support... just the basic C runtime! In other words jackdemo does not
create depency-hells. ;)
...
PS Although the example looks simple, a lot happens underneath.
'foo.wav' is read using a double-buffering disk i/o subsystem.
If jackdemo is run with root privileges, all memory is locked
and realtime scheduling is used. In otherwords, jackdemo
takes advantage of all known tricks to achieve reliable
audio performance in Linux.
--
http://www.eca.cx
Audio software for Linux!