Transparencias del proyecto de desarrollo del módulo Desktop & Mobile del Máster de Software Libre, organizado por Igalia y la Universidad Rey Juan Carlos, y presentado en la 7ª Guadec Hispana, celebrada en A Coruña los días 22 y 23 de Julio de 2010.
Fuentes latex disponibles en http://bit.ly/9HfDoU
1. Introducci´n
o Desarrollando JaMp Futuro
JaMp - Un cliente para Jamendo
Sim´n Pena y Alumnos del M´ster en Software Libre
o a
M´ster en Software Libre, 2009-2010. Edici´n de A Coru˜a
a o n
Igalia - Universidad Rey Juan Carlos
GUADEC-ES – 23 de julio de 2010
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
2. Introducci´n
o Desarrollando JaMp Futuro
Licencia
Esta obra est´ bajo una licencia Attribution-ShareAlike 3.0 Spain
a
de Creative Commons. Para ver una copia de esta licencia, visite
http://creativecommons.org/licenses/by-sa/3.0/es/ o
envie una carta a Creative Commons, 171 Second Street, Suite
300, San Francisco, California 94105, USA.
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
3. Introducci´n
o Desarrollando JaMp Futuro
Contenido
Introducci´n
o
¿Qu´ es?
e
Arquitectura
Desarrollando JaMp
Manejando se˜ales
n
Accediendo a servicios web
Utilizando D-Bus
Port para Maemo
Futuro
Objetivos
´
¡Unete!
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
4. Introducci´n
o Desarrollando JaMp Futuro
¿Qu´ es?
e
Contenido
Introducci´n
o
¿Qu´ es?
e
Arquitectura
Desarrollando JaMp
Manejando se˜ales
n
Accediendo a servicios web
Utilizando D-Bus
Port para Maemo
Futuro
Objetivos
´
¡Unete!
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
5. Introducci´n
o Desarrollando JaMp Futuro
¿Qu´ es?
e
¿Qu´ es JaMp?
e
JaMp
Ejercicio pr´ctico en el m´dulo de desarrollo del M´ster
a o a
Software Libre
Cliente para Jamendo para la plataforma GNOME
Git como sistema de control de versiones
Env´ e integraci´n de parches
ıo o
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
6. Introducci´n
o Desarrollando JaMp Futuro
¿Qu´ es?
e
¿Qu´ es Jamendo?
e
Comunidad de m´sica libre, legal e ilimitada, publicada bajo
u
licencias Creative Commons
36299 ´lbumes publicados
a
226880 Rese˜as de ´lbumes
n a
809051 miembros activos
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
7. Introducci´n
o Desarrollando JaMp Futuro
¿Qu´ es?
e
¿Por qu´ JaMp?
e
Intereses did´cticos
a
Punto de entrada a la plataforma
Familiarizarse con tecnolog´ habituales
ıas
Acceso y manipulaci´n de contenidos web
o
Reproducci´n de los contenidos multimedia
o
Intereses pr´cticos
a
Cliente dedicado (frente a usar plugins)
Arquitectura solida y modular
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
8. Introducci´n
o Desarrollando JaMp Futuro
Arquitectura
Contenido
Introducci´n
o
¿Qu´ es?
e
Arquitectura
Desarrollando JaMp
Manejando se˜ales
n
Accediendo a servicios web
Utilizando D-Bus
Port para Maemo
Futuro
Objetivos
´
¡Unete!
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
9. Introducci´n
o Desarrollando JaMp Futuro
Arquitectura
Arquitectura utilizada
Patr´n arquitect´nico Model-View-Controller
o o
Un backend para la recuperaci´n de informaci´n de Jamendo
o o
y la reproducci´n multimedia
o
Un frontend para la presentaci´n de la informaci´n obtenida y
o o
la gesti´n del la reproducci´n
o o
Interconexi´n mediante D-Bus
o
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
10. Introducci´n
o Desarrollando JaMp Futuro
Arquitectura
Backend
Desarrollado en C con GObject
Un proveedor de datos
Accede a Jamendo usando libsoup
Manipula los datos recibidos usando libxml
Expone un m´todo Query
e
Un gestor multimedia
Permite la reproducci´n de los contenidos usando gstreamer
o
Expone m´todos Play, Pause, notificaci´n de progreso. . .
e o
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
11. Introducci´n
o Desarrollando JaMp Futuro
Arquitectura
Frontend
Figura: Clientes buscando “rock”
Desarrollado en Python
Un cliente para GNOME, desarrollado con Glade
Un cliente para Maemo, usando Hildon
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
12. Introducci´n
o Desarrollando JaMp Futuro
Arquitectura
Conexi´n mediante D-Bus
o
Se usa D-Bus GLib en el lado del backend
Todas las llamadas son as´
ıncronas
El modelo est´ totalmente desacoplado de la vista
a
El controlador se puede reaprovechar entre distintas vistas
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
13. Introducci´n
o Desarrollando JaMp Futuro
Manejando se˜ales
n
Contenido
Introducci´n
o
¿Qu´ es?
e
Arquitectura
Desarrollando JaMp
Manejando se˜ales
n
Accediendo a servicios web
Utilizando D-Bus
Port para Maemo
Futuro
Objetivos
´
¡Unete!
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
14. Introducci´n
o Desarrollando JaMp Futuro
Manejando se˜ales
n
Manejando se˜ales (I)
n
Declarando la se˜al
n
Se instala en la inicializaci´n de la clase (pref foo class init)
o
jmp_mplayer_signals[ERROR] = g_signal_new ("error",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL,
NULL,
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE,
1,
G_TYPE_STRING);
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
15. Introducci´n
o Desarrollando JaMp Futuro
Manejando se˜ales
n
Manejando se˜ales (y II)
n
Emisi´n
o
Se env´ la se˜al de acuerdo a la l´gica de la aplicaci´n (aqu´ al recibir
ıa n o o ı,
un error en gstreamer)
g_signal_emit (self, jmp_mplayer_signals[ERROR], 0, error_message);
Conexi´n
o
Nos conectamos a la se˜al en el cliente que use el componente (que
n
podr´ decidir qu´ comportamiento aplicar en funci´n de los valores
a e o
recibidos)
g_signal_connect (jmplayer, "error", G_CALLBACK (error_callback), NULL);
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
16. Introducci´n
o Desarrollando JaMp Futuro
Manejando se˜ales
n
Marshallers y GClosures (I)
Los GClosures permiten representar funciones de callback.
Existe un n´mero de GClosures predefinidos
u
g cclosure marshal VOID VOID
g cclosure marshal VOID BOOLEAN
...
Es habitual querer callbacks no predefinidos ¿C´mo?
o
Usando glib-genmarshal
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
17. Introducci´n
o Desarrollando JaMp Futuro
Manejando se˜ales
n
Marshallers y GClosures (I)
Los GClosures permiten representar funciones de callback.
Existe un n´mero de GClosures predefinidos
u
g cclosure marshal VOID VOID
g cclosure marshal VOID BOOLEAN
...
Es habitual querer callbacks no predefinidos ¿C´mo?
o
Usando glib-genmarshal
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
18. Introducci´n
o Desarrollando JaMp Futuro
Manejando se˜ales
n
Marshallers y GClosures (I)
Los GClosures permiten representar funciones de callback.
Existe un n´mero de GClosures predefinidos
u
g cclosure marshal VOID VOID
g cclosure marshal VOID BOOLEAN
...
Es habitual querer callbacks no predefinidos ¿C´mo?
o
Usando glib-genmarshal
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
19. Introducci´n
o Desarrollando JaMp Futuro
Manejando se˜ales
n
Marshallers y GClosures (II)
glib-genmarshal
Permite crear GClosures personalizados
Recibe como entrada una lista
RETURN VALUE : ARG1 , ARGi , ARGN
Fichero marshal.list
VOID:INT64,INT64
VOID:STRING,POINTER
VOID:STRING,UINT,POINTER
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
20. Introducci´n
o Desarrollando JaMp Futuro
Manejando se˜ales
n
Marshallers y GClosures (y III)
Soporte en autotools
jmp-marshal.h: marshal.list
glib-genmarshal --header --prefix=jmp_marshal marshal.list > $@
jmp-marshal.c: marshal.list
glib-genmarshal --body --prefix=jmp_marshal marshal.list > $@
Us´ndolo en una se˜al
a n
..., jmp_marshal_VOID__INT64_INT64, G_TYPE_NONE,
2, G_TYPE_INT64, G_TYPE_INT64, NULL);
static void
tick_cb (JmpMplayer *jmplayer, gint64 position, gint64 duration,
gpointer user_data)
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
21. Introducci´n
o Desarrollando JaMp Futuro
Accediendo a servicios web
Contenido
Introducci´n
o
¿Qu´ es?
e
Arquitectura
Desarrollando JaMp
Manejando se˜ales
n
Accediendo a servicios web
Utilizando D-Bus
Port para Maemo
Futuro
Objetivos
´
¡Unete!
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
22. Introducci´n
o Desarrollando JaMp Futuro
Accediendo a servicios web
Accediendo a Jamendo (I)
Usando libsoup
Encolando un mensaje
Encolamos una petici´n para comunicarnos de forma as´
o ıncrona
...
soup_session_queue_message (session, msg, process_response, cbdata);
...
Recibiendo la respuesta
Una vez recibida la respuesta, se gestionar´ aqu´
a ı
static void
process_response (SoupSession *session, SoupMessage *msg,
gpointer user_data);
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
23. Introducci´n
o Desarrollando JaMp Futuro
Accediendo a servicios web
Accediendo a Jamendo (II)
Analizando la respuesta: usando libxml2
static GList*
parse_xml (const char *buffer, int length, JmpRelation relation)
{
xmlDocPtr doc = xmlReadMemory (buffer, length, NULL, NULL,
XML_PARSE_NOBLANKS | XML_PARSE_RECOVER);
if (!doc) return NULL;
GList *result = NULL;
xmlXPathContextPtr context = xmlXPathNewContext (doc);
/* xpath is of the form "/data/album" */
xmlXPathObjectPtr xpath_obj =
xmlXPathEvalExpression (vos[relation].xpath, context);
if (!xpath_obj) goto bail;
...
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
24. Introducci´n
o Desarrollando JaMp Futuro
Accediendo a servicios web
Accediendo a Jamendo (y III)
Analizando la respuesta: usando libxml2
xmlNodeSetPtr nodeset = xpath_obj->nodesetval;
if (nodeset->nodeNr > 0)
result = generate_list (nodeset, relation);
/* generate_list */
for (i = 0; i < nodes->nodeNr; i++) {
xmlNodePtr node = nodes->nodeTab[i];
if (node->type == XML_ELEMENT_NODE) {
GObject *item = generate_vo (node->children, relation);
if (item)
list = g_list_prepend (list, item);
}
}
/* generate_vo */
for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
if (cur_node->type == XML_ELEMENT_NODE) {
char *value = xmlNodeGetContent(cur_node);
item_set (item, cur_node->name, value, relation);
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
25. Introducci´n
o Desarrollando JaMp Futuro
Utilizando D-Bus
Contenido
Introducci´n
o
¿Qu´ es?
e
Arquitectura
Desarrollando JaMp
Manejando se˜ales
n
Accediendo a servicios web
Utilizando D-Bus
Port para Maemo
Futuro
Objetivos
´
¡Unete!
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
26. Introducci´n
o Desarrollando JaMp Futuro
Utilizando D-Bus
Utilizando D-Bus
Pasos
Crear una interfaz XML exponiendo los m´todos
e
Crear un servicio que implemente la interfaz, empleando
D-Bus GLib
Integrar en autotools
Acceder desde Python
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
27. Introducci´n
o Desarrollando JaMp Futuro
Utilizando D-Bus
Utilizando D-Bus (II)
Definiendo una interfaz
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE node PUBLIC
"-//freedesktop//DTD D-Bus Object Introspection 1.0//EN"
"http://standards.freedesktop.org/dbus/1.0/introspect.dtd">
<node name="/">
<interface name="org.mswl.jamp">
<method name="Play">
</method>
<method name="GetVolume">
<arg type="d" name="volume" direction="out" />
</method>
<method name="Seek">
<arg type="x" name="seek_position" direction="in" />
</method>
<signal name="tick">
<arg type="x" name="position" />
<arg type="x" name="duration" />
</signal>
</interface>
</node>
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
28. Introducci´n
o Desarrollando JaMp Futuro
Utilizando D-Bus
Utilizando D-Bus (III)
Implementando la interfaz
#include <dbus/dbus-glib.h>
...
connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
...
#include <dbus/dbus-glib-bindings.h>
...
gboolean
jmp_mplayer_service_seek (JmpMplayerService *self, gint64 seek_position,
GError **error)
{
return jmp_mplayer_seek (self->priv->player, seek_position);
}
...
gboolean
jmp_mplayer_service_get_volume (JmpMplayerService *self, double *volume,
GError **error)
{
*volume = jmp_mplayer_get_volume (self->priv->player);
return TRUE;
}
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
29. Introducci´n
o Desarrollando JaMp Futuro
Utilizando D-Bus
Utilizando D-Bus (III)
Configurando D-Bus
...
DBusGProxy *proxy = dbus_g_proxy_new_for_name (self->priv->connection,
DBUS_SERVICE_DBUS,
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS);
...
org_freedesktop_DBus_request_name (proxy,
MPLAYER_SERVICE_NAME,
0, &request_name_result,
&error));
...
dbus_g_connection_register_g_object (self->priv->connection,
MPLAYER_SERVICE_OBJECT_PATH,
G_OBJECT (self));
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
30. Introducci´n
o Desarrollando JaMp Futuro
Utilizando D-Bus
Utilizando D-Bus (y IV)
Conectando desde Python
bus = dbus.SessionBus()
class PlaybackManager:
def __init__(self, tick_cb=None):
self._bus = bus
self._tick_cb = tick_cb
player_object = self._bus.get_object("org.mswl.jamp",
"/Player")
self._player_interface = dbus.Interface(player_object,
dbus_interface="org.mswl.jamp")
if self._tick_cb:
self._player_interface.connect_to_signal("tick",
self._tick_cb)
def seek(self, value):
self._player_interface.Seek(value)
...
def tick_signal_handler(self, position, duration):
...
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
31. Introducci´n
o Desarrollando JaMp Futuro
Port para Maemo
Contenido
Introducci´n
o
¿Qu´ es?
e
Arquitectura
Desarrollando JaMp
Manejando se˜ales
n
Accediendo a servicios web
Utilizando D-Bus
Port para Maemo
Futuro
Objetivos
´
¡Unete!
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
32. Introducci´n
o Desarrollando JaMp Futuro
Port para Maemo
Port para Maemo
¿Qu´ es Maemo?
e
Plataforma que corre en dispositivos m´viles de Nokia
o
Maemo 3: Internet Tablet 770
Maemo 4: Internet Tablets N800 y N810
Maemo 5: N900
Alrededor de los dispositivos se forma la comunidad Maemo
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
33. Introducci´n
o Desarrollando JaMp Futuro
Port para Maemo
Port para Maemo
¿En qu´ fijarse?
e
Se utiliza Hildon
hildon.StackableWindow
hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
hildon.PickerButton(gtk.HILDON_SIZE_FINGER_HEIGHT,
hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
La aplicaci´n no debe parecer bloqueada
o
hildon.hildon_gtk_window_set_progress_indicator(self, True)
banner = hildon.hildon_banner_show_information(self, "", message)
banner.set_timeout(milliseconds)
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
34. Introducci´n
o Desarrollando JaMp Futuro
Port para Maemo
Port para Maemo
¿En qu´ fijarse?
e
Se utiliza Hildon
hildon.StackableWindow
hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
hildon.PickerButton(gtk.HILDON_SIZE_FINGER_HEIGHT,
hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
La aplicaci´n no debe parecer bloqueada
o
hildon.hildon_gtk_window_set_progress_indicator(self, True)
banner = hildon.hildon_banner_show_information(self, "", message)
banner.set_timeout(milliseconds)
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
35. Introducci´n
o Desarrollando JaMp Futuro
Port para Maemo
Port para Maemo
Claridad y sencillez, “finger friendly”
Figura: Pantalla de bienvenida y b´squeda
u
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
36. Introducci´n
o Desarrollando JaMp Futuro
Objetivos
Contenido
Introducci´n
o
¿Qu´ es?
e
Arquitectura
Desarrollando JaMp
Manejando se˜ales
n
Accediendo a servicios web
Utilizando D-Bus
Port para Maemo
Futuro
Objetivos
´
¡Unete!
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
37. Introducci´n
o Desarrollando JaMp Futuro
Objetivos
Objetivos futuros (I)
Distribuci´n
o
Empaquetar JaMp
Crear un repositorio PPA para Ubuntu
Interacci´n con Jamendo
o
Aumentar las APIs implementadas
Emplear Grilo para el acceso a los datos
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
38. Introducci´n
o Desarrollando JaMp Futuro
Objetivos
Objetivos futuros (y II)
Ports
Completar port para Maemo
Emplear MAFW en Maemo
Llevar a otras plataformas
Otras posibilidades
Emplear otros toolkits gr´ficos
a
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
39. Introducci´n
o Desarrollando JaMp Futuro
´
¡Unete!
Contenido
Introducci´n
o
¿Qu´ es?
e
Arquitectura
Desarrollando JaMp
Manejando se˜ales
n
Accediendo a servicios web
Utilizando D-Bus
Port para Maemo
Futuro
Objetivos
´
¡Unete!
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
40. Introducci´n
o Desarrollando JaMp Futuro
´
¡Unete!
´
¡Unete a nosotros!
¿Por qu´?
e
Te interesa Jamendo
Te interesa conocer las tecnolog´ que usamos
ıas
Te interesa llevar JaMp a una nueva plataforma
Quieres corregir alg´n error que hayas visto hoy ;)
u
Descarga el c´digo http://gitorious.org/mswl2010/jamp
o
Ponte en contacto con nosotros jamp-devel@googlegroups.com
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
41. Introducci´n
o Desarrollando JaMp Futuro
´
¡Unete!
¡¡Gracias!!
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo
42. Introducci´n
o Desarrollando JaMp Futuro
´
¡Unete!
Referencias
Se˜ales http://library.gnome.org/devel/gobject/stable/signal.html
n
D-Bus http://www.freedesktop.org/wiki/Software/dbus
Hildon http://wiki.maemo.org/Hildon
PyMaemo http://pymaemo.garage.maemo.org/,
http://wiki.maemo.org/PyMaemo/UI_tutorial
Sim´n Pena
o M´ster en Software Libre. Edici´n de A Coru˜a. Igalia – URJC
a o n
JaMp - Un cliente para Jamendo