NAME
POE::Component::Audio::Mad::Dispatch - A POE::Component::Audio::Mad frontend
implementing listener based message dispatch.
SYNOPSIS
## we print some stuff below, and we don't want it
## to get buffered.. so turn on autoflush.
$| = 1;
## create our frontend session, which will create a decoder and
## forward it's messages to all interested listeners..
create POE::Component::Audio::Mad::Dispatch({
decoder_play_on_open
=> 1,
alias
=>
'mad-decoder'
});
POE::Session->create(
inline_states
=> {
_start
=> \
&ex_start
,
mad_decoder_input
=> \
&ex_input
});
sub
ex_start {
my
(
$kernel
,
$heap
,
$session
) =
@_
[KERNEL, HEAP, SESSION];
## add ourself in as a listener, and register for the DECODER_FRAME_DATA and
## IPC_SHUTDOWN_SUCCESS events. The decoder core will then call the
## 'mad_decoder_input' state in the current session when these
## events arrive..
## this also has the added benefit of keeping a reference to our
## session alive in the event notification list. Our session will
## remain alive as long as we are a registered listener..
$heap
->{lid} =
$kernel
->call(
'mad-decoder'
,
'add_listener'
,
$session
,
'mad_decoder_input'
, [
'DECODER_FRAME_DATA'
,
'INPUT_EOF_WARNING'
]);
## tell our decoder to start playing a stream..
$kernel
->post(
'mad-decoder'
,
'decoder_open'
, {
filename
=>
'/path/to/stream.mp3'
,
play
=> 1 });
}
sub
ex_input {
my
(
$kernel
,
$heap
,
$msg
) =
@_
[KERNEL, HEAP, ARG0];
## this is called when the decoder has generated an event
## that we have registered for. the message packet is
## contained in ARG0, and is a hashref with two
## fields ->{id} and ->{data}. id specifies the name
## of the event, and data contains a reference to
## the data included in this event..
if
(
$msg
->{id} eq
'DECODER_FRAME_DATA'
) {
## we got a message updating us as to player
## progress, the data part of the event will
## contain two values: ->{played} and ->{progress},
## played is the number of seconds of stream
## played..
"\rplayed: $msg->{data}->{played}"
if
(
defined
(
$msg
->{data}->{played}));
}
elsif
(
$msg
->{id} eq
'INPUT_EOF_WARNING'
) {
## we got a message telling us that the
## decoder system has come to the end of
## the current stream, use it as a queue
## to shutdown..
"\nshutting down..\n"
;
$kernel
->post(
'mad-decoder'
,
'decoder_shutdown'
);
}
else
{
## unknown messages should never happen, but
## we could do something interesting with them
## here.. for simplicity, we just ignore it.
return
;
}
}
## start this thing..
$poe_kernel
->run();
exit
();
DESCRIPTION
POE::Component::Audio::Mad::Dispatch implements a multiple dispatch
front end component
for
the POE::Wheel::Audio::Mad mpeg decoder. It
receieves status messages from the decoder and dispatches them to
other registered
"listener"
sessions. All of the states listed in
POE::Wheel::Audio::Mad(3) under STATES will be
defined
within this
components session. To control the decoder, simply post the
appropriate POE::Wheel::Audio::Mad STATE to this session.
If you intend to implement a decoder that will be controlled and/or
monitored by other POE::Session's, then this is the module you want
to be using. If you wish to implement a decoder through an IPC
bridge, you want POE::Component::Audio::Mad::Handle.
METHODS
- create({ ..options.. })
-
This class method is used to create a new POE session
for
both the
decoder core and the front end module. This constructor does
not specify any options, but options sent through this
constructor will be sent on to the decoder core. For more
information on options available to control the decoder core's
behaviour see POE::Component::Audio::Mad(3)
STATES
These states are specific to this component's session, and allow
other sessions to register themselvs as a
"listener"
to specific
decoder status messages. The states listed in POE::Component::Audio::Mad(3)
under STATES are also
defined
under this session and may be posted
to.
- add_listener
-
This state adds a new session to the decoders event notification list. It
accepts three arguments: (session, state, events).
'session'
is the name
of (or a reference to) a session that wishes to receive events,
'state'
is
the name of a state within the
'session'
, and
'events'
is an arrayref listing
the names events one wishes to receive.
This state will
return
your
"listener id number"
which is necessary
if
you wish
to update the events you are listening
for
, or to
delete
yourself from the event
notification list. If you wish to retrieve this number, you must
tell
the POE
kernel to ->call() to this state rather than ->post() to it.
For a list of available event names, see the documentation in
POE::Component::Audio::Mad(3) section EVENTS.
- update_listener
-
This state updates the list of events that a listener wishes to be notified
of. It takes two arguments: (listener id, events).
'listener id'
is the
number that was returned to you
when
you called
'add_listener'
. events is
an arrayref containing an updated list of events you wish to receive.
- del_listener
-
This state removes you from the event notification list. It takes one
argument, your
'listener id'
which was returned to you
when
you
called
'add_listener'
. This completely removes you from the event
notification list.
SEE ALSO
perl(1)
POE::Wheel::Audio::Mad(3)
AUTHOR
Mark McConnell, <mischke@cpan.org>
COPYRIGHT AND LICENSE
Copyright 2003 by Mark McConnell
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.