NAME

MPEG::MP3Play - Perl extension for playing back MPEG music

SYNOPSIS

  use MPEG::MP3Play;
  my $mp3 = new MPEG::MP3Play;
  
  $mp3->open ("test.mp3");
  $mp3->play;

  while ( 1 ) {
  	my $msg = $mp3->get_message_wait;
	last if ( $msg->{code}  == &XA_MSG_NOTIFY_PLAYER_STATE and
	          $msg->{state} == &XA_PLAYER_STATE_EOF )
  }

  $mp3->close;
  $mp3->exit;

DESCRIPTION

This Perl module enables you to playback MPEG music.

PREREQUISITES

MPEG::MP3Play is build against the 3.0 version of the Xaudio SDK and uses the async interface of the Xaudio library.

I don't know if older versions will work properly. The SDK is not part of this distribution, so get and install it first (http://www.xaudio.com/).

samples/play.pl uses Term::ReadKey if it's installed. samples/gtk.pl depends on Gtk.

INSTALLATION

First, generate the Makefile:

perl Makefile.PL

You will be prompted for the location of the Xaudio SDK. The directory must contain the include and lib subdirectories, where the Xaudio header and library files are installed.

make
make test
./runsample play.pl
./runsample gtk.pl  
make install

SAMPLE SCRIPTS

There are two small scripts in the samples directory You can run these script before 'make install' with the runsample script (usage: see above).

Both scripts expect a mp3 file 'test.mp3' in the actual directory.

play.pl

Textmodus playback. Displays the timecode. Simple volume control with '+' and '-' keys.

gtk.pl

This script demonstrates the usage of MPEG::MP3Play with the Gtk module. It produces a simple window with a progress bar while playing back the test.mp3 file.

CONSTRUCTOR

new

my $mp3 = new MPEG::MP3Play;

This is the constructor of this class and takes no arguments.

CONTROL METHODS

The following methods control the audio playback. Internally they send messages to the Xaudio subsystem. This message passing is completely asynchronyous, so no result values (e.g. sucess) are given back by this methods.

Instead the Xaudio subsystem sends back acknowledge messages. See the chapter MESSAGE HANDLING for details.

open

$mp3->open ($filename);

Opens the MPEG file $filename. No playback is started at this time.

close

$mp3->close ($filename);

Closes an opened file.

exit

$mp3->exit

The Xaudio thread or process will be canceled.

play

$mp3->play

Starts playing back an opened file. Must be called after $mp3->open.

stop

$mp3->stop

Stops playing back a playing file. The play position rewinds to the beginning.

pause

$mp3->pause

Pauses. $mp3->play will go further at the actual position.

seek

$mp3->seek ($offset, $range)

Sets the play position to a specific value. $offset is the position relative to $range. If $range is 100 and $offset is 50, it will be positioned in the middle of the song.

volume

$mp3->volume ($pcm_level, $master_level, $balance)

Sets volume parameters. $pcm_level is the level of the actual MPEG audio stream. $master_level is the master level of the sound subsystem. Both values must be set between 0 (silence) and 100 (ear breaking loud).

A $balance of 50 is the middle, smaller is more left, higher is more right.

MESSAGE HANDLING

Currently there are two methods to get messages from the Xaudio subsystem. So it is up to you to set up the message handler by using this methods.

In the near future MPEG::MP3Play will provide a default message handler which you can customize by overloading the message handler methods.

get_message

$msg_href = $mp3->get_message

If there is a message in the players message queue, it will be returned as a hash reference immediately. This method will not block, if there is no message. It will return undef instead.

get_message_wait

$msg_href = $mp3->get_message_wait ( [$timeout] )

This method will wait max. $timeout microseconds, if there is no method in the queue. If $timeout is omitted it will block until the next message appears. The message will be returned as a hash reference.

The message hash

The returned messages are references to hashes. Please refer to the Xaudio SDK documentation for details. The message hashes are build 1:1 out of the structs documented there, using _ as a seperator for nested structs.

(Simply use Data::Dumper to learn more about the message hashes ;)

TODO

- Testing of all methods.
- implementation of a simple message handler
- OO interface for message handling, with the possibility
  of overloading the message handlers
- full documentation of all handled messages
- more details about the messages hashes
- support of the full Xaudio API, with input/output
  modules, etc.

Ideas, code and any help are very appreciated.

BUGS

- samples/gtk.pl throws some Gdk messages on exit.
  (not really a MPEG::MP3Play bug ;)

AUTHOR

Joern Reder, joern@netcologne.de

COPYRIGHT

Copyright (C) 1999 by Joern Reder, All Rights Reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

The Xaudio SDK is copyright by MpegTV,LLC. Please refer to the LICENSE text published on http://www.xaudio.com/.

SEE ALSO

perl(1).