
Un reproductor de Spotify Connect escrito en CPP dirigido, entre otros, dispositivos integrados (ESP32).
Actualmente en el estado de desarrollo rápido.
Solo para ser utilizado con cuentas premium de Spotify
Resumen:
libasound y libavahi-compat-libdnssd Este proyecto utiliza submódulos, asegúrese de estar clonando con el indicador --recursive o utilizar git submodule update --init --recursive .
MBedTLS ahora es la única opción, por lo que puede obtenerla desde allí y reconstruirla o tenerlo instalado en todo el sistema con su administrador de paquetes favorito. Vea a continuación cómo usar una versión local.
Esta biblioteca utiliza NanoPB para generar archivos C a partir de definiciones de ProtoBuf. NanopB se incluye a través de submódulos, pero requiere algunas bibliotecas externas de Python para ejecutar los generadores.
Para instalarlos puede usar PIP:
$ sudo pip3 install protobuf grpcio-tools(Probablemente deberías usar Venv, pero no soy desarrollador de Python)
Para instalar las dependencias de Avahi y Asound en Linux, puede usar:
$ sudo apt-get install libavahi-compat-libdnssd-dev libasound2-devEl objetivo CLI se utiliza principalmente para fines de prueba y desarrollo, a partir de ahora tiene las mismas características que el objetivo ESP32.
Como ahora se usa MBedTLS en lugar de OpenSSL, debe instalarlo o su sistema o tener una compilación local. Si tiene una instalación de MBedTLS en todo el sistema, ignore lo que hay abajo
Para usar una compilación local, debe especificar el bell_external_mbedtls y potencialmente mbedtls_release. El primero apunta al subdir "./cmake" del directorio de compilación de MBEDTLS, el segundo opcionalmente define el nombre de la compilación MBedTLS (se establece de forma predeterminada en 'Release' para Windows y 'Noconfig' para otros).
Consulte Ejecutar la CLI para obtener información sobre cómo ejecutar CSPot en una computadora de escritorio.
# navigate to the targets/cli directory
$ cd targets/cli
# create a build directory and navigate to it
$ mkdir -p build && cd build
# use cmake to generate build files, and select an audio sink
$ cmake .. -DUSE_PORTAUDIO=ON [-DBELL_EXTERNAL_MBEDTLS =< mbedtls_build_dir > /cmake > ] [-DMBEDTLS_RELEASE =< release_name > ]
# compile
$ make # navigate to the targets/cli directory
$ cd targets/cli
# create a build directory and navigate to it
$ mkdir -p build && cd build
# use cmake to generate build files, and select an audio sink
$ cmake .. -A Win32 | x64 -DUSE_PORTAUDIO=ON [-DBELL_EXTERNAL_MBEDTLS =< mbedtls_build_dir > /cmake > ] [-DMBEDTLS_RELEASE =< release_name > ] Vaya a build y use cspotcli.sln en VisualStudio o use msbuild desde la línea de comandos.
Tenga en cuenta que por ahora, solo se ha probado la construcción Win32, no la versión X64. Bajo algunas versiones VS, el ProTobuf podría no ser reconstruido automáticamente, simplemente vaya al proyecto "Generate_Proto_sources" y haga un C^f7 en cada *.pb.rule
El objetivo CLI se utiliza principalmente para fines de prueba y desarrollo, a partir de ahora tiene las mismas características que el objetivo ESP32.
# navigate to the targets/cli directory
$ cd targets/cli
# create a build directory and navigate to it
$ mkdir -p build && cd build
# use cmake to generate build files, and select an audio sink
$ cmake .. -DUSE_ALSA=ON
# compile
$ make Consulte Ejecutar la CLI para obtener información sobre cómo ejecutar CSPot en una computadora de escritorio.
El objetivo ESP32 se crea utilizando la cadena de herramientas ESP-IDF
# Follow the instructions for setting up esp-idf for your operating system, up to `. ./export.sh` or equivalent
# esp-idf has a Python virtualenv, install nanopb's dependencies in it
$ pip3 install protobuf grpcio-tools
# update submodules after each code pull to avoid build errors
$ git submodule update --init --recursive
# navigate to the targets/esp32 directory
$ cd targets/esp32
# run once after pulling the repo
$ idf.py set-target esp32Configurar CSPOT de acuerdo con su hardware
# run visual config editor, when done press Q to save and exit
$ idf.py menuconfig Navegue a Example Connection Configuration y proporcione detalles de conexión WiFi

Navegue a CSPOT Configuration , puede configurar el nombre del dispositivo, el dispositivo de salida y la calidad de audio.

Por defecto, la indicación de LED está deshabilitada, pero puede usar GPIO estándar o LED direccionable para indicar el estado actual de CSPOT. Utilizará diferentes patrones de parpadeo (y colores en el caso de LED direccionables) para indicar conectividad WiFi y presidencia del cliente de Spotify conectado.
Construir y cargar el firmware
# compile
$ idf.py build
# upload
$ idf.py flashEl ESP32 se reiniciará y comenzará a ejecutar CSPOT. Puede monitorearlo usando una consola serie.
Opcionalmente ejecutar como comando único
# compile, flash and attach monitor
$ idf.py build flash monitorDespués de construir la aplicación, lo único que debe hacer es ejecutarla a través de la CLI.
$ ./cspotcli
Si lo ejecuta sin parámetro, usará ZeroConf para anunciarse. Esto significa que hasta que al menos una aplicación local de Spotify Connect la haya descubierto y conectado, no se registrará en los servidores Spotify. Como consecuencia, Webapi de Spotify no podrá verlo. Si desea que el reproductor se registre al inicio, debe usar el nombre de usuario/contraseña todo el tiempo o al menos una vez para crear un archivo de credenciales y luego reutilizar ese archivo. Ejecutarlo con -u/-p/-c una vez y luego ejecutarlo solo con -c. Vea la ayuda de la línea del comando.
Ahora abra una aplicación real de Spotify y debería ver un dispositivo CSpot en su red local. Úselo para reproducir audio.
cspot está destinado a usarse como una biblioteca C ++ ligera para reproducir música Spotify y recibir notificaciones de control de Spotify Connect. Expone una interfaz para comenzar la comunicación con los servidores Spotify y espera que el programa de incrustación proporcione una interfaz para reproducir muestras de audio sin procesar ( AudioSink ).
Puede ver el programa cspot-cli para una referencia sobre cómo incluir CSPOT en su programa. Proporciona algunos sumideros de audio para varias plataformas y usos:
ALSAAudioSink - Linux, requiere libasoundPortAudioSink - MacOS (Portaudio también admite más plataformas, pero actualmente lo usamos solo en macOS), requiere la biblioteca de PortaudioNamedPipeAudioSink : todas las plataformas, escriben en un archivo/tubería FIFO llamado outputFifo que luego puede ser reproducido por FFMPEG. Utilizado principalmente para pruebas y desarrollo.Además, los siguientes sumideros de audio se implementan para el objetivo ESP32:
ES9018AudioSink : proporciona reproducción a través de un DAC ES9018 conectado al ESP32AC101AudioSink : proporciona reproducción a través del AC101 DAC utilizado en tableros Audiokit ESP32 A1S baratos, comúnmente encontrado en AliExpress.PCM5102AudioSink : proporciona reproducción a través de un DAC PCM5102 conectado al ESP32, comúnmente encontrado en la forma de pequeños módulos morados en varios minoristas en línea. El cableado se puede configurar en el fregadero y predeterminado a: También puede agregar fácilmente soporte para su propio DAC de elección implementando su propio fregadero de audio. Cada nuevo fregadero de audio debe implementar el método void feedPCMFrames(std::vector<uint8_t> &data) que debe aceptar datos de audio PCM estéreo a 44100 Hz y 16 bits por muestra. Tenga en cuenta que el fregadero debe buffer de alguna manera los datos, porque reproducirlo puede resultar en audio entrecortado.
Un sumidero de audio puede implementar opcionalmente el método void volumeChanged(uint16_t volume) que se llama cada vez que el usuario cambia el volumen (por ejemplo, a través de Spotify Connect). Si un fregadero de audio lo implementa, debe establecer softwareVolumeControl en false en su Consructor para que CSPot sepa para deshabilitar el ajuste del volumen del software. La implementación correctamente de control de volumen externo (por ejemplo a través de hardware dedicado) dará como resultado una mejor calidad de reproducción, ya que todo el rango dinámico se usa para codificar las muestras.
El programa de incrustación también debe manejar el almacenamiento en caché de los datos de autenticación, para que el usuario no tenga que autenticarse a través de la red local (ZeroConf) cada vez que se inicia CSPOT. Para referencia sobre cómo hacerlo, consulte el objetivo cspot-cli (almacena los datos en authBlob.json ).
La conexión con los servidores Spotify para reproducir música y recibir información de control es bastante compleja. En primer lugar, se debe obtener una dirección de punto de acceso desde Spotify ( ApResolve obtiene la lista de http://apresolve.spotify.com/). Luego se debe establecer una PlainConnection con el punto de acceso Spotify seleccionado. Luego se actualiza a una ShannonConnection cifrada.