The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

POE::Wheel::Audio::Mad - POE Wheel implementing in-session non-blocking mpeg stream playing

SYNOPSIS

  use POE;
  use POE::Wheel::Audio::Mad;

  POE::Session->create(
        inline_states => {
                _start  => \&am_start,
                message => \&am_message
        }
  );
  
  sub am_start {
        my ($kernel, $heap) = @_[KERNEL, HEAP];
        
        ## you may also specify decoder options,  listed below..
        $heap->{wheel} = new POE::Wheel::Audio::Mad ( message_event => 'message' );
        
        $kernel->yield( 'decoder_open', { 
                filename => '/path/to/some/stream.mp3', 
                play     => 1 
        });
  }
  
  sub am_message {
        my ($kernel, $message) = @_[KERNEL, ARG0];
        
        if ($message->{id} eq 'INPUT_EOF_WARNING') {

                print "finished..\n";

                undef $heap->{wheel};
                
        } elsif ($message->{id} eq 'DECODER_FRAME_DATA') {

                if (defined($message->{data}->{played})) {

                        print "\rplayed: $message->{data}->{played}";

                }
        }
  }
  
  $poe_kernel->run();
  exit();
        

DESCRIPTION

  POE::Wheel::Audio::Mad is an attempt to bring a naitive perl mpeg
  decoder into a perl session.  This module was written to work as
  a POE Wheel due to it's nature -- it simply playes mpeg streams --
  you have to do the job of controlling the player and handling 
  updates.  This really isn't your traditional wheel.
  

OPTIONS

  These options may be specified as part of the call to the 
  new() constructor,  and affect decoder behaviour.  
message_event
  *REQUIRED*  Specifies which event in your session will be 
  receiving event messages from the decoder.  See section
  MESSAGES below for more information on what this will
  mean.
output_close_on_pause
  If defined to a true value,  this will cause the decoder to
  physically close the output device when stream decoding is
  in the paused state.  This frees up the device for use by
  other applications.  Default:  false.
        
output_close_on_stop
  If defined to a true value,  this will cause the decoder to 
  physically close the output device when stream decoding is 
  in the stopped state.  Default: true.
  
output_device
  Specifies the complete path to the dsp device to open for
  playing decoded audio.  Default: '/dev/dsp'
  
output_samplerate
  Specifies the sampling rate to open the dsp device at.  If a
  stream is not at this sampling rate Audio::Mad::Resample will
  be used to up/down-sample the stream to match.  Any standard
  sampling rate can be used.
  
mixer_device
  Specifies the complete path to the mixer device to open for
  manipulating sound levels.  Default: '/dev/mixer'
  
mixer_balance
  Specifies the balance to set the mixer to once opened.  Any
  value between 0 (full left) and 100 (full right) may be
  used.  Default: 50 (center)
  
mixer_volume
  Specifies the master volume to set the mixer to once opened.
  Any value between 0 (mute) and 100 (full volume) may be
  used.  Default: 50
mixer_pcm
  Specifies the pcm volume to set the mixer to once opened.
  Any value between 0 (mute) and 100 (full volume) may be
  used.  Default: 60
decoder_progress_range
  Specifies the denominator to use when returning the stream
  progress index.  The duration in seconds is divided by this
  number to determine playing unit size,  as each "unit" is
  passed a progress message is generated indicating how many
  units have been played.
decoder_play_on_open
  If defined to a true value,  this will cause the decoder to
  immediatly begin playing a stream once an 'open' command
  has been issued for it.
  

STATES

  POE::Wheel::Audio::Mad brings with it a large amount of
  states that get defined in your session.  Most of these
  states are used for controlling the decoder behaviour
  or for querying information,  and they are listed below.
  All of these states take a single hashref as their
  argument,  the keys and expected values (if any) are 
  listed as well.
decoder_shutdown
  When called,  this state will halt all current decoding activities,
  clean up it's internal state, release resources,  and send a 
  message indicating the shutdown was successful.
  
decoder_open
  Opens a stream,  scans it for validity and information,  then prepares
  the decoder to begin playing.  Possible keys are:
  
stream
  string containing the full pathname to the stream to be opened.
  required.
  
play
  boolean indicating wether the decoder should begin playing the
  stream as soon as it's opened.  default:  [decoder_play_on_open]
decoder_play
  Starts or resumes playing of the currently opened stream.
  
decoder_pause
  Pauses playing on the current stream.  Decoding is halted,  the
  input file remains open,  and the current file position is
  preserved.
  
decoder_stop
  Stops playing on the current stream.  Decoding is halted,  the
  input file remains open,  but the current file position is 
  set to the beginning of the stream.
  
decoder_seek
  Seeks to a new position in the stream,  and resumes playing
  at the new position.  The keys used are:
  
position
  integer specifying the relative position to seek to.
  required.
  
range
  integer indiciating the denominator to use when determining
  relative file offsets.  default:  the current value of the
  decoder option 'decoder_progress_range', see OPTIONS.
  For example:
  
  to seek 25% past the beginning (if the stream is 500 seconds 
  long,  this would start playing at 125 seconds):
  
  $kernel->yield('decoder_seek', { position => 25, range => 100 });
  
  to seek to a specific second,  use the desired second as
  the position,  and the number of seconds in the stream
  as the range:
  
  $kernel->yield('decoder_seek', { position => 125, range => 500 });
  
decoder_set
  Updates decoder options (above) and manipulates mixer values.
  The following keys are all required to be present: 
type
  string indicating which subsystem you wish to manipulate.
  currently this is either 'option' for changing decoder
  options,  or 'pcm' for manipulating the mixer.
  
key
  string indicating the key,  or the name of the option
  that you wish to set.  If you are changing decoder
  options,  this is just the name of the option as listed
  above.  If you are manipulating the mixer,  possible
  values are:  'volume', 'pcm', or 'balance'.
value
  value you wish to be assigned to the specified 
  subsystem and key.
  
  For example:
  
  to alter a decoder option,  such as deactivating decoder_play_on_open:
  
  $kernel->yield('decoder_set', { type => 'option', key => 'decoder_play_on_open', value => 0 });
  
  to change the mixer volume,  such as setting the pcm volume to 75:
  
  $kernel->yield('decoder_set', { type => 'mixer', key => 'pcm', value => 75 });
  
decoder_info
  Causes the decoder to output information about one of it's subsystems.
  You must specify a single key:
  
type
  The name of a subsystem you would like to coherce into reporting
  state information.  You may select one of:  'decoder',  'input',
  or 'dsp'.  See section MESSAGES for help in parsing state
  information.
  

MESSAGES

  This wheel will send messages back to your session via the state
  you specified in the option 'message_event'.  This state will 
  be passed decoder messages,  one at a time,  in hashref format.
  
  This hashref always has only two keys:  id,  and data.  'id' is
  the identifier for the message.  Every message id used by the
  decoder is listed below.  data is the payload corresponding to
  this type of event.  It could possibly be of any type or value,
  or possibly blank,  but it will always be defined.
  
DECODER_SHUTDOWN_SUCCESS
  Emitted when a shutdown has been specifically asked for,  usually
  by yielding to 'decoder_shutdown'.  After all files have been
  closed,  the output device shutdown,  and resources freed this
  state will be emitted to let users know the wheel is ready to
  be destroyed.
DECODER_PLAY_FAILED
  Emitted when the decoder is asked to play,  but no input file is
  open.  
DECODER_PAUSE_FAILED
  Emitted when the decoder is asked to pause,  but the decoder is
  not currently playing.
DECODER_STOP_FAILED
  Emitted when the decoder is asked to stop,  but the decoder is
  not currently playing,  or currently has an input file open.
DECODER_STATUS_DATA
  Emitted when the decoder changes state.  The data packet is
  a hashref containing information about the new state.  
  
state
  Currently the only key defined in the data packet,  it a 
  textual description of the current decoder state. Possible 
  values are:  'CLOSED', 'STOPPED', 'PLAYING', 'PAUSED'.
  
DECODER_FRAME_DATA
  Emitted periodically while the decoder is processing a stream.
  The data packet is a hashref which could contain one of the
  following keys:
  
played
  an integer indicating the number of seconds that have been 
  played in the stream.  this gets printed every 500ms for
  better accuracy,  as such,  the value may not change each
  time it is printed.
  
progress
  an integer indicating relative position within the stream.
  the option 'decoder_progress_range' is used as a denominator
  and applied to the length (in bytes) of the stream.
  
DECODER_FRAME_ERROR
  Emitted when the decoder crosses an unrecoverable error 
  while processing frames in the stream.  the data packet
  contains a string with a short message about the error.
INPUT_OPEN_FAILED
  Emitted when the decoder has been asked to open a file,
  but couldn't find the file or locate a valid mepg stream
  within the file.  the data packet contains a string with
  a short message about the error.
INPUT_CLOSE_SUCCESS
  Emitted when the decoder has successfully shutdown an 
  input stream,  and is ready to open a new input 
  stream.  the data packet contains a string with the
  name of the file that was closed.
INPUT_STATUS_DATA
  Emitted when the decoders input subsystem has changed 
  state.  The data packet is a hashref,  and could contain
  any of the following keys:
  
state
  a string containing a description of the input systems new
  state.  possible values are:  'OPEN' or 'CLOSED'.
  
filename
  a string containing the name of the file the input system
  has just changed state on.  If state was 'OPEN',  this file
  was just opened,  if 'CLOSED',  this file was just closed.
INPUT_INFO_DATA
  Emitted when new information about an input stream has just
  become available.  Usually immediately after the stream has 
  been opened.  the data packet is a hasref,  and could contain
  any of the following:
  
s_frames
  The number of frames calculated to be in this stream.
s_vbr
  Boolean indicating wether the stream is variable or
  constant bitrate.  false=CBR, true=VBR.
s_size
  The number of bytes calculated to be in the stream.
s_duration
  The duration of the stream in HH:MM:SS.DDD format.
s_bitrate
  The calculated bitrate of this stream,  as an integer.
s_avgrate
  The mean bitrate of this stream,  as an integer.
  
s_samplerate
  The sampling rate of this stream.
  
s_mode
  The stereo mode of this stream.
s_layer
  The layer of this stream.
s_flags
  The frame flags for this stream.
s_frame_duration
  The duration of each individual frame in this stream.
xing_frames
  The number of frames in this stream,  according to the Xing header.
xing_bytes
  The number of bytes in this stream,  according to the Xing header.
INPUT_EOF_WARNING
  Emitted when the decoder has come across an end-of-file contidition
  on the input stream file.  the data packet is a string,  and contains
  the name of the input stream file.
INPUT_CLOSE_WARNING
  Emitted when the decoder has failed to call a close(2) on the input
  stream filehandle.  
DSP_OPEN_SUCCESS
  Emitted when the decoder has acquired the output device.  the data
  packet is a string containing the path name of the device that has
  been opened.
DSP_OPEN_FAILED
  Emitted when the decoder has failed to acquire an output device.  It
  either failed to open the device,  or set it's paramaters.  the data
  packet is a string describing the error.
DSP_STATUS_DATA
  Emitted when the output device has changed state.  the data packet
  is a hashref containing information about the new state.
  
state
  Currently the only defined key in the data packet,  it contains a 
  textual description of the output subsystems state.  Possible
  values are:  'CLOSED', 'OPEN'.
  

SEE ALSO

perl(1)

POE::Component::Audio::Mad::Dispatch(3) POE::Component::Audio::Mad::Handle(3)

Audio::Mad(3) Audio::OSS(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 with the exception that you must also feel bad if you don't email me with your opinions of this module.