sábado, 18 de septiembre de 2010

mp3 player utilizando pygst

#!usr/bin/python
# -*- coding: UTF-8 -*-

import sys, os
import pygtk, gtk, gobject
import pygst
pygst.require("0.10")
import gst

class GTK_Main():
   
    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.set_title("MP3-Player")
        window.set_default_size(400, 200)
        window.connect("destroy", gtk.main_quit, "WM destroy")
        vbox = gtk.VBox()
        window.add(vbox)
        self.entry = gtk.Entry()
        vbox.pack_start(self.entry, False, True)
        self.button = gtk.Button("Start")
        self.button.connect("clicked", self.start_stop)
        vbox.add(self.button)
        window.show_all()
       
        self.player = gst.Pipeline("player") # pipeline

        source = gst.element_factory_make("filesrc", "file-source") # origen
        decoder = gst.element_factory_make("mad", "mp3-decoder") # decoder
        conv = gst.element_factory_make("audioconvert", "converter") # conversor
        sink = gst.element_factory_make("alsasink", "alsa-output") # salida
       
        self.player.add(source, decoder, conv, sink) # armar el pipeline

        gst.element_link_many(source, decoder, conv, sink) # entubar los elementos

        bus = self.player.get_bus() # bus del pipeline para poder manejar los datos internos
        bus.add_signal_watch() # escuchar las señales en el bus del pipeline
        bus.connect("message", self.on_message) # los mensajes son enviados a nuestra funcion "on_message"
       
    def start_stop(self, widget):
    # Se ejecuta al hacer click sobre el boton "start"
        if self.button.get_label() == "Start":
            filepath = self.entry.get_text()
            if os.path.isfile(filepath):
                self.button.set_label("Stop")
                self.player.get_by_name("file-source").set_property("location", filepath)
                self.player.set_state(gst.STATE_PLAYING)
        else:
            self.player.set_state(gst.STATE_NULL)
            self.button.set_label("Start")
                       
    def on_message(self, bus, message):
    # es una retrollamada para los mensajes del bus del pipeline
        t = message.type
        if t == gst.MESSAGE_EOS:
            self.player.set_state(gst.STATE_NULL)
            self.button.set_label("Start")
        elif t == gst.MESSAGE_ERROR:
            self.player.set_state(gst.STATE_NULL)
            self.button.set_label("Start")
            err, debug = message.parse_error()
            print "Error: %s" % err, debug
           
GTK_Main()
gtk.gdk.threads_init()
gtk.main()

No hay comentarios:

Publicar un comentario