Net::OpenSoundControl::Server - OpenSound Control server implementation


Net-OpenSoundControl documentation Contained in the Net-OpenSoundControl distribution.

Index


Code Index:

NAME

Top

Net::OpenSoundControl::Server - OpenSound Control server implementation

SYNOPSIS

Top

  use Net::OpenSoundControl::Server;
  use Data::Dumper qw(Dumper);

  sub dumpmsg {
      my ($sender, $message) = @_;

      print "[$sender] ", Dumper $message;
  }

  my $server = Net::OpenSoundControl::Server->new(
      Port => 7777, Handler => \&dumpmsg) or
      die "Could not start server: $@\n";

  $server->readloop();

DESCRIPTION

Top

This module implements an OSC server (right now, blocking and not-yet multithreaded...) receiving messages via UDP. Once a message is received, the server calls a handler routine. The handler receives the host name of the sender as well as the (decoded) OSC message or bundle.

METHODS

Top

new(Port => $port, Name => $name, Handler => \&handler)

Creates a new server object. Default port is 7123, default name is Net-OpenSoundControl-Server:7123, default handler is undef.

Returns undef on failure (in this case, $@ is set).

name()

Returns the name of the server

port()

Returns the port the server is listening at

readloop()

Enters a loop waiting for messages. Once a message is received, the server will call the handler subroutine, if defined.

SEE ALSO

Top

The OpenSound Control website: http://www.cnmat.berkeley.edu/OpenSoundControl/

Net::OpenSoundControl

AUTHOR

Top

Christian Renz, <crenz @ web42.com>

COPYRIGHT AND LICENSE

Top


Net-OpenSoundControl documentation Contained in the Net-OpenSoundControl distribution.
package Net::OpenSoundControl::Server;

use 5.006;
use strict;
use warnings;
use IO::Socket;
use Net::OpenSoundControl;

our @ISA = qw();

our $VERSION = '0.02';

sub new {
    my $class = shift;
    my %opts  = @_;
    my $self  = {};

    $self->{PORT} = $opts{Port} || 7123;
    $self->{NAME} = $opts{Name}
      || 'Net-OpenSoundControl-Server:' . $self->{PORT};
    $self->{HANDLER} = $opts{Handler} || undef;

    $self->{SOCKET} = IO::Socket::INET->new(
        LocalPort => $self->{PORT},
        Proto     => 'udp')
      or return undef;    # error is in $@

    bless $self, $class;
}

sub name {
    my $self = shift;

    return $self->{NAME};
}

sub port {
    my $self = shift;

    return $self->{PORT};
}

sub readloop {
    my $self = shift;

    my $MAXLEN = 1024;
    my ($msg, $host);

    while ($self->{SOCKET}->recv($msg, $MAXLEN)) {
        my ($port, $ipaddr) = sockaddr_in($self->{SOCKET}->peername);
        $host = gethostbyaddr($ipaddr, AF_INET) || '';

        $self->{HANDLER}->($host, Net::OpenSoundControl::decode($msg))
          if defined $self->{HANDLER};

        return if ($msg =~ /exit/);
    }
}

1;