NSLU2

Audio via bluetooth desde el nslu2

como usar el NSLU2 en conjunto con un adaptador USB de bluetooth como un servidor de audio.

@POTUSCamacho tiene un articulo interesante acerca de como usar el NSLU2 en conjunto con un adaptador USB de bluetooth como un servidor de audio. POTUSCamacho explica como hacerlo usando un adaptador con audio ‘mono’ pero aclara que debería de ser posible lograr lo mismo usando uno estéreo.

Echemosle un vistazo a esta guia.

Una vez que ya se tenga el firmware de Ubuntu instalado en el NSLU2, podemos hacer login y actualizar nuestros paquetes.

sudo -i apt-get update

Luego instalamos los siguientes paquetes:

sudo -i apt-get install linux-sound-base bluetooth bluez bluez-alsa bluez-btsco bluez-compat bluez-utils python python-bluez vlc


Nota: Yo hago bastante desarrollo en mi NSLU2 así que puede ser que falte algún paquete aquí.


Ahora que ya tenemos los paquetes que necesitavamos instalados, crearemos el archivo .asoundrc en nuestro directorio home. Aquí un ejemplo:

pcm.bluetooth {
type bluetooth
device 00:00:00:00:00:00
}

Editamos la sección del dispositivo para poner el MAC address de nuestros audífonos bluetooth. Para conseguir esta MAC address puedes resetear el adaptador ejecutando el comando:

hciconfig hci0 reset

Luego configura tus audífonos para que estén en modo ‘pairing’ y ejecuta el siguiente comando:

sdptool browse

Ahora copia el siguiente script hecho en python en un archivo que se llame pair.py

#!/usr/bin/python

import gobject

import sys
import dbus
import dbus.service
import dbus.mainloop.glib

class Rejected(dbus.DBusException):
_dbus_error_name = "org.bluez.Error.Rejected"

class Agent(dbus.service.Object):
exit_on_release = True

def set_exit_on_release(self, exit_on_release):
self.exit_on_release = exit_on_release

@dbus.service.method("org.bluez.Agent",
in_signature="", out_signature="")
def Release(self):
print "Release"
if self.exit_on_release:
mainloop.quit()

@dbus.service.method("org.bluez.Agent",
in_signature="os", out_signature="")
def Authorize(self, device, uuid):
print "Authorize (%s, %s)" % (device, uuid)
authorize = raw_input("Authorize connection (yes/no): ")
if (authorize == "yes"):
return
raise Rejected("Connection rejected by user")

@dbus.service.method("org.bluez.Agent",
in_signature="o", out_signature="s")
def RequestPinCode(self, device):
print "RequestPinCode (%s)" % (device)
return raw_input("Enter PIN Code: ")

@dbus.service.method("org.bluez.Agent",
in_signature="o", out_signature="u")
def RequestPasskey(self, device):
print "RequestPasskey (%s)" % (device)
passkey = raw_input("Enter passkey: ")
return dbus.UInt32(passkey)

@dbus.service.method("org.bluez.Agent",
in_signature="ou", out_signature="")
def DisplayPasskey(self, device, passkey):
print "DisplayPasskey (%s, %d)" % (device, passkey)

@dbus.service.method("org.bluez.Agent",
in_signature="ou", out_signature="")
def RequestConfirmation(self, device, passkey):
print "RequestConfirmation (%s, %d)" % (device, passkey)
confirm = raw_input("Confirm passkey (yes/no): ")
if (confirm == "yes"):
return
raise Rejected("Passkey doesn't match")

@dbus.service.method("org.bluez.Agent",
in_signature="s", out_signature="")
def ConfirmModeChange(self, mode):
print "ConfirmModeChange (%s)" % (mode)

@dbus.service.method("org.bluez.Agent",
in_signature="", out_signature="")
def Cancel(self):
print "Cancel"

def create_device_reply(device):
print "New device (%s)" % (device)
mainloop.quit()

def create_device_error(error):
print "Creating device failed: %s" % (error)
mainloop.quit()

if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object("org.bluez", "/"),
"org.bluez.Manager")

if len(sys.argv) > 1:
path = manager.FindAdapter(sys.argv[1])
else:
path = manager.DefaultAdapter()

adapter = dbus.Interface(bus.get_object("org.bluez", path),
"org.bluez.Adapter")

path = "/test/agent"
agent = Agent(bus, path)

mainloop = gobject.MainLoop()

if len(sys.argv) > 2:
if len(sys.argv) > 3:
device = adapter.FindDevice(sys.argv[2])
adapter.RemoveDevice(device)

agent.set_exit_on_release(False)
adapter.CreatePairedDevice(sys.argv[2], path, "DisplayYesNo",
reply_handler=create_device_reply,
error_handler=create_device_error)
else:
adapter.RegisterAgent(path, "DisplayYesNo")
print "Agent registered"

mainloop.run()

#adapter.UnregisterAgent(path)
#print "Agent unregistered"

Ahora pon tus audífonos en modo ‘pairing’ de nuevo y ejecuta este comando:

sudo -i python pair.py hci0 00:00:00:00:00:00

Una vez mas, recuerda remplazar el MAC address con el de tus audífonos.
El ultimo paso involucra editar el vlcrc, para hacer esto puedes ejecutar:

pico .vlc/vlcrc

Recorre el archivo y remplaza:

alsadev=(default soundcard)

Por:

alsadev=bluetooth

Si el archivo no existe, entonces créalo:

A este punto ya deberías de poder escuchar en tus audífonos. Para escuchar el audio de NASA TV (video online), puedes ejecutar:

cvlc --aout-rate 8000 --novideo http://www.nasa.gov/55644main_NASATV_Windows.asx

Si todo esta bien, deberías de escuchar el audio. Cuando ejecutando estos comandos, recuerda el el sample rate debe de ser de 8000Hz ya que esto es lo que los audífonos soportan.

Para configurar otros audífonos o re-conectar los actuales, el archivo /var/lib/bluetooth/<tu MAC address>/linkkeys debe de ser eliminado. Este se re-creara una vez que el dispositivo se vuelva a conectar. Si conectas otros audífonos, también debe de editar el archivo .asoundrc

Para mas información, no dudes en visitar el blog de POTUSCamacho Industries.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

La moderación de comentarios está activada. Su comentario podría tardar cierto tiempo en aparecer.