app/chuck: pass Env to session connections, input support
- Initialize RtAudio with component env. - Mouse and keyboard input support. - Audio synthesis run scenarios. Fix #73
This commit is contained in:
committed by
Norman Feske
parent
a44aa90660
commit
73948ac1b2
@@ -1 +1 @@
|
||||
416a1ffb4a3df426721b3b9397f79b77b966dee4
|
||||
2856c7d09ad0c66a73abbe3c5ee9c26b3c6afea5
|
||||
|
||||
@@ -1 +1 @@
|
||||
29f078484fc78b073c45daabc0832ebf609d029d
|
||||
a6c198729121ca06af9304670430b2959f7ffbbd
|
||||
|
||||
@@ -4,9 +4,9 @@ DOWNLOADS := rtaudio.archive
|
||||
|
||||
OWNER := ehmry
|
||||
REPO := rtaudio
|
||||
REV := bde69fff7cf263552e27b33ca0db63e8c239e20e
|
||||
REV := 4dc7017ccbae09231a4f8a48ac11a388171e95b3
|
||||
URL(rtaudio) := https://github.com/$(OWNER)/$(REPO)/archive/$(REV).tar.gz
|
||||
SHA(rtaudio) := e519e49d636818d2dcb95fc0fc3daf1e8c59704b
|
||||
SHA(rtaudio) := 83414b09e48757d91f60fc936402501ec1a6bb8c
|
||||
DIR(rtaudio) := src/lib/rtaudio
|
||||
|
||||
DIRS := include/RtAudio
|
||||
|
||||
131
run/chuck.run
Normal file
131
run/chuck.run
Normal file
@@ -0,0 +1,131 @@
|
||||
assert_spec x86
|
||||
|
||||
# Xmllint throws errors on inline chuck code
|
||||
proc check_xml_syntax {xml_file} { }
|
||||
|
||||
#
|
||||
# Build
|
||||
#
|
||||
|
||||
set build_components {
|
||||
core init
|
||||
app/chuck
|
||||
drivers/audio
|
||||
drivers/timer
|
||||
}
|
||||
|
||||
source ${genode_dir}/repos/base/run/platform_drv.inc
|
||||
append_platform_drv_build_components
|
||||
|
||||
build $build_components
|
||||
|
||||
create_boot_directory
|
||||
|
||||
#
|
||||
# Config
|
||||
#
|
||||
|
||||
append config {
|
||||
<config>
|
||||
<parent-provides>
|
||||
<service name="CPU"/>
|
||||
<service name="IO_MEM"/>
|
||||
<service name="IO_PORT"/>
|
||||
<service name="IRQ"/>
|
||||
<service name="LOG"/>
|
||||
<service name="PD"/>
|
||||
<service name="RAM"/>
|
||||
<service name="RM"/>
|
||||
<service name="ROM"/>
|
||||
</parent-provides>
|
||||
<default-route>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</default-route>
|
||||
<start name="timer">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides><service name="Timer"/></provides>
|
||||
</start>}
|
||||
|
||||
append_platform_drv_config
|
||||
|
||||
append config {
|
||||
<start name="audio_drv">
|
||||
<binary name="} [audio_drv_binary] {"/>
|
||||
<resource name="RAM" quantum="8M"/>
|
||||
<provides> <service name="Audio_out"/> </provides>
|
||||
<config/>
|
||||
</start>
|
||||
<start name="chuck">
|
||||
<resource name="RAM" quantum="32M"/>
|
||||
<config dac_channels="2" adc_channels="0">
|
||||
<libc stdout="/log" stderr="/log"/>
|
||||
<vfs> <log/>
|
||||
<inline name="test">
|
||||
// another candidate for lamest demo
|
||||
|
||||
// patch
|
||||
SinOsc s => JCRev r => dac;
|
||||
.5 => r.gain;
|
||||
.075 => r.mix;
|
||||
|
||||
// note number
|
||||
20 => float note;
|
||||
|
||||
// go up to 127
|
||||
while( note < 128 )
|
||||
{
|
||||
// convert MIDI note to hz
|
||||
Std.mtof( note ) => s.freq;
|
||||
// turn down the volume gradually
|
||||
.5 - (note/256.0) => s.gain;
|
||||
|
||||
// move up by whole step
|
||||
note + 2 => note;
|
||||
|
||||
// advance time
|
||||
.125::second => now;
|
||||
}
|
||||
|
||||
// turn off s
|
||||
0 => s.gain;
|
||||
// wait a bit
|
||||
2::second => now;
|
||||
|
||||
</inline>
|
||||
</vfs>
|
||||
<file path="/test"/>
|
||||
</config>
|
||||
<route>
|
||||
<any-service><parent/><any-child/></any-service>
|
||||
</route>
|
||||
</start>
|
||||
</config>}
|
||||
|
||||
install_config $config
|
||||
|
||||
#
|
||||
# Boot modules
|
||||
#
|
||||
|
||||
append boot_modules {
|
||||
core init ld.lib.so
|
||||
timer
|
||||
chuck
|
||||
libogg.lib.so
|
||||
libFLAC.lib.so
|
||||
libsndfile.lib.so
|
||||
libvorbis.lib.so
|
||||
pthread.lib.so
|
||||
stdcxx.lib.so
|
||||
libc.lib.so
|
||||
libm.lib.so
|
||||
} [audio_drv_binary] {
|
||||
}
|
||||
|
||||
append_platform_drv_boot_modules
|
||||
|
||||
build_boot_image $boot_modules
|
||||
|
||||
append qemu_args " -m 128 -nographic -soundhw es1370 "
|
||||
|
||||
run_genode_until {child "chuck" exited with exit value 0} 60
|
||||
193
run/chuck_keyboard.run
Normal file
193
run/chuck_keyboard.run
Normal file
@@ -0,0 +1,193 @@
|
||||
assert_spec x86
|
||||
|
||||
# Xmllint throws errors on inline chuck code
|
||||
proc check_xml_syntax {xml_file} { }
|
||||
|
||||
#
|
||||
# Build
|
||||
#
|
||||
|
||||
set build_components {
|
||||
core init
|
||||
app/chuck
|
||||
drivers/audio
|
||||
drivers/timer
|
||||
}
|
||||
|
||||
source ${genode_dir}/repos/base/run/platform_drv.inc
|
||||
append_platform_drv_build_components
|
||||
|
||||
lappend_if [have_spec ps2] build_components drivers/input/spec/ps2
|
||||
lappend_if [have_spec sdl] build_components drivers/framebuffer/spec/sdl
|
||||
|
||||
build $build_components
|
||||
|
||||
create_boot_directory
|
||||
|
||||
#
|
||||
# Config
|
||||
#
|
||||
|
||||
append config {
|
||||
<config>
|
||||
<parent-provides>
|
||||
<service name="CPU"/>
|
||||
<service name="IO_MEM"/>
|
||||
<service name="IO_PORT"/>
|
||||
<service name="IRQ"/>
|
||||
<service name="LOG"/>
|
||||
<service name="PD"/>
|
||||
<service name="RAM"/>
|
||||
<service name="RM"/>
|
||||
<service name="ROM"/>
|
||||
</parent-provides>
|
||||
<default-route>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</default-route>
|
||||
<start name="timer">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides><service name="Timer"/></provides>
|
||||
</start>}
|
||||
|
||||
append_platform_drv_config
|
||||
|
||||
append_if [have_spec ps2] config {
|
||||
<start name="ps2_drv">
|
||||
<resource name="RAM" quantum="2M"/>
|
||||
<provides><service name="Input"/></provides>
|
||||
<config verbose_keyboard="no" verbose_mouse="no" verbose_scancodes="no"/>
|
||||
<route>
|
||||
<service name="ROM"> <parent/> </service>
|
||||
<service name="CPU"> <parent/> </service>
|
||||
<service name="RAM"> <parent/> </service>
|
||||
<service name="PD"> <parent/> </service>
|
||||
<service name="IO_PORT"> <parent/> </service>
|
||||
<service name="LOG"> <parent/> </service>
|
||||
<service name="Platform"> <any-child/> </service>
|
||||
</route>
|
||||
</start>
|
||||
<alias name="input_drv" child="ps2_drv"/>}
|
||||
|
||||
append_if [have_spec sdl] config {
|
||||
<start name="fb_sdl">
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<provides> <service name="Input"/> <service name="Framebuffer"/> </provides>
|
||||
<route>
|
||||
<service name="ROM"> <parent/> </service>
|
||||
<service name="CPU"> <parent/> </service>
|
||||
<service name="RAM"> <parent/> </service>
|
||||
<service name="PD"> <parent/> </service>
|
||||
<service name="LOG"> <parent/> </service>
|
||||
<service name="Timer"> <child name="timer"/> </service>
|
||||
</route>
|
||||
</start>
|
||||
<alias name="input_drv" child="fb_sdl"/>}
|
||||
|
||||
append config {
|
||||
<start name="audio_drv">
|
||||
<binary name="} [audio_drv_binary] {"/>
|
||||
<resource name="RAM" quantum="8M"/>
|
||||
<provides> <service name="Audio_out"/> </provides>
|
||||
<config/>
|
||||
</start>
|
||||
<start name="chuck">
|
||||
<resource name="RAM" quantum="32M"/>
|
||||
<config dac_channels="2" adc_channels="0">
|
||||
<libc stdout="/log" stderr="/log"/>
|
||||
<vfs> <log/>
|
||||
<inline name="test">
|
||||
// HID
|
||||
Hid hi;
|
||||
HidMsg msg;
|
||||
|
||||
// which keyboard
|
||||
0 => int device;
|
||||
// get from command line
|
||||
if( me.args() ) me.arg(0) => Std.atoi => device;
|
||||
|
||||
// open keyboard (get device number from command line)
|
||||
if( !hi.openKeyboard( device ) ) me.exit();
|
||||
<<< "keyboard '" + hi.name() + "' ready", "" >>>;
|
||||
|
||||
// patch
|
||||
BeeThree organ => JCRev r => Echo e => Echo e2 => dac;
|
||||
r => dac;
|
||||
|
||||
// set delays
|
||||
240::ms => e.max => e.delay;
|
||||
480::ms => e2.max => e2.delay;
|
||||
// set gains
|
||||
.6 => e.gain;
|
||||
.3 => e2.gain;
|
||||
.05 => r.mix;
|
||||
0 => organ.gain;
|
||||
|
||||
// infinite event loop
|
||||
while( true )
|
||||
{
|
||||
// wait for event
|
||||
hi => now;
|
||||
|
||||
// get message
|
||||
while( hi.recv( msg ) )
|
||||
{
|
||||
// check
|
||||
if( msg.isButtonDown() )
|
||||
{
|
||||
Std.mtof( msg.which + 45 ) => float freq;
|
||||
if( freq > 20000 ) continue;
|
||||
|
||||
freq => organ.freq;
|
||||
.5 => organ.gain;
|
||||
1 => organ.noteOn;
|
||||
|
||||
80::ms => now;
|
||||
}
|
||||
else
|
||||
{
|
||||
0 => organ.noteOff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</inline>
|
||||
</vfs>
|
||||
<file path="/test"/>
|
||||
</config>
|
||||
<route>
|
||||
<any-service><parent/><any-child/></any-service>
|
||||
</route>
|
||||
</start>
|
||||
</config>}
|
||||
|
||||
install_config $config
|
||||
|
||||
#
|
||||
# Boot modules
|
||||
#
|
||||
|
||||
append boot_modules {
|
||||
core init ld.lib.so
|
||||
timer
|
||||
chuck
|
||||
libogg.lib.so
|
||||
libFLAC.lib.so
|
||||
libsndfile.lib.so
|
||||
libvorbis.lib.so
|
||||
pthread.lib.so
|
||||
stdcxx.lib.so
|
||||
libc.lib.so
|
||||
libm.lib.so
|
||||
} [audio_drv_binary] {
|
||||
}
|
||||
|
||||
lappend_if [have_spec ps2] boot_modules ps2_drv
|
||||
lappend_if [have_spec sdl] boot_modules fb_sdl
|
||||
|
||||
append_platform_drv_boot_modules
|
||||
|
||||
build_boot_image $boot_modules
|
||||
|
||||
append qemu_args " -m 128 -nographic -soundhw es1370 "
|
||||
|
||||
run_genode_until forever
|
||||
227
run/chuck_mouse.run
Normal file
227
run/chuck_mouse.run
Normal file
@@ -0,0 +1,227 @@
|
||||
assert_spec x86
|
||||
|
||||
# Xmllint throws errors on inline chuck code
|
||||
proc check_xml_syntax {xml_file} { }
|
||||
|
||||
#
|
||||
# Build
|
||||
#
|
||||
|
||||
set build_components {
|
||||
core init
|
||||
app/chuck
|
||||
drivers/audio
|
||||
drivers/timer
|
||||
}
|
||||
|
||||
source ${genode_dir}/repos/base/run/platform_drv.inc
|
||||
append_platform_drv_build_components
|
||||
|
||||
lappend_if [have_spec ps2] build_components drivers/input/spec/ps2
|
||||
lappend_if [have_spec sdl] build_components drivers/framebuffer/spec/sdl
|
||||
|
||||
build $build_components
|
||||
|
||||
create_boot_directory
|
||||
|
||||
#
|
||||
# Config
|
||||
#
|
||||
|
||||
append config {
|
||||
<config>
|
||||
<parent-provides>
|
||||
<service name="CPU"/>
|
||||
<service name="IO_MEM"/>
|
||||
<service name="IO_PORT"/>
|
||||
<service name="IRQ"/>
|
||||
<service name="LOG"/>
|
||||
<service name="PD"/>
|
||||
<service name="RAM"/>
|
||||
<service name="RM"/>
|
||||
<service name="ROM"/>
|
||||
</parent-provides>
|
||||
<default-route>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</default-route>
|
||||
<start name="timer">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides><service name="Timer"/></provides>
|
||||
</start>}
|
||||
|
||||
append_platform_drv_config
|
||||
|
||||
append_if [have_spec ps2] config {
|
||||
<start name="ps2_drv">
|
||||
<resource name="RAM" quantum="2M"/>
|
||||
<provides><service name="Input"/></provides>
|
||||
<config verbose_keyboard="no" verbose_mouse="no" verbose_scancodes="no"/>
|
||||
<route>
|
||||
<service name="ROM"> <parent/> </service>
|
||||
<service name="CPU"> <parent/> </service>
|
||||
<service name="RAM"> <parent/> </service>
|
||||
<service name="PD"> <parent/> </service>
|
||||
<service name="IO_PORT"> <parent/> </service>
|
||||
<service name="LOG"> <parent/> </service>
|
||||
<service name="Platform"> <any-child/> </service>
|
||||
</route>
|
||||
</start>
|
||||
<alias name="input_drv" child="ps2_drv"/>}
|
||||
|
||||
append_if [have_spec sdl] config {
|
||||
<start name="fb_sdl">
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<provides> <service name="Input"/> <service name="Framebuffer"/> </provides>
|
||||
<route>
|
||||
<service name="ROM"> <parent/> </service>
|
||||
<service name="CPU"> <parent/> </service>
|
||||
<service name="RAM"> <parent/> </service>
|
||||
<service name="PD"> <parent/> </service>
|
||||
<service name="LOG"> <parent/> </service>
|
||||
<service name="Timer"> <child name="timer"/> </service>
|
||||
</route>
|
||||
</start>
|
||||
<alias name="input_drv" child="fb_sdl"/>}
|
||||
|
||||
append config {
|
||||
<start name="audio_drv">
|
||||
<binary name="} [audio_drv_binary] {"/>
|
||||
<resource name="RAM" quantum="8M"/>
|
||||
<provides> <service name="Audio_out"/> </provides>
|
||||
<config/>
|
||||
</start>
|
||||
<start name="chuck">
|
||||
<resource name="RAM" quantum="32M"/>
|
||||
<config dac_channels="2" adc_channels="0">
|
||||
<libc stdout="/log" stderr="/log"/>
|
||||
<vfs> <log/>
|
||||
<inline name="test">
|
||||
// name: mouse-fm.ck
|
||||
// desc: uses first X/Y axes of a mouse to control mf and index for FM
|
||||
// author: Spencer Salazar
|
||||
|
||||
// which mouse
|
||||
0 => int device;
|
||||
// get from command line
|
||||
if( me.args() ) me.arg(0) => Std.atoi => device;
|
||||
|
||||
// modulator to carrier
|
||||
SinOsc m => SinOsc c => Envelope e => dac;
|
||||
|
||||
// carrier frequency
|
||||
220 => c.freq;
|
||||
// modulator frequency
|
||||
550 => m.freq;
|
||||
// index of modulation
|
||||
1000 => m.gain;
|
||||
|
||||
// phase modulation is FM synthesis (sync is 2)
|
||||
2 => c.sync;
|
||||
|
||||
// attack
|
||||
10::ms => e.duration;
|
||||
.5 => e.gain;
|
||||
// variables
|
||||
int base;
|
||||
float a0;
|
||||
float a1;
|
||||
float a2;
|
||||
int count;
|
||||
|
||||
// start things
|
||||
set( base, a0, a1, a2 );
|
||||
|
||||
// hid objects
|
||||
Hid hi;
|
||||
HidMsg msg;
|
||||
|
||||
// try
|
||||
if( !hi.openMouse( device ) ) me.exit();
|
||||
<<< "mouse '" + hi.name() + "' ready...", "" >>>;
|
||||
|
||||
// infinite time loop
|
||||
while( true )
|
||||
{
|
||||
// wait on event
|
||||
hi => now;
|
||||
// loop over messages
|
||||
while( hi.recv( msg ) )
|
||||
{
|
||||
if( msg.isMouseMotion() )
|
||||
{
|
||||
msg.deltaX * .001 + a0 => a0;
|
||||
//else if( msg.which == 1 ) msg.fdata => a1;
|
||||
msg.deltaY * .001 + a1 => a1;
|
||||
set( base, a0, a1, a2 );
|
||||
}
|
||||
|
||||
else if( msg.isButtonDown() )
|
||||
{
|
||||
msg.which => base;
|
||||
count++;
|
||||
if( count == 1 ) e.keyOn();
|
||||
set( base, a0, a1, a2 );
|
||||
}
|
||||
|
||||
else if( msg.isButtonUp() )
|
||||
{
|
||||
msg.which => base;
|
||||
count--;
|
||||
if( !count ) e.keyOff();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// mapping function
|
||||
fun void set( int base, float v0, float v1, float v2 )
|
||||
{
|
||||
// modulator frequency
|
||||
( 500 + 5*base + ( 500 * v0) ) => m.freq;
|
||||
// carrier frequency
|
||||
( 220 + (220 * v2) ) => c.freq;
|
||||
// index of modulation
|
||||
( 1000 * (v1+1) ) => m.gain;
|
||||
<<< "carrier:", c.freq(), "modulator:", m.freq(), "index:", m.gain() >>>;
|
||||
}
|
||||
|
||||
</inline>
|
||||
</vfs>
|
||||
<file path="/test"/>
|
||||
</config>
|
||||
<route>
|
||||
<any-service><parent/><any-child/></any-service>
|
||||
</route>
|
||||
</start>
|
||||
</config>}
|
||||
|
||||
install_config $config
|
||||
|
||||
#
|
||||
# Boot modules
|
||||
#
|
||||
|
||||
append boot_modules {
|
||||
core init ld.lib.so
|
||||
timer
|
||||
chuck
|
||||
libogg.lib.so
|
||||
libFLAC.lib.so
|
||||
libsndfile.lib.so
|
||||
libvorbis.lib.so
|
||||
pthread.lib.so
|
||||
stdcxx.lib.so
|
||||
libc.lib.so
|
||||
libm.lib.so
|
||||
} [audio_drv_binary] {
|
||||
}
|
||||
|
||||
lappend_if [have_spec ps2] boot_modules ps2_drv
|
||||
lappend_if [have_spec sdl] boot_modules fb_sdl
|
||||
|
||||
append_platform_drv_boot_modules
|
||||
|
||||
build_boot_image $boot_modules
|
||||
|
||||
append qemu_args " -m 128 -nographic -soundhw es1370 "
|
||||
|
||||
run_genode_until forever
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "chuck_console.h"
|
||||
#include "chuck_globals.h"
|
||||
|
||||
#include "util_hid.h"
|
||||
#include "util_math.h"
|
||||
#include "util_string.h"
|
||||
#include "util_thread.h"
|
||||
@@ -57,13 +58,13 @@ struct Main : Chuck_System
|
||||
|
||||
Attached_rom_dataspace config_rom { env, "config" };
|
||||
|
||||
Timer::Connection timer;
|
||||
Timer::Connection timer { env, "chuck" };
|
||||
|
||||
void load_config()
|
||||
{
|
||||
/* compile the config in sequence */
|
||||
config_rom.xml().for_each_sub_node([&] (Xml_node const node) {
|
||||
if (node.has_type("file"))
|
||||
if (node.has_type("file")) {
|
||||
try {
|
||||
Xml_attribute path_attr = node.attribute("path");
|
||||
std::string path(path_attr.value_base(), path_attr.value_size());
|
||||
@@ -77,25 +78,27 @@ struct Main : Chuck_System
|
||||
else
|
||||
log("compiled ", path.c_str());
|
||||
} catch (...) {
|
||||
error("failed to parse file node");
|
||||
error("failed to parse file node ",node);
|
||||
}
|
||||
}
|
||||
|
||||
else if (node.has_type("code"))
|
||||
else if (node.has_type("code")) {
|
||||
try {
|
||||
Xml_attribute path_attr = node.attribute("path");
|
||||
std::string code(node.content_base(), node.content_size());
|
||||
std::string args;
|
||||
if (node.has_attribute("args")) {
|
||||
Xml_attribute args_attr = node.attribute("args");
|
||||
args = std::string(args_attr.value_base(), args_attr.value_size());
|
||||
}
|
||||
if (!compileCode(code, args))
|
||||
if (!compileCode(code, args)) {
|
||||
error("compilation failed");
|
||||
else
|
||||
log(code.c_str());
|
||||
} else
|
||||
log("compiled ", code.c_str());
|
||||
} catch (...) {
|
||||
error("failed to parse code node");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -390,12 +393,16 @@ Main::Main(Genode::Env &env) : env(env)
|
||||
Genode::memset( input, 0, sizeof(SAMPLE)*buffer_size*adc_chans );
|
||||
Genode::memset( output, 0, sizeof(SAMPLE)*buffer_size*dac_chans );
|
||||
|
||||
//timer.sigh(timeout_handler);
|
||||
//timer.trigger_periodic(100000);
|
||||
timer.sigh(timeout_handler);
|
||||
timer.trigger_periodic(100000);
|
||||
};
|
||||
|
||||
#include <RtAudio.h>
|
||||
|
||||
void Libc::Component::construct(Genode::Env &env)
|
||||
void Libc::Component::construct(Libc::Env &env)
|
||||
{
|
||||
init_rtaudio(env);
|
||||
init_input(env);
|
||||
|
||||
static Main inst(env);
|
||||
}
|
||||
|
||||
@@ -219,7 +219,7 @@ index e78b19d..ea349e8 100644
|
||||
//
|
||||
// return FALSE;
|
||||
diff --git a/src/util_hid.cpp b/src/util_hid.cpp
|
||||
index 9c26e2d..b66e87a 100644
|
||||
index 9c26e2d..aea2eb7 100644
|
||||
--- a/src/util_hid.cpp
|
||||
+++ b/src/util_hid.cpp
|
||||
@@ -3725,7 +3725,7 @@ t_CKINT WiiRemote::disconnect()
|
||||
@@ -231,115 +231,138 @@ index 9c26e2d..b66e87a 100644
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -7679,6 +7679,122 @@ const char * Keyboard_name( int k )
|
||||
@@ -7679,6 +7679,145 @@ const char * Keyboard_name( int k )
|
||||
return keyboards->at( k )->name;
|
||||
}
|
||||
|
||||
+#elif defined(__PLATFORM_GENODE__)
|
||||
+
|
||||
+#include <input/keycodes.h>
|
||||
+#include <input_session/connection.h>
|
||||
+#include <util/reconstructible.h>
|
||||
+
|
||||
+static Genode::Signal_context g_input_sig_ctx;
|
||||
+static Genode::Signal_receiver g_input_sig_rec;
|
||||
+static Genode::Env *g_input_env;
|
||||
+
|
||||
+static Input::Connection *g_input_session;
|
||||
+void init_input(Genode::Env &env)
|
||||
+{
|
||||
+ g_input_env = &env;
|
||||
+}
|
||||
+
|
||||
+Genode::Constructible<Input::Connection> g_input_session;
|
||||
+
|
||||
+static int g_input_count = 0;
|
||||
+
|
||||
+void Genode_input_init()
|
||||
+void Hid_init()
|
||||
+{
|
||||
+ if( g_input_session == nullptr ) try {
|
||||
+ g_input_session = new Input::Connection;
|
||||
+ g_input_session->sigh(g_input_sig_rec.manage(&g_input_sig_ctx));
|
||||
+ g_input_count = g_input_count < 1 ? 1 : g_input_count+1;
|
||||
+ } catch ( ... ) { }
|
||||
+ if ( !g_input_session.constructed() ) {
|
||||
+ if ( !g_input_env ) {
|
||||
+ Genode::error("platform input not initialized with 'init_input'");
|
||||
+ throw -1;
|
||||
+ }
|
||||
+ g_input_session.construct( *g_input_env );
|
||||
+ }
|
||||
+ g_input_count = g_input_count < 1 ? 1 : g_input_count+1;
|
||||
+}
|
||||
+
|
||||
+void Genode_input_quit()
|
||||
+// A synchronous RPC poll
|
||||
+void Hid_poll()
|
||||
+{
|
||||
+ if( --g_input_count > 0 ) {
|
||||
+ delete g_input_session;
|
||||
+ g_input_sig_rec.dissolve(&g_input_sig_ctx);
|
||||
+ g_input_session = nullptr;
|
||||
+ }
|
||||
+ g_input_session->for_each_event( [&] ( Input::Event const &ev ) {
|
||||
+ HidMsg msg;
|
||||
+
|
||||
+ switch (ev.type()) {
|
||||
+ case Input::Event::MOTION:
|
||||
+ msg.device_type = CK_HID_DEV_MOUSE;
|
||||
+ msg.type = CK_HID_MOUSE_MOTION;
|
||||
+ msg.idata[0] = ev.ax();
|
||||
+ msg.idata[1] = ev.ay();
|
||||
+ break;
|
||||
+
|
||||
+ case Input::Event::WHEEL:
|
||||
+ msg.device_type = CK_HID_DEV_MOUSE;
|
||||
+ msg.type = CK_HID_MOUSE_WHEEL;
|
||||
+ msg.idata[0] = 0;
|
||||
+ msg.idata[1] = ev.ry();
|
||||
+ break;
|
||||
+
|
||||
+ case Input::Event::PRESS:
|
||||
+ if (ev.code() == Input::BTN_MOUSE)
|
||||
+ msg.device_type = CK_HID_DEV_MOUSE;
|
||||
+ else
|
||||
+ msg.device_type = CK_HID_DEV_KEYBOARD;
|
||||
+ msg.type = CK_HID_BUTTON_DOWN;
|
||||
+ msg.idata[1] = ev.code();
|
||||
+ msg.idata[2] = ev.utf8().b0;
|
||||
+ break;
|
||||
+
|
||||
+ case Input::Event::RELEASE:
|
||||
+ if (ev.code() == Input::BTN_MOUSE)
|
||||
+ msg.device_type = CK_HID_DEV_MOUSE;
|
||||
+ else
|
||||
+ msg.device_type = CK_HID_DEV_KEYBOARD;
|
||||
+ msg.type = CK_HID_BUTTON_UP;
|
||||
+ msg.idata[1] = ev.code();
|
||||
+ msg.idata[2] = ev.utf8().b0;
|
||||
+ break;
|
||||
+
|
||||
+ case Input::Event::FOCUS:
|
||||
+ case Input::Event::LEAVE:
|
||||
+ case Input::Event::TOUCH:
|
||||
+ case Input::Event::INVALID: return;
|
||||
+ }
|
||||
+
|
||||
+ msg.eid = ev.code();
|
||||
+
|
||||
+ HidInManager::push_message( msg );
|
||||
+ });
|
||||
+}
|
||||
+
|
||||
+void Genode_input_poll()
|
||||
+void Hid_quit()
|
||||
+{
|
||||
+ if ( !g_input_sig_rec.pending() )
|
||||
+ return;
|
||||
+ do { g_input_sig_rec.wait_for_signal(); }
|
||||
+ while ( g_input_sig_rec.pending() );
|
||||
+
|
||||
+ g_input_session->for_each_event( [&] ( Input::Event const &ev ) {
|
||||
+ HidMsg msg;
|
||||
+
|
||||
+ switch (ev.type()) {
|
||||
+ case Input::Event::MOTION:
|
||||
+ msg.device_type = CK_HID_DEV_MOUSE;
|
||||
+ msg.type = CK_HID_MOUSE_MOTION;
|
||||
+ msg.idata[0] = ev.ax();
|
||||
+ msg.idata[1] = ev.ay();
|
||||
+ break;
|
||||
+
|
||||
+ case Input::Event::WHEEL:
|
||||
+ msg.device_type = CK_HID_DEV_MOUSE;
|
||||
+ msg.type = CK_HID_MOUSE_WHEEL;
|
||||
+ msg.idata[1] = ev.ry();
|
||||
+ break;
|
||||
+
|
||||
+ case Input::Event::PRESS:
|
||||
+ case Input::Event::RELEASE:
|
||||
+ case Input::Event::FOCUS:
|
||||
+ case Input::Event::LEAVE:
|
||||
+ case Input::Event::TOUCH:
|
||||
+ case Input::Event::INVALID: return;
|
||||
+ }
|
||||
+
|
||||
+ HidInManager::push_message( msg );
|
||||
+ });
|
||||
+ if ( --g_input_count <= 0 && g_input_session.constructed() )
|
||||
+ g_input_session.destruct();
|
||||
+}
|
||||
+
|
||||
+void Hid_init() { }
|
||||
+void Hid_poll() { }
|
||||
+void Hid_quit() { }
|
||||
+void Joystick_init()
|
||||
+{
|
||||
+ Genode::warning("Genode joystick input not implemented");
|
||||
+}
|
||||
+
|
||||
+void Joystick_init() { }
|
||||
+void Joystick_poll() { }
|
||||
+void Joystick_quit() { }
|
||||
+void Joystick_probe() { }
|
||||
+int Joystick_count() { return -1; }
|
||||
+int Joystick_count() { return 0; }
|
||||
+int Joystick_open( int js ) { return -1; }
|
||||
+int Joystick_open_async( int js ) { return -1; }
|
||||
+int Joystick_open( const char * name ) { return -1; }
|
||||
+int Joystick_close( int js ) { return -1; };
|
||||
+int Joystick_send( int js, const HidMsg * msg ) { return -1; }
|
||||
+const char * Joystick_name( int js ) { return ""; }
|
||||
+const char * Joystick_name( int js ) { return "Genode Input session"; }
|
||||
+
|
||||
+void Mouse_init() { Genode_input_init(); }
|
||||
+
|
||||
+void Mouse_poll() { Genode_input_poll(); }
|
||||
+
|
||||
+void Mouse_quit() { Genode_input_quit(); }
|
||||
+void Mouse_init() { Hid_init(); }
|
||||
+void Mouse_poll() { }
|
||||
+void Mouse_quit() { Hid_quit(); }
|
||||
+
|
||||
+void Mouse_probe() { }
|
||||
+int Mouse_count() { return ( g_input_session == nullptr ) ? 1 : -1; }
|
||||
+int Mouse_open( int m ) { return ( g_input_session == nullptr ) ? 1 : -1; }
|
||||
+int Mouse_open( const char * name ) { return ( g_input_session == nullptr ) ? 1 : -1; }
|
||||
+int Mouse_count() { return g_input_session.constructed() ? 1 : 0; }
|
||||
+int Mouse_open( int m ) { return g_input_session.constructed() ? 0 : -1; }
|
||||
+int Mouse_open( const char * name ) { return g_input_session.constructed() ? 0 : -1; }
|
||||
+int Mouse_close( int m ) { return 0; }
|
||||
+int Mouse_send( int m, const HidMsg * msg ) { return -1; }
|
||||
+const char * Mouse_name( int m ) { return ""; }
|
||||
+const char * Mouse_name( int m ) { return "Genode Input session"; }
|
||||
+int Mouse_buttons( int m ) { return 0; }
|
||||
+
|
||||
+void Keyboard_init() { }
|
||||
+void Keyboard_init() { Hid_init(); }
|
||||
+void Keyboard_poll() { }
|
||||
+void Keyboard_quit() { }
|
||||
+void Keyboard_quit() { Hid_quit(); }
|
||||
+void Keyboard_probe() { }
|
||||
+int Keyboard_count() { return -1; }
|
||||
+int Keyboard_open( int kb ) { return -1; }
|
||||
+int Keyboard_open( const char * name ) { return -1; }
|
||||
+int Keyboard_close( int kb ) { return -1; }
|
||||
+const char * Keyboard_name( int kb ) { return ""; }
|
||||
+int Keyboard_count() { return g_input_session.constructed() ? 1 : 0; }
|
||||
+
|
||||
+int Keyboard_open( int kb ) { return g_input_session.constructed() ? 0 : -1; }
|
||||
+
|
||||
+int Keyboard_open( const char * name ) { return g_input_session.constructed() ? 0 : -1; }
|
||||
+int Keyboard_close( int kb ) { return 0; }
|
||||
+const char * Keyboard_name( int kb ) { return "Genode Input session"; }
|
||||
+
|
||||
+t_CKINT TiltSensor_setPollRate( t_CKINT usec )
|
||||
+{
|
||||
@@ -354,6 +377,33 @@ index 9c26e2d..b66e87a 100644
|
||||
#endif
|
||||
|
||||
|
||||
@@ -7735,7 +7874,7 @@ extern int Tablet_open( int ts ) { return -1; }
|
||||
extern int Tablet_close( int ts ) { return -1; }
|
||||
extern const char * Tablet_name( int ts ) { return NULL; }
|
||||
|
||||
-#endif
|
||||
+#endif // __PLATFORM_GENODE__
|
||||
|
||||
|
||||
#ifdef __CHIP_MODE__
|
||||
diff --git a/src/util_hid.h b/src/util_hid.h
|
||||
index 7fa87d3..5527d90 100644
|
||||
--- a/src/util_hid.h
|
||||
+++ b/src/util_hid.h
|
||||
@@ -32,7 +32,13 @@
|
||||
#ifndef __UTIL_HID_H__
|
||||
#define __UTIL_HID_H__
|
||||
|
||||
+#ifdef __PLATFORM_GENODE__
|
||||
|
||||
+#include <base/env.h>
|
||||
+
|
||||
+void init_input(Genode::Env &env);
|
||||
+
|
||||
+#endif // __PLATFORM_GENODE__
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
diff --git a/src/util_sndfile.h b/src/util_sndfile.h
|
||||
index 2a62fd7..a4f4f3b 100644
|
||||
--- a/src/util_sndfile.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
TARGET := chuck
|
||||
|
||||
LIBS = stdcxx libc pthread rtaudio rtmidi liblo libsndfile base libogg libvorbis libFLAC
|
||||
LIBS = stdcxx libc pthread rtaudio liblo libsndfile base libogg libvorbis libFLAC
|
||||
|
||||
CHUCK_DIR = $(call select_from_ports,chuck)/src/app/chuck/src
|
||||
|
||||
|
||||
Reference in New Issue
Block a user