+
+
+sub init()
+{
+ $loop = Glib::MainLoop -> new();
+
+ # create a new pipeline to hold the elements
+ $l_SPipeline = GStreamer::Pipeline -> new("pipeline");
+
+ $l_SSource = GStreamer::ElementFactory->make(fdsrc => "fd-source");
+ $l_SOggDemuxer = GStreamer::ElementFactory->make(oggdemux => "ogg-demuxer");
+ $l_SVorbisDecoder = GStreamer::ElementFactory->make(vorbisdec => "vorbis-decoder");
+ $l_SAudioConverter = GStreamer::ElementFactory->make(audioconvert => "converter");
+ $l_SSink = GStreamer::ElementFactory->make(autoaudiosink => "sink");
+
+ my $pipe_out;
+ pipe $pipe_out, $pipe_in;
+ $l_SSource->set(fd => fileno($pipe_out));
+
+ $l_SPipeline -> add($l_SSource, $l_SOggDemuxer, $l_SVorbisDecoder, $l_SAudioConverter, $l_SSink);
+
+ $l_SSource->link($l_SOggDemuxer) or die "Can't link source to OGG-muxer";
+ $l_SVorbisDecoder->link($l_SAudioConverter, $l_SSink) or die "Can't link rest of stuff";
+ $l_SOggDemuxer->link_pads("src", $l_SVorbisDecoder, "sink");
+ $l_SOggDemuxer->signal_connect("pad_added", \&pgotm_addPads) or die "Can't link Pads to vorbis";;
+
+ $l_SPipeline -> get_bus() -> add_watch(\&my_bus_callback, $loop);
+
+ print "setting pipeline to paused\n";
+ $l_SPipeline -> set_state("paused");
+ print "setting pipeline to playing\n";
+ $l_SPipeline -> set_state("playing");
+}
+
+# Add pads
+sub pgotm_addPads {
+ my ($element, $pad, $data) = @_;
+
+ my $l_SCaps = $pad->get_caps();
+ my $l_SMime = $l_SCaps->get_structure(0) -> { name };
+
+ printf "Mime that is added is: %sn", $l_SMime;
+ printf "A new pad %s was created %sn", $pad->get_name(), $pad->get_parent()->get_name();
+
+ # If it's vorbis audio
+ if( $l_SMime eq "audio/x-vorbis" ) {
+ # Can it link to the audiopad?
+ my $l_SSinkPad = $l_SVorbisDecoder->get_pad("sink");
+
+ # Check if vorbis not linked..
+ if( !$l_SSinkPad->is_linked() ) {
+ if( $pad->link( $l_SSinkPad ) ) {
+ die "Can't link pads!\n";
+ }
+ }
+ }
+}
+
+sub my_bus_callback {
+ my ($bus, $message, $loop) = @_;
+
+ if ($message -> type & "error") {
+ warn $message -> error;
+ $loop -> quit();
+ }
+
+ elsif ($message -> type & "eos") {
+ print "EOS received!\n";
+ $loop -> quit();
+ }
+
+ return TRUE;
+}
+