didn't work for me. maybe you are using the event fh? I didn't want to give permissions on it, so I refactored to use the Joystick class. Forgive me, I never hack perl :P Here's some code:
#!/usr/bin/perl
# Rock Band Drum Controller Player
# Copyright (C) 2008 Timm Murray
#
# 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 3 of the License, or
# (at your option) 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.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
#
use strict;
use warnings;
use Linux::Input::Joystick;
use IO::Select;
use SDL;
use SDL::Sound;
use SDL::Mixer;
use YAML;
use constant DEBUG => 0;
my $DEV = shift;
die "Need a device\n" unless $DEV;
my %SOUNDS = (
snare => 'rock_band_drums/snare.wav',
drum => 'rock_band_drums/drum.wav',
hi_hat => 'rock_band_drums/hi_hat.wav',
smash => 'rock_band_drums/crash.wav',
bass => 'rock_band_drums/bass.wav',
);
# 4 = foot
# left to right
# 2, 3, 0, 1
my %EVENTS = (
4 => $SOUNDS{bass}, # Foot
2 => $SOUNDS{snare}, # Red
3 => $SOUNDS{hi_hat}, # Yellow
0 => $SOUNDS{drum}, # Blue
1 => $SOUNDS{smash}, # Green
);
{
my $ret = SDL::MixOpenAudio( 44100, AUDIO_S16, 2, 4096 );
die "Can't open audio: " . SDL_GetError() . "\n" if 0 > $ret;
}
sub debug
{
my (@in) = @_;
return unless DEBUG;
print @in, "\n";
}
sub do_event
{
my ($event) = @_;
my $type = $$event{type} || 0;
my $value = $$event{value} || 0;
my $number = $$event{number} || 0;
debug( "Type [$type], value [$value], number [$number]" );
return 0 if ! exists $EVENTS{$number};
return 0 if $value == 0;
my $file = $EVENTS{$number};
my $sound = SDL::MixLoadWAV( $file );
SDL::MixPlayChannel( -1, $sound, 0 );
return 1;
}
{
my $js1 = Linux::Input::Joystick->new( $DEV );
my $selector = IO::Select->new;
$selector->add( $js1->fh );
while (1) {
while( my @events = $js1->poll ) {
# print Dump($_) foreach (@events);
foreach (@events) {
next unless $$_{type} == 1;
do_event( $_ );
}
}
}
}