package Audio::XMMSClient; use strict; use warnings; use Carp; use IO::Handle; use IO::Select; use Audio::XMMSClient::Collection; our $VERSION = 0.03; our @ISA; eval { require XSLoader; XSLoader::load(__PACKAGE__, $VERSION); 1; } or do { require DynaLoader; push @ISA, 'DynaLoader'; bootstrap Audio::XMMSClient $VERSION; }; sub loop { my ($self) = @_; my $fd = IO::Handle->new_from_fd( $self->io_fd_get, 'r+' ); $self->{do_loop} = 1; pipe my $r, my $w; $self->{wakeup} = $w; my $rin = IO::Select->new( $fd, $r ); my $ein = IO::Select->new( $fd ); my $win; while ($self->{do_loop}) { if ($self->io_want_out) { $win = IO::Select->new( $fd ); } else { $win = undef; } my ($i, $o, $e) = IO::Select->select( $rin, $win, $ein ); if (ref $i && @$i && $i->[0] == $fd) { $self->io_in_handle; } if (ref $o && @$o && $o->[0] == $fd) { $self->io_out_handle; } if (ref $e && @$e && $e->[0] == $fd) { $self->disconnect; $self->{do_loop} = 0; } } } sub quit_loop { my ($self) = @_; $self->{do_loop} = 0; $self->{wakeup}->print('42'); } sub request { my $self = shift; my $func = shift; my $user_data = pop; my $callback = pop; if (!$self->can($func)) { Carp::croak( "Invalid request name `${func}' given" ); } my $result = $self->$func( @_ ); $result->notifier_set($callback, $user_data); return $result; } 1;