just put something what I need. Forgive my poor English!

2008年11月8日 星期六

A simple MP3 player

#!/usr/bin/perl
use strict;
use warnings;
use Gtk2;
use Glib qw(filename_to_unicode TRUE FALSE);
use GStreamer qw(GST_SECOND GST_TIME_FORMAT GST_TIME_ARGS);
use Data::Dumper;
use GStreamer -init;

$|++;
#my $file = shift @ARGV;
foreach my $file(@ARGV) {
print "Now playing: $file\n";
my $loop = Glib::MainLoop->new(undef, FALSE);
my $player = GStreamer::parse_launch(
"filesrc location=\"". Glib::filename_to_unicode($file) ."\"".
" ! mad".
" ! queue".
" ! alsasink"
);
#my $player = GStreamer::ElementFactory->make('playbin' => 'player');
#$player->set(uri => Glib::filename_to_uri $file, "localhost");
$player->get_bus()->add_watch(\&bus_callback, $loop);
#my $bus = $player->get_bus();
#print Dumper($player);
#print Dumper($bus);
#$bus->add_signal_watch();
#$bus->signal_connect('message' => \&bus_callback, $loop);

$player->set_state("playing") or die "playing error";
$loop->run();
$player->set_state("null");
}

sub bus_callback
{
my ($bus, $message, $loop) = @_;

if ($message -> type & "error") {
warn $message -> error;
$loop -> quit();
}

elsif ($message -> type & "eos") {
$loop -> quit();
}

# remove message from the queue
return TRUE;
}

sub current_position
{
my ($pipeline) = @_;

my $pos_query = GStreamer::Query::Position -> new("time");
my $dur_query = GStreamer::Query::Duration -> new("time");

if ($pipeline -> query($pos_query) &&
$pipeline -> query($dur_query)) {
printf "Time: %" . GST_TIME_FORMAT . " / %" . GST_TIME_FORMAT . "\r",
GST_TIME_ARGS(($pos_query -> position)[1]),
GST_TIME_ARGS(($dur_query -> duration)[1]);
}

# call me again
return TRUE;
}

沒有留言:

張貼留言