Una vez que la tubería esta creada, hay que indicar de forma explícita el estado en que se encuentra. Por defecto, cuando una tubería se crea, su estado original es NULL. Es posible cambiar su estado a
- READY : un elemento esta listo para hacer “algo”
- PLAYING : un elemento esta haciendo “algo”
- PAUSED : un elemento esta pausado
Recordar que este puede ser el el estado de la tubería, como tambien puede ser el estado de cualquier elemento de la tubería. Es decir, el origen puede estar en PLAYING, mientras que la salida puede estar en PAUSED. La gran diferencia es que al encapsular los elementos dentro de un “bin” y éste cambia de estado, todos los elementos del “bin” cambian de estado, haciendo más faciles las cosas a los programadores
Para cambiar de estado a un elemento
gst_element_set_state(elemento, GST_STATE_SOMETHING);
Pero no es todo. Es necesario además indicarle a la tubería que debe seguir trabajando:
gst_bin_iterate(bin);
Una vez que un elemento cambia de estado (por ejemplo, el origen termina de leer un archivo), los elementos enlazados a el cambian de estado.
Si necesitamos por ejemplo, tocar un archivo hasta que termine y cambie de estado la tubería automaticamente,
gst_element_set_state(tuberia, GST_STATE_PLAYING);while(gst_bin_iterate(GST_BIN(tuberia)));
Entonces nuestro programa podría ser:
GstElement *origen, *filtro, *destino;GstElement *tuberia;origen = gst_element_factory_make("filesrc", "origen");filtro = gst_element_factory_make("mad", "decodificador");destino = gst_element_factory_make("osssink","salida");gst_bin_add_many(GST_BIN(pipeline), origen, filtro, destino, NULL);gst_element_link_many(origen, filtro, destino, NULL);gst_element_set_state(tuberia, GST_STATE_PLAYING);while(gst_bin_iterate(GST_BIN(tuberia)));
No esta terminado aun. Debemos darle algunas propiedades a algunos elementos.
3.2 Terminando el código
Ahora hay que asignarle el archivo que se escuchará. Para esto se ocupa la propiedad “location” de filesrc.
Queda a ejercicio del lector el que soporte un playlist
GstElement * origen;
g_object_set(G_OBJECT(origen), "location", "algunarchivo.mp3", NULL); ahora via gstreamergst_element_set(origen, "location", "algunarchivo.mp3", NULL);
Ahora, terminamos el programa. Este programa es similar al ejemplo que viene en la documentación de GStreamer (que se incluye a modo de ejemplo )
#include <gst/gst.h> int main (int argc, char * argv[]){ GstElement * origen, * filtro, * salida; GstElement * tuberia;
inicializamos gstreamer gst_init(&argc, &argv); preguntamos si se ejecuto como programa archivo.mp3 if (argc != 2) { g_print("Uso : %s <archivo.mp3> \n", argv[0]); return -1; }
creamos los elementos tuberia = gst_pipeline_new("foo"); origen = gst_element_factory_create("filesrc"); filtro = gst_element_factory_create("mad"); salida = gst_element_factory_create("osssink"); decimos a origen de donde leer el archivo gst_element_set(origen, "location", argv[1],NULL);
encapsulamos en un bin (tuberia) gst_bin_add_many(GST_BIN(tuberia), origen, filtro, salida, NULL); enlazamos los elementos gst_element_link_many(origen, filtro, salida, NULL);
cambiamos el estado de la tuberia y tocamos el archivo. gst_element_set_state(tuberia, GST_STATE_PLAYING); while (gst_bin_iterate(GST_BIN(tuberia))); return 0; }