POE::Component::Enc::Mp3 - mp3 encoder wrapper


POE-Component-Enc-Mp3 documentation Contained in the POE-Component-Enc-Mp3 distribution.

Index


Code Index:

NAME

Top

POE::Component::Enc::Mp3 - mp3 encoder wrapper

SYNOPSIS

Top

use POE qw(Component::Enc::Mp3);

$mp3 = POE::Component::Enc::Mp3->new($bitrate => 160); $mp3->enc("/tmp/tst.wav");

POE::Kernel->run();

DESCRIPTION

Top

This POE component encodes raw audio files into mp3 format. It is merely a wrapper for the notlame program.

METHODS

Top

The module provides an object oriented interface as follows:

new

Used to initialise the system and create a module instance. The following parameters are available:

Indicates the name of a session to which module callbacks are posted. Default: main.

Should be self-evident. If left unspecified, defaults to 160.

enc <file-name> [del-orig]

Encodes the given file, naming it with a .mp3 extension. An optional true value for the second parameter indicates that the original file should be deleted.

    e.g. $mp3->enc("/tmp/tst.wav");

CALLBACKS

Top

Callbacks are made to the session indicated in the spawn() method. The names of the functions called back may also be set via the aforementioned method. The following callbacks are issued:

status

Fired during processing. ARG0 is the block number being processed whilst ARG1 represents the percentage of completion expressed as a whole number between 0 and 100.

done

This callback is made upon completion of encoding.

error

Fired on the event of an error.

AUTHOR

Top

Erick Calder <ecalder@cpan.org>

My gratitude to Rocco Caputo and Matt Cashner whose code has helped me put this together.

DATE

Top

$Date: 2002/09/14 22:36:06 $

VERSION

Top

$Revision: 1.2 $

LICENSE AND COPYRIGHT

Top


POE-Component-Enc-Mp3 documentation Contained in the POE-Component-Enc-Mp3 distribution.

#
#	mp3 encoding POE component
#	Copyright (c) Erick Calder, 2002.
#	All rights reserved.
#

package POE::Component::Enc::Mp3;

# --- external modules --------------------------------------------------------

use warnings;
use strict;
use Carp;

use POE qw(Wheel::Run Filter::Line Driver::SysRW);

# --- module variables --------------------------------------------------------

use vars qw($VERSION);
$VERSION = substr q$Revision: 1.2 $, 10;

# --- module interface --------------------------------------------------------

sub new {
	my $class = shift;
	my $opts = shift;

	my $self = bless({}, $class);

	my %opts = !defined($opts) ? () : ref($opts) ? %$opts : ($opts, @_);
	%$self = (%$self, %opts);

	$self->{alias}		||= "main";
	$self->{bitrate}	||= 160;
	$self->{priority}	||= 20;
	$self->{status}		||= "status";
	$self->{error}		||= "error";

	return $self;
	}

sub enc {
	my ($self, $fn, $del, @xargs) = @_;

	POE::Session->create(
		inline_states => {
			_start		=> \&_start,
			_stop		=> \&_stop,
			got_output	=> \&got_output,
			got_error	=> \&got_error,
			got_done	=> \&got_done
			},
		args => [$self, $fn, $del, \@xargs]
		);
	}

# --- session handlers --------------------------------------------------------

sub _start {
	my ($heap, $self, $wav, $del, $xargs) = @_[HEAP, ARG0, ARG3];

	$heap->{self} = $self;
	($self->{mp3} = $wav) =~ s/(.*)\.(.*)$/$1.mp3/;
	$heap->{del} = $del;
	$heap->{xargs} = $xargs;

	my @cmd = ("notlame", "-b", $self->{dev}, $wav, $self->{mp3});
	$heap->{child} = POE::Wheel::Run->new(
		Program		=> \@cmd,
		Priority	=> $self->{priority},
		StdioFilter	=> POE::Filter::Line->new(),	# Child speaks in lines
		Conduit		=> "pty",
		StdoutEvent	=> "got_output", 				# Child wrote to STDOUT
		CloseEvent	=> "got_done",
		);
	}

sub _stop {
	kill 9, $_[HEAP]->{child}->PID;
	}

sub got_output {
	my ($kernel, $heap) = @_[KERNEL, HEAP];
	local $_ = $_[ARG0];

	$heap->{quality} = $1 if /Encoding as\s+(.*)/;

	return unless m|^\s+(\d+)/(\d+)\s+\(\s*(\d+)%\)|;
	my ($frame, $nof, $p) = ($1, $2, $3);

	$kernel->post($heap->{self}{alias}
		, status => [$frame, $nof, $p]
		);
	}

sub got_done {
    my ($kernel, $heap) = @_[KERNEL, HEAP];
    my $self = $heap->{self};

    $kernel->post($self->{alias},
		$self->{done} => $self->{mp3}, $self->{del}, $self->{xargs}
		);
    delete $heap->{child};
	}

sub got_error {
	my ($kernel, $heap) = @_[KERNEL, HEAP];
	my $self = $heap->{self};
	$kernel->post($self->{alias}, $self->{error});
	}

1; # :)

__END__