13 feb. 2012

Python + GObject + Gstreamer + GTK3 (Parte 3)

Ahora si estamos por llegar a la parte que estaban esperando y es el trabajo con GTK3 y Gstreamer.

Estos dos a veces parecen buenos amigos pero no siempre se comportan como queremos. Sin más rodeos vamos a trabajar.

Lo primero es que para esta parte bajen un programa en python que mostré hace algunas entradas en este blog, a partir de ese programa es que vamos a construir los elementos necesarios para reproducir nuestros archivos desde GTK3.


El programa que descargaron fue uno que estoy usando para mejorar el codigo de Aleatorio. Se ve como ven en la imagen. En ese punto el programa solo es capaz de correr el botón aleatorio.




Cuando abren el programa en algún editor encontraran unos espacios donde hay unos comentarios que dicen, código de gstreamer y cosas de ese estilo.

Como ya explique en la entrada anterior el código de Gstreamer simplemente lo voy a dejar aquí y explicare lo nuevo.

 #Codigo de Gstreamer
 self.playbin = gst.element_factory_make("playbin2", "player")
         bus = self.playbin.get_bus()
         bus.add_signal_watch()
         bus.connect("message", self.on_message)


 #Codigo de mensaje de Gstreamer
     def on_message(self, bus, message):
         t = message.type
         if t == gst.MESSAGE_EOS:
             self.playbin.set_state(gst.STATE_NULL)
         elif t == gst.MESSAGE_ERROR:
             self.playbin.set_state(gst.STATE_NULL)
             err, debug = message.parse_error()
             print "Error: %s" % err, debug

Listo eso es todo lo que ya vimos en la entrada anterior y no hay necesidad de explicar. Si tienen dudas comentan en la entrada anterior y puedo explicar en detalle.

Ahora vamos a ver algo nuevo y es recuperar la lista, hasta el momento solo sabemos que podemos meter listas dentro de el GtkTreeview para que se vea como en la imagen mas arriba, pero que pasa si necesitamos esa lista para reproducirla.

Gstreamer, Python y GTK3 se llevan bien pero no tan bien para que el proceso sea automatico, es por ello que es necesario recuperar el estado de la lista para poder pasarla a Gstreamer.

Para ello vamos a crear una nueva definición que la podemos crear debajo de la funcion Aleatoria en el código.
     def lista(self):
         listaa = []
         for allfiles in self.liststore2:
             for media_files in allfiles:
                 listaa.append(media_files)
         return listaa 
  
Como ven lista es una función propia (self) cuyo único objetivo es buscar que hay en el TreeView y meterlo dentro de una variable que se llama listaa, al final esta funcion se retorna y ya cualquier función externa puede usarla.

Como ya se imaginan la siguiente función que usara esta información sera Play.

      #Reproducir
      def play(self, wid):
          print "Reproducir"
          le = self.lista()
          for a in le:
              self.playbin.set_property("uri", a)
              self.playbin.set_state(gst.STATE_PLAYING)
      
      #Detener
      def detener(self, widget):
          print "Detener"
          self.playbin.set_state(gst.STATE_NULL)

Como ven la información que retorno self.lista la guardamos dentro de la variable "le" y ahí quedo toda la musica que estaba dentro del TreeView de GTK3, lo siguiente es simplemente decirle a Gstreamer que reproduzca todo el contenido de "le".

Detener es parecido pero simplemente lo único que hace es detener cualquier acción del contenedor de Gstreamer.

Si le dan reproducir notaran que el programa comienza a reproducir cualquier canción que le pongan a reproducir. Pero ojo que no hemos terminado, hasta este punto del tutorial el programa solo es capaz de reproducir el primer elemento de la lista y el ultimo elemento de la misma, esto se debe a que no hemos hecho los ciclos de GObject ni de Python que les conté en la primera entrada.

Espero disfruten sus primeros pasos con Python + GObject + Gstreamer + GTK3 pueden seguir revisando cosas y seguramente van a descubrir como se hace para reproducir todos los archivos.

Pronto la ultima parte de estas entradas cortas con el código final de GObject y Python necesario para reproducir toda la lista musical.


No hay comentarios:

Publicar un comentario