2010-05-22

Crear una emisora web con Icecast 2 e Ices 2 en Ubuntu

Bueno, en este pequeño tutorial enseñaré como crear una emisora Web en Ubuntu usando icecast2 como servidor de emisión e ices2 como fuente para el servidor. Aunque esto se puede hacer en cualquier distribución de linux yo recomiendo un ubuntu. Yo lo hice con kubuntu 9.10 (karmik).

Instalar los paquetes

Bueno, lo primero es instalar los paquetes que se van a necesitar para la emisora. Si prefieres usar un administrador de paquetes gráfico como synaptic o adept no hay problema, de todos modos dejo aquí el código de la consola para lograrlo. Los paquetes que necesitaras son icecast2 e ices2

$ sudo apt-get install icecast2 ices2

Configurar la emisora

Preparar Icecast

Primero prepararemos icecast. Icecast utiliza un archivo de configuración xml donde están todos los parámetros de la emisora además de unos archivos para la interfaz web, unos archivos predeterminados se instalan con los paquetes, hay que hacer una copia de ellos en el directorio del usuario por que no se debe ejecutar icecast como root.
 

Primero crearemos una estructura de directorios para albergar los archivos de configuración y de registro de icecast, estando en nuestro home ejecutamos:

$ mkdir icecast
$ cd icecast
$ mkdir conf
$ mkdir logs

Ahora copiamos el archivo de configuración predeterminado del icecast a la carpeta que hemos creado. en kubuntu dicho archivo es /etc/icecast2/icecast.xml Si el archivo no esta allí entonces puedes usar el comando find para encontrarlo así:

$ find / -name "icecast.xml"

Nota: en algunas distribuciones de linux las carpetas del sistema están protegidas, los usuarios no pueden acceder a ellas (ni siquiera para leerlas) si este es tu caso deberás usar sudo cuando el sistema te diga que no puedes leer los archivos

$ cd conf
$ cp /etc/icecast2/icecast.xml icecast.xml
$ sudo chown user:group icecast.xml

Dado que el archivo pertenecía al root hemos usado chown para hacer que ahora nos pertenezca a nosotros. ¡Ojo aquí! donde he colocado user y group debes colocar tu nombre de usuario y de grupo respectivamente, en ubuntu normalmente el nombre del grupo es igual al nombre de usuario, en mi caso por ejemplo tanto mi usuario como mi grupo se llaman sergio así que el comando quedaría: sudo chown sergio:sergio icecast.xml
 

Por ahora no modificaremos el archivo de configuración, antes de eso copiaremos las carpetas que el icecast utiliza para la interfaz web. Estas carpetas normalmente están ubicadas en /usr/share/icecast2 pero si no están allí recuerda que puedes usar el comando find para localizarlas.

$ cd ..
$ cp -r -L /usr/share/icecast2/web web
$ cp -r -L /usr/share/icecast2/admin admin
$ sudo chown -R user:group admin
$ sudo chown -R user:group web

Recuerda remplazar user y group por tu nombre de usuario y de grupo respectivamente.
 

Ok, ahora si configuraremos el icecast para ello modificaremos el archivo de configuración que hemos copiado:

$ cd conf
$ kate icecast.xml

Si no tienes kate puedes usar gedit u otro editor pero trata en lo posible de usar un editor que te resalte el código para que se te haga más sencillo ubicar las líneas.
 

Bueno, vamos a ir editando las líneas en el orden en el que aparecen en el archivo, así que estate atento.

<clients>10</clients>

Esta línea fija la cantidad máxima de clientes (reproductores) que se pueden conectar a tu emisora. Normalmente esto se ajusta de acuerdo con la cantidad de ancho de banda del que dispones para emitir. Un valor razonable es 50. Si esperas más de 50 clientes quizás este tutorial no es para ti.

<source-password>hackme</source-password>

En esta línea colocaras la contraseña que las fuentes (en nuestro caso el ices2) utilizará para logearse en el servidor y enviar la música. Es recomendable que cambies la contraseña predeterminada para evitar que alguien más pueda emitir con tu servidor.

<relay-password>hackme</relay-password>

En nuestro caso no usaremos relays pero debes cambiar esta contraseña por seguridad.

<admin-user>admin</admin-user>
<admin-password>hackme</admin-password>

Este es el nombre de usuario y la contraseña que utilizaras para logearte en el módulo de administración web de Icecast. Te recomiendo que cambies tanto el nombre de usuario como la contraseña por seguridad.

<hostname>localhost</hostname>

Si tu emisora está montada en un servidor al que accedes con un dominio que has adquirido aquí colocaras el nombre del dominio, por ejemplo miradio.org. Si estás montando un servidor de pruebas te bastara con dejar localhost.

<port>8000</port>

Este es el puerto por el que emitirás. Normalmente no hay que cambiar el puerto a menos que tengas restricciones de firewall o algo parecido.

<logdir>/home/user/icecast/logs</logdir>
<webroot>/home/user/icecast/web</webroot>
<adminroot>/home/user/icecast/admin</adminroot>

Estas tres líneas le dicen al icecast donde guardar sus registros, donde están los archivos del panel de interfaz web y donde están los archivos del panel de administración de la interfaz web. Aca he colocado las rutas que deberías usar tu también si has seguido el tutorial, recuerda cambiar user por tu nombre de usuario.
 

Ok, en teoría ya está todo listo para que Icecast funcione. Ahora a probarlo.

Ejecutar Icecast

Bueno, ahora probaremos que todo esté funcionando, ejecutamos este comando:

$ icecast2 -c icecast.xml

Si la consola no arroja ningun error entonces Icecast ya está corriendo, ahora verificaremos los logs y la interfaz web para ver que todo esté andando bien.
 

Nota importante: La consola quedará bloqueada con el Icecast NO vayas a cerrar la consola o harás caer el servidor, dejala allí abierta, abre otra ventana o pestaña de consola para hacer los pasos que siguen.

Estando en nuestro home ejecutamos:

$ cd icecast
$ cd logs
$ cat error.log

Debes ver algo como esto:

[2010-05-22 13:08:33] INFO main/main Icecast 2.3.2 server started
[2010-05-22 13:08:33] INFO yp/yp_update_thread YP update thread started
[2010-05-22 13:08:33] INFO connection/get_ssl_certificate No SSL capability

No importa si el log es un tanto diferente, en realidad lo que importa es que no haya errores y que aparezca la línea que dice server started
 

Ahora veremos el estado del servidor a través de la interface web. Para ello en un navegador vamos a la dirección http://localhost:8000/ esto nos debe presentar una página de estado del servidor. Recuerda que para entrar a la sección de administración deberas introducir el nombre de usuario y la contraseña que has especificado en <admin-user></admin-user> y <admin-password></admin-password>

Preparar Ices

Bueno ya tienes el servidor corriendo y preparado para aceptar conexiones, no obstante aún no puedes escuchar música, básicamente por que no le has dicho a Icecast que música tocar. En realidad es un poco más complicado, verás:
 

Icecast es el servidor de emisión, el se encarga de aceptar las peticiones entratentes y distribuir el medio a los escuchas que se conecten pero no sabe nada de música ni de listas de reproducción, de ello se encarga el programa al que se denomina fuente (source). Existen varias sources diferentes para el Icecast entre ellas la más básica que es el Ices desarrollado por las mismas personas que desarrollaron el Icecast pero también puedes usar otras fuentes diferentes si lo prefieres, por ejemplo el VLC Player puede actuar como fuente para el Icecast.
 

Para este tutorial usaremos el Ices como fuente para el Icecast ya que es facil y rápido de configurar. Al igual que con el Icecast crearemos una estructura de directorios en el home para organizar los archivos. Esando en el home ejecutamos:

$ mkdir ices
$ cd ices
$ mkdir conf
$ mkdir playlists
$ mkdir logs

Ahora copiaremos el archivo de configuración predeterminado del Ices para usarlo con listas de reproducción. Recuerda que si no encuentras el archivo puedes hacer uso del comando find para localizarlo.

$ cd conf
$ cp /usr/share/doc/ices2/examples/ices-playlist.xml ices.xml
$ kate ices.xml

Ahora editaremos el archivo de configuración del Ices. Recuerda que lo haremos en el orden en que las líneas aparecen en el archivo así que pon mucha atención para no perderte.

<logpath>/home/user/ices/logs</logpath>

Esta línea le dice a Ices donde guardar los archivos de registro. Recuerda remplazar user con tu nombre de usuario.

<name>Example stream name</name>
<genre>Example genre</genre>
<descriptione>A short description of your stream</description>

Estas tres líneas contienen la metadata de la emisora. Sería una buena idea que las llenaras con los datos correctos según el nombre de tu emisora, el genero y la descripción.

<param name="file">/home/user/ices/playlists/playlist.txt</param>

Esta línea le dice al Ices donde encontrar el archivo de lista de reproducción. Más adelante te diré como crear la lista de reproducción. Recuerda remplazar user con tu nombre de usuario

<param name="random">0</param>

Esta línea le dice al Ices si tocar la lista de reproducción secuencialmente o aleatoriamente. Depende de ti establecerlo en el valor que quieras. Si la pones en 1 Ices tocará las entradas aleatoriamente

<param name="once">0</param>

Esta parámetro le dice al Ices si debe tocar la lista de reproducción solo una vez o debe tocarla infinitas veces. Si dejas el valor en 1 Ices tocará la lista de reproducción una vez y cuando termine cerrará la conexión con el servidor y finalizará haciendo que la emisora ya no se pueda escuchar más. Si piensas dejar la emisora corriendo todo el día para que la gente se conecte cuando quiera deberás establecer el valor en 0 para que Ices cicle indefinidamente la lista de reproducción.

<hostname>localhost</hostname>
<port>8000</port>
<password>hackme</password>
<mount>/example1.ogg</mount>

Esta es la información del servidor. Aquí colocamos la información del servidor Icecast a través del cual vamos a emitir. Esta información debe coincidir con la información que ya habíamos configurado en el icecast.xml. en <password></password> colocamos el password que habíamos puesto en la etiqueta <source-password></source-password> de icecast.xml
 

En <mount></mount> debemos escojer el mount point que queramos para emitir. El mount point será la parte final de la URL que usaremos para escuchar la emisora así que no conviene que sea exmaple1.ogg podrías poner en su lugar listen.ogg o tal vez algo más descriptivo pero no debe contener espacios y DEBE terminar en .ogg ya que es el codec que Icecast e Ices usan para emitir si no poner el .ogg algunos players se quedarán colgados sin hacer nada cuando trates de escuchar la estación.

<nominal-bitrate>64000</nominal-bitrate>

Esta el la última configuración pero una muy importante. Define la velocidad de bits con la que emitirá tu emisora. Cuanto mayor la velocidad de bits mejor la calidad del audio pero más ancho de banda necesitas para mantener a todos los oyentes conectados. Si colocas más velocidad de bits de la que puede soportar tu canal para la cantidad de oyentes que esperas los oyentes empezaran a experimentar cortes en la música o peor aún desconexiones espontaneas.
 

Si no estás muy seguro de que bitrate usar deja el bitrate predeterminado que es de 64kbps es una buena calidad para el .ogg al menos para la mayoría de aplicaciones. Si quieres saber más sobre como calcular el ancho de banda que necesitarás lee el recuadro siguiente, sino saltalo.

Cómo calcular el ancho de banda
 

Si no estás muy seguro de como saber cuantos oyentes puede soportar tu canal o cual es el máximo bitrate que puedes usar sin que tus oyentes experimenten problemas esta sección te dará alguna luz sobre ese asunto:
 

Ancho de banda Concurrente
 

El ancho de banda concurrente es la amplitud del canal que necesitas para emitir. Se calcula de la siguiente manera:
 

cb = b*n
 

Dónde cb es el ancho de banda concurrente (en kbps), b es el bitrate al que emites (en kbps) y n la cantidad de oyentes que esperas que se conecten simultaneamente. Así, por ejemplo, si vas a emitir a 128kbps y esperas 50 oyentes simultaneos: cw = 128kbps * 50 = 6400 kbps. Así pues necesitas un canal de 6.4 mbps para soportar 50 simultaneos oyentes si emites a 128kbps
 

Límite de Tráfico
 

Algunos servidores imponen un límite mensual de tráfico y cuando lo sobrepasas o bien empiezan a cobrarte más o bien no te permiten emitir más por el resto del mes. Para saber si tu límite mensual es suficiente para soportar la emisora puedes calcularlo así:
 

tb = b*n*at*30
 

Dónde tb es el ancho de banda total del mes (en kbits), b es el bitrate al que emitirás (en kbps), n es la cantidad de oyentes promedio que esperas por día y at es la cantidad promedio de tiempo que un oyente estará conectado al día (en segundos).
 

Así pues si emitirás a 128kbps, esperas 50 oyentes diarios y cada uno estará conectado en promedio 5 horas diarias escuchando la emisora tendrás:

tb = 128*50*18000*30 = 402.33 GB
 

Necesitarás un límite de tráfico mensual de al menos 400 GB

Ok, ya estas listo con el Ices configurado, ahora a crear la lista de reproducción.

Crear la lista de reproducción

La lista de reproducción es simplemente un archivo en el que cada línea tiene la ruta de acceso a un archivo .ogg, por ejemplo:

/home/user/music/anime/yui - rolling star.ogg
/home/user/music/anime/boa - every heart.ogg
/home/user/music/anime/gumi - catch you catch me.ogg
/home/user/music/anime/porno graffiti - melissa.ogg

Puede resultar un poco engorroso crear la lista a mano así que puedes usar el comando find para agilizar el trabajo, por ejemplo:

$ find /home/user/ -name "*.ogg" > playlist.txt

Este comando escribira en un archivo llamado playlist.txt todos los archivos .ogg que encuentre en la carpeta /home/user/, recuerda nuevamente remplazar user con tu nombre de usuario.

Ejecutar el Ices

En cuanto tengas preparada tu lista de reproducción (que debes haber guardado en /home/user/ices/playlists/playlist.txt) podrás poner en marcha el ices. Para ello haces lo siguiente estando en tu home:

$ cd ices
$ cd conf
$ ices2 ices.xml

Ok, si todo va bien la consola no debe mostrar mensajes de error, si es así el ices ya está corriendo y enviando información de medios al Icecast. Nuevamente la consola quedará bloqueada NO cierres la consola o bajaras al Ices abre otra ventana o pestaña de consola para los pasos siguientes.
 

Vamos a verificar el estado del Ices, para ello, desde nuestro home:

$ cd ices
$ cd logs
$ cat ices.log

Debes ver algo parecido a esto:

[2010-05-22 18:20:55] INFO ices-core/main IceS 2.0.1 started...
[2010-05-22 18:20:55] INFO signals/signal_usr1_handler Metadata update requested
[2010-05-22 18:20:55] INFO playlist-basic/playlist_basic_get_next_filename Loading playlist from file "/home/sergio/ices/playlists/playlist.txt"
[2010-05-22 18:20:55] DBUG playlist-basic/shuffle Playlist has been shuffled
[2010-05-22 18:20:55] INFO playlist-builtin/playlist_read Currently playing "/home/sergio/Música/J-Music/YUI/From Me To You/11.ogg"
[2010-05-22 18:20:55] INFO stream/ices_instance_stream Connected to server: localhost:8000/yui.ogg
[2010-05-22 18:20:55] DBUG reencode/reencode_page Reinitialising reencoder for new logical stream
[2010-05-22 18:20:55] INFO encode/encode_initialise Encoder initialising in VBR mode: 2 channels, 44100 Hz, nominal 128000

Básicamente lo que debes buscar es una línea como [2010-05-22 18:20:55] INFO playlist-builtin/playlist_read Currently playing "/home/sergio/Música/J-Music/YUI/From Me To You/11.ogg" que te indica que Ices leyó y empezó a emitir uno de los archivos que pusiste en la lista de reproducción.
 

También puedes verificar el estado del servidor desde la interfaz web entrando a http://localhost:8000 allí debe aparecer el mount point que has configurado con la metadata que colocaste en el archivo.

Escuchar la emisora

Ok, por fin el momento que has estado esperando. Escuchar la música que emite la emisora. Ya puedes hacerlo, por ejemplo con el VLC Player:
 

En el menú Medio selecciona Abrir volcado de red, en el cuadro que aparece escribe en el campo de dirección: http://localhost:8000/mount.ogg (remplaza mount.ogg por el mount point que has colocado en <mount></mount> en el archivo ices.xml) y luego haz clic en el botón Reproducir.
 

Si todo va bien escucharás la música que tu emisora emite. ¡Felicitacione!

Detener la emisión

Ok. Ahora te diré como detener la emisión. Recuerdas que dejamos abiertas las consolas del Ices y del Icecast pues bien, para detener la emisión simplemente debes presionar CTRL+C en la consola para detener los programas. Lo más recomendable, claro está, es que detengas primero Ices y luego Icecast por que si lo haces al revés Ices perderá inesperadamente la conexión con el servidor lo cual no es muy recomendable.

Como no bloquear la consola

Es posible ejecutar Icecast e Ices sin que la consola quede bloqueada. Para ello debes ejecutar los comandos agregando un ampersand (&) al final, así:

$ icecast2 -c icecast.xml &
$ ices2 ices.xml &

Al hacerlo de esta manera el sistema responderá con algo parecido a esto:

[1] 2923

Ese número es el pid (id de proceso) del Icecast esté número identifica al proceso en el sistema y es el que necesitas para detener la emisión luego. Si pierdes el número o la emisora ha estado emitiendo por mucho tiempo y ya no lo recuerdas puedes recuperarlo usando el comando:

$ ps ax | grep icecast2

A lo que el sistema responderá con algo como esto:

2329 pts/1 Rl 0:03 icecast2 -c icecast.xml

El primer número que aparece es el pid del Icecast.
 

Para detener la emisión debes enviar al proceso la señal de salida (TERM) lo haces con este comando:

$ kill -15 2923

Aunque kill puede parece algo drástico en realidad ese comando simplemente envía una señal de terminación al proceso, no lo mata forzadamente. Cuando lo hagas verás que el sistema responde con algo como esto:

[1]+ Hecho icecast2 -c icecast.xml

Así sabrás que el proceso ha terminado.

Algunas herramientas utiles

Mp3 a ogg

Cuando se configura una estación de radio con Icecast e Ices una de las preguntas que primero surge es: ¿Cómo convierto un Mp3 a ogg? La respuesta es muy sencilla para nuestro consuelo, para convertir un Mp3 a ogg en linux basta un comando de consola pero antes asegúrate de tener instalados estos paquetes si aún no los tienes:

$ sudo apt-get install mpg321 vorbis-tools

Ahora para convertir un mp3 a ogg:

$ mpg321 music.mp3 -w - | oggenc -o music.ogg -

Creo que eso es por ahora. Si tienen alguna duda o encuentran algún error en el post por favor no duden en dejar un comentario y yo les aclararé cualquier duda que tengan o corregiré lo que sea que esté mal.
 

Más adelante revisaré el post y veré que me falta por aclarar o cambiar. Espero que les haya gustado el tutorial y sobre todo que les haya servido

2010-03-01

Abajo los transportadores

¡Que caos tan terrible el que hicieron los transportadores hoy en Bogotá! Por culpa de ese estúpido paro Transmilenio colapso completamente, por supuesto ese sistema de transporte no puede absorber la cantidad tan enorme de personas que se movilizan por la ciudad:


Por culpa del enredo que ellos armaron no pude ir a mi clase de Astronomía. Malditos sean, Bogotá tiene el peor servicio buses urbanos, son desaseados, inseguros, hacen lo que les da la gana, paran donde les da la gana y aún así se quejan. Y aparte de todo hacen paros estúpidos que alteran todo el orden normal de la ciudad.

Pues nada, ojala que no cedan a sus demandas y antes les pongan más impuestos para que paguen por lo que hicieron hoy, el caos de que hubo hoy en la ciudad no tiene ninguna excusa. Aprendan a prestar un buen servicio y luego si quéjense.

2009-12-13

Nuestro primer intento de hacer Pan de Melón

Siempre me había llamado la atención el Pan de Melón, la comida favorita de Shana en Shakugan no Shana. Cuando se lo come hace una cara de placer tal que yo siempre pensé que debía tener un sabor muy delicioso. Quería probarlo pero todas las recetas que había encontrado hasta el momento requerían de una máquina de pan que yo no tengo y que por supuesto no quería comprar solo para hacer Pan de Melón. Hace unos días encontré esta receta:

http://www.recetasjaponesas.com/2009/04/meronpan-pan-de-melon.html

Quería intentarla, pero ya que no soy muy bueno en la cocina me decidí a decirle a mi hermana que la intentáramos juntos. Compramos todos los ingredientes, excepto por la Harina de Pan que no teníamos idea de donde conseguirla, la remplazamos con Harina de Trigo normal Haz de Oros, en cualquier caso el Pan está hecho de Harina de Trigo.

La receta resultó ser bastante sencilla, miren, aquí están los panes ya armados:


El problema fue que creo que nos pasamos un poco con la levadura y cuando los panes salieron del horno, bueno, habían crecido más de lo esperado y se habían pegado los unos a los otros XD:


Ahora que lo pienso, también debí haber hecho más cortes por que al crecer solo con cuatro cortes, bueno... no se parece mucho a un Pan de Melón.

Bueno, creo que no nos fue tan mal para ser el primer intento, el pan quedó de buen sabor, aunque me pregunto si ese es realmente el sabor que tiene el Pan de Melón Japonés. Lo importante de todo es que yo pasé una tarde muy chevere junto a mis dos hermanas, nos reímos un rato e hicimos algo diferente. Carolina dijo que "lo importante era divertirse haciéndolo así hubiera quedado hedioncho" y una vez Angela me dijo que "la cocina viene del corazón" y que no hay que seguir las recetas, así que sin importar lo que haya pasado estoy feliz con el resultado :D

2009-12-10

Emu-manía

Los emuladores siempre me han fascinado, desde que reviví mis viejos días de adicción al Super NES he estado jugando juegos de consola en mi PC. La experiencia se ha vuelto más placentera y emocionante desde que descubrimos con Andrés que podíamos conectar los controles del xBox 360 para jugar como en las verdaderas consolas, incluyendo la retroalimentación del dual-shock ¡oh! ¡yeah!

La mayoría de consolas funcionan bien en mi PC, desde el viejo NES hasta el PSOne (que con la adición del control del XBox puedo decir que es como tener un verdadero PSOne) Solo unas pocas aún se escapan, para empezar el Nintendo DS. Hace rato que existe un emulador para esta consola pero aún está en desarrollo y la mayoría, por no decir todos, los juegos corren mal, tiene fallas con el 3D, el sonido es horrible o la emulación se hace absurdamente lenta por momentos, en fin... ¡Ánimo muchachos!.

Una consola que siempre se me ha escapado es el PlayStation 2. Esta consola por tener un hardware tan maravilloso es la orna del zapato de los emuladores. Pocos PCs en el planeta pueden emular la consola perfectamente, se necesita muchísima velocidad de GPU y varios núcleos de CPU para poder revalizar con la GPU del PlayStation 2 y sus dos cooprocesadores para operaciones vectoriales.

A pesar de que el software ya no es un problema el hardware aún nos atormenta.

Hoy por fin pude hacer funcionar el PCSX2 en mi computadora. Por fin deje de quebrarme la cabeza tratando de encontrar una BIOS adecuada y de configurar los plug-ins gráficos para lograr siquiera ver el logo de "Play Station 2" ahora llegué a la limitación que no puedo sobrepasar sin hacer una inversión monetaria considerable, el Hardware.

Por ahora tendré que dejar por fuera la emulación de PS2. No por limitaciones de Software o por configuración sino por que mi hardware no puede igualar el de un Play Station 2 (Nunca pretendí lo contrario, solo era una prueba).

El Play Station Portable es quizás un objetivo más alcanzable. Su biblioteca de juegos es muy tentadora y me alienta pensar que es una consola que quizás no sea tan difícil de emular. El único problema por el momento, los emuladores, la mayoría de los emuladores de PSP que existen tienen algo en común, ninguno de ellos puede correr juegos comerciales (no tengo idea que es lo que emulan entonces).

El JPCSP es el primer emulador que se jacta de poder correr juegos comerciales (incluso tiene una página de compatibilidad con algunas entradas). Este emulador, no obstante, tiene una falla crítica, ¡Esta hecho en Java y OpenGL! [Si, si, leyeron bien, Java] No sé que andaban pensando los que lo hicieron, pero ¡Java! Por dios, Java no es un lenguaje como para correr una aplicación de este tipo, estas aplicaciones necesitan direct rendering y hardware acceleration, cosas de las que Java aún no entiende. Y por si fuera poco escogieron la librería gráfica más pobre y lenta que existe. OpenGL.

Bien, cuando lo vi dije "¿¡JAVA!? ¡Nooo! ¡olvídenlo, eso nunca va a funcionar! Pero aún así mi curiosidad me llevó a intentarlo, descargue una versión japonesa de Disidia Final Fantasy, cargué la imagen UMD en el emulador y ¿que creen? Si, efectivamente, no funcionó, lo más sorprendente de todo es la velocidad a la que emula. Con la máxima prioridad el emulador alcanza el sorprendente rate de ¡1.5 fps!

Bueno si, efectivamente es una torta, hasta el PCSX2 alcanza 18 - 20 fps. Muy poco para jugar bien pero al menos para ver algo. El JPCSP no fue capaz ni siquiera de mostrar el title screen del juego. ¿Prometedor? ¿Quien sabe? Al parecer hay un proyecto de portear el emulador a C++, quizás C++ mejore mucho la situación, yo espero que sea así. Ojala que veamos pronto un emulador de PSP funcional.

2009-10-29

libQGLViewer en Windows usando Microsoft Visual C++ 2008 Express Edition

libQGLViewer es una librería para ver escenas 3D de OpenGL en aplicaciones Qt. Las cosas buenas que tiene libQGLViewer es que ya trae implementadas cosas como el movimiento dinámico de la cámara, y le permite al usuario interactuar con la escena con el ratón y el teclado.

En Linux las cosas con libQGLViewer son supremamente sencillas, simplemente se instala el paquete de desarrollo y la librería queda lista para ser utilizada. En Windows las cosas cambian un poco, es más difícil hacer que la librería quede lista para funcionar y también hacer uso de ella.

En la página oficial de libQGLViewer están los pasos para compilar la librería con el Microsoft Visual Studio pero ellos asumen que uno tiene la integración de la versión comercial de Qt con ell Microsoft Visual Studio y eso no siempre es así, en mi caso por ejemplo, eso no sucede. De modo que aquí están los pasos para compilar la librería usando el Microsoft Visual C++ 2008 Express Edition sin necesidad de usar la integración de la versión comercial.

Estos son los pasos:
  1. Descargar el código fuente del libQGLViewer de la página de la librería.
  2. Descomprimir el código fuente en una carpeta del PC. Yo recomiendo C:\libQGLViewer\2.3.4 (La 2.3.4 fue la que yo descargué pero puede que para el momento en que lean el post haya una versión más reciente. También recuerden que la ruta de acceso carpeta NO DEBE CONTENER ESPACIOS).
  3. Abrir la consola de Microsoft Visual Studio 2008. Inicio -> Todos los programas -> Microsoft Visual C++ 2008 Express Edition -> Visual Studio Tools -> Símbolo del sistema de Visual Studio 2008.
  4. Ir a la carpeta donde se descomprimió el código fuente del libQGLViewer y allí entrar a la carpeta QGLViewer. (Deben quedar ubicados en la ruta C:\libQGLViewer\2.3.4\QGLViewer)
  5. Compilar usando los siguientes comandos:

qmake -config release
nmake

Está compilación crea una carpeta release dentro de la carpeta QGLViewer donde se encuentra el archivo QGLViewer2.dll. Copiamos este .dll a C:\Windows\system32 para que esté disponible para las aplicaciones que usen la librería.

Luego seleccionamos todo lo que hay en el carpeta release y lo movemos a la carpeta QGLViewer (la carpeta padre de release) y eliminamos la carpeta release, esto lo hacemos para facilitar el funcionamiento de la librería. Es solo cuestión de facilidad nada más.

Eso es todo. Ya es posible usar aplicaciones que hagan uso de la librería libQGLViewer.

Ahora explicaré como compilar los ejemplos que vienen en el paquete de código fuente de libQGLViewer. Los ejemplos se encuentran en la carpeta examples. En teoría se debería poder compilarlos todos al tiempo pero esto no funciona así que hay que hacerlo uno a uno. Empezaremos con el más simple, el simpleViewer.

En la carpeta simpleViewer que se encuentra dentro de examples está el código fuente necesario para compilar el simpleViewer. Para compilar el ejemplo se siguen estos pasos:

Abrir el archivo simpleViewer.pro con un editor de texto (puede ser el bloc de notas).

Ese archivo contiene código para tratar de detectar automáticamente donde se encuentran los archivos de inclusión y la librería del QGLViewer pero en Windows no funciona nada bien así que vamos a eliminar todo el código que no sirve para nada.

Localizamos en el archivo la línea ### Unix configuration ### y eliminamos todo el código que hay desde allí hasta la línea ### Windows configuration ###.

Debajo de la línea ### Windows configuration ### se encuentra el siguiente código:

win32 {
MOC_DIR = moc
OBJECTS_DIR = obj
}

Vamos a editarlo para que quede así:

MOC_DIR = moc
OBJECTS_DIR = obj

Luego eliminamos todo el código que está debajo de la línea OBJECTS_DIR, de modo que quedemos solo con algo como esto:

### Windows configuration ###
MOC_DIR = moc
OBJECTS_DIR = obj

Arriba de este código hay dos líneas que empiezan por #INCLUDEPATH y #LIBS. Estas líneas le dicen al compilador donde buscar los archivos de inclusión y la librería de libQGLViewer. Debemos editarlas para hacerlas apuntar a la ruta correcta, las líneas deben quedar más o menos así:

INCLUDEPATH *= C:\libQGLViewer\2.3.4
LIBS *= -LC:\libQGLViewer\2.3.4\QGLViewer -lQGLViewer2

Nota: No hay que olvidarse de quitar el # que se encuentra el inicio de la línea ya que este marca la línea como un comentario.

Eso es todo. Luego de esto ejecutamos qmake para crear el Makefile y luego nmake para compilar el programa. Esto generará un ejecutable simpleViewer.exe en la carpeta. Ya está compilado el ejemplo.

Si encuentran problemas compilando algún ejemplo o la propia librería con los pasos que he dejado aquí no duden en escribir o dejar sus comentarios.

Por ultimo una recomendación. La gran mayoría de los que descargamos el libQGLViewer no lo descargamos para usar aplicaciones que utilizan la librería o para quedarnos pasmados viendo los ejemplos sino para desarrollar nuestras propias aplicaciones.

Si planean usar libQGLViewer en su aplicación yo les recomiendo que no empiecen con un .pro vacío sino que copien uno de los .pro que han editado para compilar los ejemplos y lo editen agregando las fuentes y los headers de su propio proyecto, esto les facilitará mucho la compilación y les quitara de encima problemas de símbolos externos sin resolver que aparecen regularmente al usar libQGLViewer.