
Un lecteur Spotify Connect écrit en ciblage CPP, mais sans s'y limiter aux appareils intégrés (ESP32).
Actuellement dans l'état de développement rapide.
Pour être utilisé avec des comptes Spotify premium
Résumé:
libasound et libavahi-compat-libdnssd Ce projet utilise des sous-modules, veuillez vous assurer que vous cliquez avec l'indicateur --recursive ou utilisez git submodule update --init --recursive .
MbedTLS est maintenant la seule option, vous pouvez donc l'obtenir à partir de là et la reconstruire ou la faire installer à l'échelle du système en utilisant votre gestionnaire de packages préféré. Voir ci-dessous comment utiliser une version locale.
Cette bibliothèque utilise NANOPB pour générer des fichiers C à partir des définitions Protobuf. Nanopb lui-même est inclus via des sous-modules, mais il nécessite quelques bibliothèques Python externes pour exécuter les générateurs.
Pour les installer, vous pouvez utiliser PIP:
$ sudo pip3 install protobuf grpcio-tools(Vous devriez probablement utiliser Venv, mais je ne suis pas un développeur Python)
Pour installer des dépendances Avahi et Asound sur Linux, vous pouvez utiliser:
$ sudo apt-get install libavahi-compat-libdnssd-dev libasound2-devLa cible CLI est principalement utilisée à des fins de test et de développement, à ce jour, il a les mêmes caractéristiques que la cible ESP32.
Comme MBEDTLS est maintenant utilisé au lieu d'OpenSSL, vous devez l'installer ou votre système ou avoir une version locale. Si vous avez une installation à l'échelle du système de mbedtls, ignorez ce qui est ci-dessous
Pour utiliser une version locale, vous devez spécifier le Bell_External_MbedTls et Potential Mbedtls_release. Le premier pointe vers le sous-sous-didir "./cmake" du répertoire de construction de MbedTLS, le second définit éventuellement le nom de la construction mbedtls (c'est par défaut défini sur `` libérer '' pour Windows et `` Noconfig '' pour d'autres).
Voir exécuter la CLI pour plus d'informations sur la façon d'exécuter CSPOT sur un ordinateur de bureau.
# 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 > ] Allez build et utilisez cspotcli.sln sous visualstudio ou utilisez msbuild à partir de la ligne de commande.
Notez que pour l'instant, seule la version Win32 a été testée, pas la version x64. Dans certaines versions VS, le Protobuf pourrait ne pas être reconstruit automatiquement, allez simplement au projet "Generate_proto_sources" et faites un C ^ f7 sur chaque *.pb.rule
La cible CLI est principalement utilisée à des fins de test et de développement, à ce jour, il a les mêmes caractéristiques que la cible 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 Voir exécuter la CLI pour plus d'informations sur la façon d'exécuter CSPOT sur un ordinateur de bureau.
La cible ESP32 est construite à l'aide de la chaîne d'outils 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 esp32Configurer CSPOT en fonction de votre matériel
# run visual config editor, when done press Q to save and exit
$ idf.py menuconfig Accédez à Example Connection Configuration et fournissez des détails de connexion WiFi

Accédez à CSPOT Configuration , vous pouvez configurer le nom du périphérique, le périphérique de sortie et la qualité audio.

Par défaut, l'indication LED est désactivée, mais vous pouvez utiliser GPIO standard ou LED adressable pour indiquer l'état de courant CSPOT. Il utilisera différents motifs de clignotements (et couleurs en cas de LED adressables) pour indiquer la connectivité WiFi et la préparation du client Spotify connecté.
Construire et télécharger le firmware
# compile
$ idf.py build
# upload
$ idf.py flashL'ESP32 redémarrera et commencera à exécuter CSPOT. Vous pouvez le surveiller à l'aide d'une console série.
Exécuter éventuellement en tant que commande unique
# compile, flash and attach monitor
$ idf.py build flash monitorAprès avoir créé l'application, la seule chose que vous devez faire est de l'exécuter via CLI.
$ ./cspotcli
Si vous l'exécutez sans paramètre, il utilisera ZeroConf pour annoncer lui-même. Cela signifie que jusqu'à ce qu'au moins une application locale Spotify Connect ait découvert et connecté, il ne sera pas enregistré pour les serveurs Spotify. En conséquence, la webapi de Spotify ne pourra pas la voir. Si vous souhaitez que le lecteur soit enregistré au démarrage, vous devez soit utiliser le nom d'utilisateur / le mot de passe tout le temps ou au moins une fois pour créer un fichier d'identification, puis réutiliser ce fichier. Exécutez-le avec -u / -p / -c une fois, puis exécutez-le avec -c uniquement. Voir l'aide de la ligne de la commande.
Ouvrez maintenant une véritable application Spotify et vous devriez voir un appareil CSPOT sur votre réseau local. Utilisez-le pour jouer audio.
cspot est destiné à être utilisé comme bibliothèque C ++ légère pour jouer à Back Spotify Music et recevoir des notifications de contrôle de Spotify Connect. Il expose une interface pour démarrer la communication avec des serveurs Spotify et s'attend à ce que le programme d'intégration fournisse une interface pour lire des échantillons audio bruts ( AudioSink ).
Vous pouvez afficher le programme cspot-cli pour une référence sur la façon d'inclure CSPOT dans votre programme. Il fournit quelques puits audio pour diverses plates-formes et utilisations:
ALSAAudioSink - Linux, nécessite libasoundPortAudioSink - MacOS (Portaudio prend également en charge plus de plates-formes, mais nous l'utilisons actuellement uniquement sur macOS), nécessite la bibliothèque PortaudioNamedPipeAudioSink - Toutes les plates-formes, écrivent dans un fichier / tuyau FIFO appelé outputFifo qui peut plus tard être lu par FFMPEG. Utilisé principalement pour les tests et le développement.En plus, les puits audio suivants sont mis en œuvre pour l'objectif ESP32:
ES9018AudioSink - Fournit la lecture via un DAC ES9018 connecté à l'ESP32AC101AudioSink - Fournit la lecture via le DAC AC101 utilisé dans les cartes Audiokit ESP32 A1S bon marché, couramment trouvées sur AliExpress.PCM5102AudioSink - Fournit la lecture via un DAC PCM5102 connecté à l'ESP32, couramment trouvé sous la forme de petits modules violets chez divers détaillants en ligne. Le câblage peut être configuré dans l'évier et par défaut: Vous pouvez également ajouter facilement la prise en charge de votre propre DAC de choix en implémentant votre propre puits audio. Chaque nouveau puits audio doit implémenter la méthode void feedPCMFrames(std::vector<uint8_t> &data) qui doit accepter les données audio PCM stéréo à 44100 Hz et 16 bits par échantillon. Veuillez noter que l'évier doit en quelque sorte tamponner les données, car les lecteurs peut entraîner un son saccadé.
Un puits audio peut éventuellement implémenter la méthode void volumeChanged(uint16_t volume) qui est appelée chaque fois que l'utilisateur modifie le volume (par exemple via Spotify Connect). Si un puits audio l'implémente, il doit définir softwareVolumeControl à false dans son consructor pour informer CSPOT pour désactiver le réglage du volume du logiciel. L'implémentation correcte du contrôle de volume externe (par exemple via le matériel dédié) entraînera une meilleure qualité de lecture car toute la plage dynamique est utilisée pour coder les échantillons.
Le programme d'intégration doit également gérer la mise en cache des données d'authentification, de sorte que l'utilisateur n'a pas à s'authentifier via le réseau local (ZeroConf) chaque fois que CSPOT est démarré. Pour référence sur la façon de le faire, veuillez vous référer à la cible cspot-cli (il stocke les données dans authBlob.json ).
La connexion avec les serveurs Spotify pour jouer de la musique et recevoir des informations de contrôle est assez complexe. Tout d'abord, une adresse de point d'accès doit être récupérée à partir de Spotify ( ApResolve récupère la liste à partir de http://apresolve.spotify.com/). Ensuite, une PlainConnection avec le point d'accès Spotify sélectionné doit être établie. Il est ensuite mis à niveau vers une ShannonConnection cryptée.