martes, febrero 05, 2008

Dispositivos MTP en GNU/Linux. Philips Gogear.


Hace un par de años me regalaron un reproductor mp3 Philips GoGear 1420. Tiene 4 Gb de capacidad, es sencillo de utilizar, relativamente pequeño (teniendo en cuenta lo que ha evolucionado el mercado en dos años y que lleva disco duro y no memoria flash) y la calidad de sonido no tiene nada que envidiar a un iPod. Los fanáticos de Apple me pondrán a parir por esto, pero aun admitiendo que mi oído no es demasiado selecto, he escuchado el mismo álbum en un iPod y en el mío y no veo la diferencia.

Hasta aquí lo bueno. Muchos reproductores se comportan como un pendrive usb, y por tanto se les puede cargar archivos desde cualquier sistema operativo que lo soporte, pero la familia GoGear de Philips utiliza un protocolo llamado MTP.  MTP (Media Transfer Protocol) es un protocolo creado por Microsoft, para permitir la transferencia de información con cámaras digitales, reproductores de audio y otros dispositivos digitales portátiles.

Además para la gestión de álbumes, artistas, etc. utiliza una base de datos SQLite que habría que actualizar para que se pudiera acceder a los archivos. Lo que ofrece Philips es un driver para Windows XP, que genera un icono en Mi PC similar a una unidad de disco, a través del cual se pueden añadir o eliminar archivos y de forma transparente actualiza esta base de datos. Además se puede sincronizar con una aplicación del tipo Windows Media Player. Pero no incluye ningún driver para GNU/Linux.

En GNU/Linux existe el proyecto libmtp que pretende implementar este protocolo para nuestro sistema operativo. La mayoría de las distribuciones incluyen esta librería en sus repositorios, por lo que a mucha gente le bastará con instalarla, junto con libusb, que libmtp necesita, y tu sistema GNU/Linux tendrá soporte para este tipo de dispositivos. En distribuciones tipo Debian, como Ubuntu, bastaría con:

sudo apt-get install libusb-0.1-4 libmtp6 mtp-tools


A partir de aquí con aplicaciones como Amarok o Rhythmbox podríamos transferir y eliminar ficheros de nuestro reproductor. Por ejemplo en Amarok hay que agregar un dispositivo MTP. Para ello haremos lo siguiente:

  1. Menú "Settings" -> "Configure Amarok".

  2. En la pantalla de configuración seleccionar "Media Devices".

  3. Hacer clic en el botón "Add Device...",  seleccionar en el apartado "Select the plugin to use with this device" la opción "MTP Media Device" y asignarle un nombre al dispositivo.

  4. Aceptar los cambios haciendo clic en los botones OK.


Con esto tenemos agregado nuestro dispositivo en Amarok. A continuación conectamos el dispositivo al ordenador, nos vamos a la pestaña "Devices" de Amarok y hacemos clic en el botón "Connect". Hecho esto nos aparecerá el contenido de nuestro dispositivo. Navegando por las colecciones y agregando álbumes o canciones con la opción "Transfer to media device", se van acumulando ficheros en la cola de transferencia (Transfer Queue en Amarok). Bastará con hacer clic en el botón "Transfer" para enviar al dispositivo los archivos y escucharlos. Para eliminar ficheros basta con seleccionarlos en el árbol de contenido y utilizar la tecla Supr o la opción "Delete from device" del menú contextual.


Todo esto habría sido lo bonito, pero en mi caso el sistema continuaba sin reconocer el dispositivo. El paquete mtp-tools instala una serie de comandos que comienzan por mtp-. Generalmente se instalan en /usr/bin o /usr/local/bin. El comando mtp-detect detecta los dispositivos de este tipo conectados al sistema. En mi caso devolvió el siguiente mensaje:

libmtp version: 0.2.1

Attempting to conect device(s)
Potential MTP Device with VendorID:0471 and ProductID:014c responded to
control message 2 with a response that was too short. Problems may arrise
but continuing
PTP: Opening session
Fallo de segmentación (core dumped)



El motivo es que las versiones de libmtp y libusb que hay en los repositorios, en mi caso de Ubuntu, no están totalmente actualizadas (libmtp 0.2.1 en el repositorio, mientras que actualmente el proyecto va por la 0.2.5) y no reconocen mi modelo en concreto, así que no quedó mas remedio que instalarse las últimas versiones, tanto de libmtp como de libusb, descargadas de las páginas de sus respectivos proyectos y compilarlas. El proceso es básicamente el mismo en todos los casos, descargarse el archivo, descomprimirlo y seguir las instrucciones que aparecen en el fichero INSTALL o README, que suelen ser ./configure, make y make install, esta última como root.

Comenzamos con libusb. En mi caso la última versión estable disponible era la 0.1.12:

wget http://puzzle.dl.sourceforge.net/sourceforge/libusb/libusb-0.1.12.tar.gz
tar xvzf libusb-0.1.12.tar.gz
cd libusb-0.1.12
./configure
make
sudo make install
cd ..
rm -R libusb-0.1.12
rm libusb-0.1.12.tar.gz



A continuación instalamos libmtp de forma muy similar, en este caso la versión 0.2.5:

wget http://ovh.dl.sourceforge.net/sourceforge/libmtp/libmtp-0.2.5.tar.gz
tar xvzf libmtp-0.2.5.tar.gz
cd libmtp-0.2.5
./configure --prefix /usr
make
sudo make install
cd ..
rm -Ry libmtp-0.2.5
rm libmtp-0.2.5.tar.gz



Hecho esto, la cosa seguía sin funcionar. Pero me di cuenta de que la primera línea continuaba diciendo libmtp version: 0.2.1, por lo que no estaba pillando la versión nueva de las librerías, así que reinicié el equipo por si acaso. Una vez reiniciada la máquina, mtp-detect me devolvió la lista de propiedades de mi reproductor y Amarok también lo detectó sin problemas.

Si alguien lee esto y tiene problemas que no dude en poner un comentario, a ver si entre todos conseguimos hacer funcionar estos dispositivos.


Un error muy típico es el siguiente:

mtp-detect: error while loading shared libraries: libmtp.so.7: cannot open shared object file: No such file or directory

Ocurre cuando al compilar libmtp no se especifica el lugar correcto de libusb. esto se consigue ejecutando ./configure --prefix "ruta_libusb", en mi caso /usr.