Immer mehr Menschen scheinen dies ohne LMS-Server zu nutzen, nur für BT, AirPlay oder Spotify. Es ist in Ordnung, aber verstehen Sie, dass SqueezeliteESP32 in erster Linie ein Logitech Media Server-Player ist und nach diesem Konzept entwickelt wurde. Bei allen anderen handelt es sich um angenähte Add-Ons, daher haben andere Modi ihre Mängel. Bitte lesen Sie dies daher unbedingt durch, bevor Sie eine Ausgabe eröffnen
Squeezelite-esp32 ist eine Audio-Software-Suite, die für die Ausführung auf den WLAN- (b/g/n) und Bluetooth-Chipsätzen espressif esp32 und esp32-s3 entwickelt wurde. Es bietet die folgenden Funktionen
Abhängig von der mit dem esp32 verbundenen Hardware können Sie Audio an einen lokalen DAC, an SPDIF oder an einen Bluetooth-Lautsprecher senden. Die unbedingt erforderliche Hardware ist ein WROVER-Modul mit 4 MB Flash und 4 MB PSRAM (https://www.espressif.com/en/products/modules/esp32). Mit diesem eigenständigen Modul müssen Sie nur Strom anlegen und schon können Sie auf einen Bluetooth-Lautsprecher streamen. Sie können Audio auch nur über ein Kabel oder einen optischen Wandler an die meisten I2S-DACs sowie an SPDIF-Empfänger senden.
Squeezelite-esp32 ist jedoch äußerst erweiterbar und kann hinzugefügt werden
Weitere Funktionen sind:
Um den Equalizer zu steuern oder die Anzeige auf LMS zu verwenden, ist ein neues Player-Modell erforderlich. Dieses wird über ein Plugin bereitgestellt, das Teil der Drittanbieter-Repositorys von LMS ist
(Die hier vorgestellten Meinungen sind also I = @philippe44) Der Hauptaufbau von Squeezelite-ESP32 ist ein interner 16-Bit-Kern mit allen Berechnungen in 32-Bit- oder Float-Genauigkeit. Dies ist eine Designentscheidung, die ich getroffen habe, um die CPU-Leistung zu erhalten (sie belastet den esp32-Chipsatz bereits erheblich) und die Speichernutzung zu optimieren, da wir nur 4 MB nutzbaren RAM haben. Einige könnten zu Recht anmerken, dass das WROVER-Modul über 8 MB RAM verfügt, der Prozessor jedoch nur 4 MB adressieren kann und die restlichen 4 MB durch kleinere Blöcke paginiert werden müssen, und dafür habe ich keine Geduld.
Als ich nun die Portierung von Squeezelite auf esp32 durchführte, habe ich zur Kompilierungszeit auch den Kern mit 16 oder 32 Bit kompatibel gemacht. Bisher funktioniert es in 32 Bit, es wurden jedoch weniger Tests durchgeführt. Sie können wählen, ob Sie es im 32-Bit-Modus kompilieren möchten. Ich interessiere mich nicht besonders für Samples über 16 Bit, da sie nichts bringen (ich habe einen technischen Hintergrund in der Informationstheorie).
Fähigkeit | 16 Bit | 32 Bit | Kommentar |
---|---|---|---|
maximale Abtastrate | 192k | 96k | 192k ist eine große Herausforderung, insbesondere in Kombination mit der Anzeige |
maximale Bittiefe | 16 | 24 | Im 16-Bit-Modus werden 24 Bit abgeschnitten |
SPDIF | 16 Bit | 20 Bit | |
mp3, aac, opus, ogg/vorbis | 48k | 48k | |
alac, flac, ogg/flac | 96k | 96k | |
PCM, WAV, AIF | 192k | 96k | |
Ausgleich | Y | N | Maximal 48 kHz (nach Resampling) – Entzerrung wird bei >48k-Spuren übersprungen |
Resampling | Y | N | |
Überblendung | 10s | <5s | hängt von der Puffergröße und der Abtastrate ab |
Der esp32 muss mit 240 MHz laufen, mit Quad-SPI I/O bei 80 MHz und einem Takt von 40 MHz. Dennoch gibt es viel zu tun, vor allem wenn man bedenkt, dass es über seriellen Flash und PSRAM verfügt. Ein großes Lob geht also an Espressif für die Chipsatzoptimierung. Nun ist die gesamte Dekodierung, Neuabtastung, Entzerrung, Verstärkung, Anzeige, Spektrum/VU ein sehr (sehr) heikles Gleichgewicht zwischen der Nutzung des internen/externen RAM, den Aufgabenprioritäten und der Pufferverwaltung. Es ist nicht perfekt und je mehr Sie das System an seine Grenzen bringen, desto höher ist das Risiko, dass einige Dateien nicht abgespielt werden (siehe unten). Im Allgemeinen hat die Anzeige immer die niedrigste Priorität und Sie werden eine Verlangsamung beim Scrollen und bei der VU/Spectrum-Aktualisierungsrate bemerken. Jetzt hat sogar der Anzeigethread einen kritischen Abschnitt und wirkt sich auf die Funktionen aus. Beispielsweise könnte ein Farbdisplay mit 16 Bit Tiefe und niedriger SPI-Geschwindigkeit verhindern, dass 24/96 Flac funktioniert, aber immer noch mit PCM 24/96 funktioniert
Im 16-Bit-Modus wird zwar 192 kHz als maximale Rate gemeldet, es wird jedoch dringend empfohlen, die gemeldete Abtastrate auf 96 K (-Z 96000) zu begrenzen. Beachten Sie, dass einige Hochgeschwindigkeits-24/96K-Online-Streams aufgrund der Leistung des TCP/IP-Stacks möglicherweise stottern. Dies liegt normalerweise daran, dass der Server kleine Datenpakete sendet und der ESP32 unabhängig von den Task-Prioritätseinstellungen codierte Audiodaten nicht schnell genug empfangen kann (ich habe versucht, das ein wenig zu optimieren). In diesem Fall besteht die beste Option darin, LMS den Stream als Proxy zu überlassen, da dadurch größere Blöcke und ein „flüssigerer“ Stream bereitgestellt werden, der dann verarbeitet werden kann.
Beachten Sie auch, dass einige Codecs mehr CPU verbrauchen als andere oder nicht so stark optimiert wurden. Ich habe mein Bestes getan, um diese zu optimieren, aber zu diesem Optimierungsgrad gehört auch das Schreiben einiger Assemblys, was mühsam ist. Ein sehr anspruchsvoller Codec ist AAC, wenn Dateien mit SBR kodiert werden. Es ermöglicht die Rekonstruktion des oberen Teils des Spektrums und damit eine höhere Abtastrate. Die Codec-Spezifikation sieht jedoch vor, dass dies optional ist. Sie können einfach das untere Band dekodieren und eine niedrigere Abtastrate akzeptieren – siehe die Option AAC_DISABLE_SBR unten.
WICHTIG: Auf esp32 (nicht esp32-s3) führt die Verwendung von Spotify mit SPDIF zu stotterndem Audio, wenn „Statistiken“ aktiviert sind. Sie MÜSSEN sie deaktivieren
Jede esp32-basierte Hardware mit mindestens 4 MB Flash und 4 MB PSRAM kann Squeezelite-esp32 ausführen, und es gibt verschiedene Boards, die einen solchen Chip enthalten. Einige sind unten aufgeführt, aber alle sollten funktionieren. Hier finden Sie verschiedene Hilfestellungen & Anleitungen
Aus Gründen der Übersichtlichkeit funktionieren WROOM-Module NICHT, da sie kein PSRAM enthalten. Einige Designs fügen es möglicherweise extern hinzu, aber das ist (sehr) unwahrscheinlich.
Gemäß der obigen Beschreibung reicht ein WROVER-Modul aus, um Squeezelite-esp32 auszuführen, aber es erfordert ein wenig Bastelarbeit, um es um analoge Audio- oder Hardwaretasten zu erweitern (z. B.)
Bitte beachten Sie, dass beim Senden an einen Bluetooth-Lautsprecher (Quelle) nur 44,1 kHz verwendet werden kann. Sie können also entweder LMS das Resampling durchführen lassen, aber sicherstellen, dass nur 44,1-kHz-Tracks gesendet werden, oder die interne Resampling-Option (mit -R) aktivieren . Wenn Sie einen DAC anschließen, hängt die Auswahl der Abtastraten von seinen Fähigkeiten ab. Weitere Einzelheiten finden Sie weiter unten.
Die meisten DAC funktionieren sofort mit einer einfachen I2S-Verbindung, einige erfordern jedoch das Senden bestimmter Befehle über I2C. Sehen Sie sich die DAC-Option unten an, um zu verstehen, wie diese dedizierten Befehle gesendet werden. Es gibt integrierte Unterstützung für TAS575x, TAS5780, TAS5713 und AC101 DAC.
Die ESP32-S3-basierten Module wie dieses werden ebenfalls unterstützt, erfordern jedoch ESP-IDF 4.4. Es ist noch nicht Teil der offiziellen Veröffentlichungen, kann aber kompiliert und ausgeführt werden. Das S3 verfügt nicht über Bluetooth-Audio. Beachten Sie, dass die CPU-Leistung erheblich verbessert wird.
Dies ist der wichtigste Hardware-Begleiter von Squeezelite-esp32 und wurde gemeinsam entwickelt. Einzelheiten zu den Funktionen finden Sie hier und hier.
Wenn Sie neu erstellen möchten, verwenden Sie die Konfigurationsdatei squeezelite-esp32-SqueezeAmp-sdkconfig.defaults
.
Hinweis: Sie können die vorgefertigten Binärdateien SqueezeAMP4MBFlash verwenden, bei denen alle Hardware-E/A ordnungsgemäß eingestellt sind. Sie können auch die generische Binärdatei I2S4MBFlash verwenden. In diesem Fall müssen die NVS-Parameter so eingestellt werden, dass genau das gleiche Verhalten erzielt wird
12=green,13=red,34=jack,2=spkfault
channel=7,scale=20.24
model=TAS57xx,bck=33,ws=25,do=32,sda=27,scl=26,mute=14:0
bck=33,ws=25,do=15
Das IR kann als Wecksignal verwendet werden (Einstellung von sleep_config
mit wake=0:0
). Da es sich um einen Pull-Up handelt, bleibt er auf 1, wenn er nichts empfängt, was bedeutet, dass er nicht in Verbindung mit anderen Weck-IOs verwendet werden kann. Weitere Informationen zur Beschränkung des Aufwachens bei mehreren Eingaben finden Sie unter Schlafen.
Dieser tragbare, batteriebetriebene Lautsprecher ist mit Squeezelite-ESP32 kompatibel, für das mit jedem Update ein spezieller Build bereitgestellt wird. Wenn Sie neu erstellen möchten, verwenden Sie die Konfigurationsdatei squeezelite-esp32-Muse-sdkconfig.defaults
.
Hinweis: Sie können die vorgefertigten Binärdateien Muse4MBFlash verwenden, bei denen alle Hardware-E/A ordnungsgemäß eingestellt sind. Sie können auch die generische Binärdatei I2S4MBFlash verwenden. In diesem Fall müssen die NVS-Parameter so eingestellt werden, dass genau das gleiche Verhalten erzielt wird
muse
channel=5,scale=7.48,atten=3,cells=1
"mosi=15,miso=2,clk=14
(dieses ist wahrscheinlich optional)model=I2S,bck=5,ws=25,do=26,di=35,i2c=16,sda=18,scl=23,mck=0
{"init":[ {"reg":0,"val":128}, {"reg":0,"val":0}, {"reg":25,"val":4}, {"reg":1,"val":80}, {"reg":2,"val":0}, {"reg":8,"val":0}, {"reg":4,"val":192}, {"reg":0,"val":18}, {"reg":1,"val":0}, {"reg":23,"val":24}, {"reg":24,"val":2}, {"reg":38,"val":9}, {"reg":39,"val":144}, {"reg":42,"val":144}, {"reg":43,"val":128}, {"reg":45,"val":128}, {"reg":27,"val":0}, {"reg":26,"val":0}, {"reg":2,"val":240}, {"reg":2,"val":0}, {"reg":29,"val":28}, {"reg":4,"val":48}, {"reg":25,"val":0}, {"reg":46,"val":33}, {"reg":47,"val":33} ]}
[{"gpio":32, "pull":true, "debounce":10, "normal":{"pressed":"ACTRLS_VOLDOWN"}}, {"gpio":19, "pull":true, "debounce":40, "normal":{"pressed":"ACTRLS_VOLUP"}}, {"gpio":12, "pull":true, "debounce":40, "long_press":1000, "normal":{"pressed":"ACTRLS_TOGGLE"},"longpress":{"pressed":"ACTRLS_POWER"}}]
Funktioniert mit dem ESP32-A1S-Modul, das Audio-Codec und Headset-Ausgabe umfasst. Sie müssen dennoch ein Demoboard wie dieses oder einen externen Verstärker verwenden, wenn Sie einen direkten Lautsprecheranschluss wünschen. Beachten Sie, dass es eine Version mit AC101-Codec und eine andere mit ES8388 mit wahrscheinlich zwei Varianten gibt – diese Platinen sind ein Chaos (siehe unten).
Das oben gezeigte Board verfügt über den folgenden IO-Satz
(Beachten Sie, dass einige GPIO Pullups benötigen)
Eine mögliche Konfiguration wäre also
21=amp,22=green:0,39=jack:0
[{ "gpio" : 5 , "normal" :{ "pressed" : " ACTRLS_TOGGLE " }},{ "gpio" : 18 , "pull" : true , "shifter_gpio" : 5 , "normal" :{ "pressed" : " ACTRLS_VOLUP " }, "shifted" :{ "pressed" : " ACTRLS_NEXT " }}, { "gpio" : 23 , "pull" : true , "shifter_gpio" : 5 , "normal" :{ "pressed" : " ACTRLS_VOLDOWN " }, "shifted" :{ "pressed" : " ACTRLS_PREV " }}]
für AC101
model=AC101,bck=27,ws=26,do=25,di=35,sda=33,scl=32
für ES8388 (es scheint, dass es Varianten mit derselben Versionsnummer gibt – ein totales Durcheinander)
model=ES8388,bck=5,ws=25,do=26,sda=18,scl=23,i2c=16
odermodel=ES8388,bck=27,ws=25,do=26,sda=33,scl=32,i2c=16
Dies ist eine unterhaltsame Smartwatch, die auf ESP32 basiert. Es verfügt über einen 240x240 ST7789-Bildschirm und integriertes Audio. Nicht sehr nützlich, um sich etwas anzuhören, aber es funktioniert. Dies ist ein Beispiel für ein Gerät, das einen I2C-Befehlssatz für seinen DAC/APU benötigt (siehe unten). Wenn Sie sich entscheiden, alles selbst neu zu erstellen, gibt es eine Build-Option, ansonsten funktioniert die I2S-Standardoption mit den folgenden Parametern
model=I2S,bck=26,ws=25,do=33,i2c=53,sda=21,scl=22
{ "init" : [ { "reg" : 41 , "val" : 128 }, { "reg" : 18 , "val" : 255 } ], "poweron" : [ { "reg" : 18 , "val" : 64 , "mode" : " or " } ], "poweroff" : [ { "reg" : 18 , "val" : 191 , "mode" : " and " } ] }
dc=27,data=19,clk=18
SPI,driver=ST7789,width=240,height=240,cs=5,back=12,speed=16000000,HFlip,VFlip
Squeezelite-esp32 erfordert einen esp32-Chipsatz und 4 MB PSRAM. ESP32-WROVER erfüllt diese Anforderungen. Um eine Audioausgabe zu erhalten, kann ein I2S-DAC verwendet werden. Günstige PCM5102 I2S DACs funktionieren, aber viele andere auch. PCM5012 DACs können angeschlossen werden über:
I2S - WROVER
VCC – 3,3 V
3,3 V – 3,3 V
GND - GND
FLT - GND
DMP – Masse
SCL - GND
BCK – (BCK – siehe unten)
DIN - (DO - siehe unten)
LCK – (WS – siehe unten) FMT – GND
XMT – 3,3 V
Verwenden Sie die Konfigurationsdatei squeezelite-esp32-I2S-4MFlash-sdkconfig.defaults
.
Und das supercoole Projekt https://github.com/rochuck/squeeze-amp-too
Um auf NVS zuzugreifen, gehen Sie in der WebUI zu „Credits“ und wählen Sie „NVS-Editor anzeigen“. Gehen Sie zur Registerkarte NVS-Editor, um die NFS-Parameter zu ändern. In der folgenden Syntaxbeschreibung bedeutet <> einen Wert, während [] optionale Parameter beschreibt.
Wie oben erwähnt, werden heute einige dedizierte Builds bereitgestellt: SqueezeAMP und Muse. Wenn Sie es jedoch selbst erstellen, können Sie auch einen Build für T-WATCH2020 erstellen. Der Standard-Build ist eine generische Firmware namens I2S, die über NVS so konfiguriert werden kann, dass sie genau die gleichen Ergebnisse liefert wie dedizierte Builds. Der Unterschied besteht darin, dass Parameter eingegeben werden müssen und versehentlich gelöscht werden können. Die GUI bietet auch eine große Hilfe beim Laden „bekannter Konfigurationssätze“.
Durch die Wahl des Designs gibt es keinen Code, der nur für eine bestimmte Version eingebettet ist, der gesamte Code ist immer vorhanden. Die Philosophie besteht darin, plattformspezifischen Code so weit wie möglich zu minimieren, und die Verwendung spezifischer #ifdef
ist unter allen Umständen verboten. Wenn Sie also Ihre eigene Plattform hinzufügen möchten, schauen Sie sich bitte das mainKConfig.projbuild
genau an, um zu sehen, wie Sie Ihr Gerät mithilfe der folgenden Parameter zu einer rein konfigurationsbasierten Lösung machen können. Wenn es wirklich keine andere Option gibt, sehen Sie sich targets<target>
an, um Ihren eigenen Code hinzuzufügen. Ich akzeptiere keine PR für Code, der die Erstellung eines solchen dedizierten Codes nach Möglichkeit vermeiden kann. Das NVS-„Ziel“ wird dann verwendet, um zielspezifischen Code aufzurufen, aber auch hier handelt es sich um reine Laufzeit und nicht um Kompilierungszeit.
Der NVS-Parameter „i2c_config“ legt den GPIO des i2c fest, der für allgemeine Zwecke (z. B. Anzeige) verwendet wird. Lassen Sie das Feld leer, um die I2C-Nutzung zu deaktivieren. Beachten Sie, dass bei SqueezeAMP der Port 1 sein muss. Die Standardgeschwindigkeit beträgt 400.000, einige Displays können jedoch bis zu 800.000 oder mehr erreichen. Syntax ist
sda=<gpio>,scl=<gpio>[,port=0|1][,speed=<speed>]
Bitte beachten Sie, dass Sie nicht denselben GPIO oder Port wie der DAC verwenden können.
Der esp32 verfügt über 4 SPI-Subsysteme, eines ist nicht zugänglich, daher ist die Nummerierung 0..2 und SPI0 ist für Flash/PSRAM reserviert. Der NVS-Parameter „spi_config“ legt den GPIO des SPI fest, der für allgemeine Zwecke (z. B. Anzeige) verwendet wird. Lassen Sie das Feld leer, um die SPI-Nutzung zu deaktivieren. Der DC-Parameter wird für Anzeigen benötigt. Syntax ist
data|mosi=<gpio>,clk=<gpio>[,dc=<gpio>][,host=1|2][,miso=<gpio>]
Standardmäßig ist nur „Host“ 1, da andere bereits von Flash und Spiram verwendet werden. Der optionale Parameter „miso“ (MasterInSlaveOut) wird nur verwendet, wenn der SPI-Bus bidirektional ist und mit anderen Peripheriegeräten wie Ethernet oder GPIO-Expander geteilt wird. Beachten Sie, dass „Daten“ auch „mosi“ (MasterOutSlaveIn) heißen kann.
Der NVS-Parameter „dac_config“ legt den GPIO fest, der für die i2s-Kommunikation mit Ihrem DAC verwendet wird. Sie können die Standardeinstellungen zur Kompilierungszeit definieren, der NVS-Parameter hat jedoch Vorrang, außer bei benannten Konfigurationen
bck=<gpio>,ws=<gpio>,do=<gpio>[,mck=0|1|2][,mute=<gpio>[:0|1][,model=TAS57xx|TAS5713|AC101|WM8978|ES8388|I2S][,sda=<gpio>,scl=<gpio>[,i2c=<addr>]]
Wenn „Modell“ nicht festgelegt ist oder nicht erkannt wird, wird standardmäßig „I2S“ verwendet. Die Option „mck“ wird für einige Codecs verwendet, die eine Hauptuhr erfordern (obwohl dies nicht der Fall sein sollte). Standardmäßig wird GPIO0 als MCLK verwendet und nur neuere Builds (nach Mitte 2023) können 1 oder 2 verwenden. Beachten Sie auch, dass dies nicht gleichzeitig mit RMII-Ethernet erfolgen kann (siehe Abschnitt „Ethernet“ unten). I2C-Parameter sind optional und werden nur benötigt, wenn Ihr DAC eine I2C-Steuerung erfordert (siehe „dac_controlset“ unten). Beachten Sie, dass „i2c“-Parameter dezimal sind. Eine Hexadezimalschreibweise ist nicht zulässig.
Bisher sind TAS57xx, TAS5713, AC101, WM8978 und ES8388 anerkannte Modelle, bei denen die richtige Initialisierungssequenz/Lautstärke/Leistungssteuerung gesendet wird. Für andere Codecs, die möglicherweise I2C-Befehle erfordern, verwenden Sie bitte den Parameter „dac_controlset“, der die Definition einfacher Befehle ermöglicht, die über i2c zum Ein- und Ausschalten von Init, Stromversorgung, Lautsprecher und Headset mithilfe einer JSON-Syntax gesendet werden:
{ <command>: [ <item1>, <item2>, ... <item3> ],
<command>: [ <item1>, <item2>, ... <item3> ],
... }
Dabei ist <command>
einer von init, poweron, poweroff, Speakeron, Speakeroff, Headseton, Headsetoff (es muss ein Array sein, auch für ein einzelnes Element). Element ist eines der folgenden Elemente
{"reg":<register>,"val":<value>,"mode":<nothing>|"or"|"and"}
{"gpio":<gpio>,"level":0|1}
{"delay":<ms>}
Dies ist die Standard-JSON-Notation. Wenn Sie damit nicht vertraut sind, ist Google Ihr bester Freund. Beachten Sie, dass „...“ bedeutet, dass Sie so viele Einträge haben können, wie Sie möchten. Dies ist nicht Teil der Syntax. Jeder Abschnitt ist optional, aber es macht keinen Sinn, i2c im Parameter „dac_config“ festzulegen und hier nichts festzulegen.
Mit der reg
-Taste können Register auf dem i2c-Bus geschrieben werden. Der mode
erlaubt to oder das Register mit dem Wert oder to und it. Stellen Sie mode
nicht ein, wenn Sie einfach nur schreiben möchten. Der val
-Parameter kann ein Array [v1, v2,...] sein, um eine Reihe von Bytes in einem einzelnen i2c-Burst zu schreiben (in diesem Fall wird „Modus“ ignoriert). Beachten Sie, dass alle Werte dezimal sein müssen . Sie können einen Validator wie diesen verwenden, um Ihre Syntax zu überprüfen. Mit der gpio
-Taste wird lediglich ein GPIO als Teil der DAC-Aktion festgelegt, und delay
ermöglicht eine Pause zwischen Elementen.
Der Befehl „power“ wird beim Ein-/Ausschalten des DAC nach der Leerlaufzeit verwendet (siehe Option -C von Squeezelite) und die Befehle „speaker/headset“ werden beim Umschalten zwischen Lautsprechern und Headsets gesendet (siehe Erkennung der Headset-Buchse).
Hinweis: Bei benannten Konfigurationen ((SqueezeAMP, Muse ... alle außer I2S) wird dies alles ignoriert. Bei bekannten Codecs können die integrierten Sequenzen mit dac_controlset überschrieben werden
Bitte beachten Sie, dass Sie nicht denselben GPIO oder Port wie den I2C verwenden können.
Der NVS-Parameter „spdif_config“ legt den GPIO des i2s fest, der für SPDIF benötigt wird.
SPDIF wird durch die Wiederverwendung der i2s-Schnittstelle auf nicht standardmäßige Weise verfügbar gemacht. Obwohl nur ein Pin (DO) benötigt wird, muss der Controller vollständig initialisiert sein, also müssen der Bittakt (bck) und der Worttakt (ws) vollständig initialisiert sein auch eingestellt. Da sich i2s und SPDIF gegenseitig ausschließen, können Sie denselben IO wiederverwenden, wenn Ihre Hardware dies zulässt.
Sie können die Standardeinstellungen zur Kompilierungszeit definieren, aber der NVS-Parameter hat Vorrang, außer bei benannten Konfigurationen (SqueezeAMP, Muse ...)
Lassen Sie das Feld leer, um die SPDIF-Nutzung zu deaktivieren. Sie können sie auch zur Kompilierungszeit mit „make menuconfig“ definieren. Syntax ist
bck=<gpio>,ws=<gpio>,do=<gpio>
Hinweis: Bei benannten Konfigurationen wird dies ignoriert
Die maximale Bittiefe beträgt 24 Bit, auch im 32-Bit-Modus (dies ist eine SPDIF-Beschränkung – danke @UrbanLienert für das Update von 20 auf 24 Bit). Jetzt können Sie SPDIF auch über einen speziellen Chip erhalten, der eine I2S-Schnittstelle wie ein DAC bietet, aber SPDIF (optisch und koaxial) ausspuckt. Bezieht sich dann auf das DAC-Kapitel.
Wenn Sie Koax benötigen, können Sie auch einen einfachen Trick anwenden, um ein Signal von einem 3,3-V-GPIO zu erzeugen. Dazu müssen lediglich die 3,3 V geteilt werden, um eine Spitze-zu-Spitze-Spannung von 0,6 V zu erzeugen, und dann der Gleichstrom entfernt werden
100nF
GPIO ----210ohm-----------||---- coax S/PDIF signal out
|
110ohm
|
Ground -------------------------- coax signal ground
Der NVS-Parameter „display_config“ legt die Parameter für eine optionale Anzeige fest. Es kann I2C (siehe hier für den gemeinsam genutzten Bus) oder SPI (siehe hier für den gemeinsam genutzten Bus) sein. Die Syntax lautet
I2C,width=<pixels>,height=<pixels>[address=<i2c_address>][,reset=<gpio>][,HFlip][,VFlip][driver=SSD1306|SSD1326[:1|4]|SSD1327|SH1106]
SPI,width=<pixels>,height=<pixels>,cs=<gpio>[,back=<gpio>][,reset=<gpio>][,speed=<speed>][,HFlip][,VFlip][driver=SSD1306|SSD1322|SSD1326[:1|4]|SSD1327|SH1106|SSD1675|ST7735|ST7789[:x=<offset>][:y=<offset>]|ILI9341[:16|18][,rotate]]
Sie können die Anzeige des VU-Meters und des Spektrumanalysators sowie die Größe des Bildmaterials über ein spezielles Menü in den Player-Einstellungen anpassen (vergessen Sie nicht, das Plugin hinzuzufügen).
Der NVS-Parameter „metadata_config“ legt fest, wie Metadaten für AirPlay und Bluetooth angezeigt werden. Syntax ist
[format=<display_content>][,speed=<speed>][,pause=<pause>][,artwork[:0|1]]
%artist%
, %album%
, %title%
enthalten. Mithilfe dieser Formatzeichenfolge werden die Schlüsselwörter durch ihren Wert ersetzt, um die anzuzeigende Zeichenfolge zu erstellen. Beachten Sie, dass der Klartext nach einem Schlüsselwort, das während der Wiedergabe eines Titels leer bleibt, entfernt wird. Wenn Sie beispielsweise format= %artist% - %title%
eingestellt haben und in den Metadaten kein Künstler vorhanden ist, wird nur <title>
angezeigt, nicht - <title>
.Sie können jeden IR-Empfänger verwenden, der mit dem NEC-Protokoll (38 kHz) oder RC5 kompatibel ist. Vcc, GND und Ausgang sind die einzigen Pins, die verbunden werden müssen, kein Pullup, kein Filterkondensator, es ist eine gerade Verbindung.
Die IR-Codes werden „wie sie sind“ an LMS gesendet, sodass nur eine Logitech SB-Fernbedienung von Boom, Classic oder Touch funktioniert. Ich denke, dass die Datei Slim_Devices_Remote.ir im „Server“-Verzeichnis von LMS geändert werden kann, um sie an andere Codes anzupassen, aber das habe ich nicht versucht.
Im AirPlay- und Bluetooth-Modus werden nur diese nativen Fernbedienungen unterstützt. Die Option zum Erstellen einer eigenen Zuordnung habe ich nicht hinzugefügt
Siehe „GPIO festlegen“ unten, um den GPIO für den Infrarotempfänger festzulegen (Option „ir“).
Der Parameter „set_GPIO“ dient der Zuweisung von GPIO zu verschiedenen Funktionen.
GPIO kann beim Booten auf GND Provide oder Vcc eingestellt werden. Dies ist praktisch, um Geräte, die weniger als 40 mA verbrauchen, über den seitlichen Anschluss mit Strom zu versorgen. Seien Sie vorsichtig, da keine Konfliktprüfungen bezüglich des GPIO, den Sie ändern, durchgeführt werden, sodass Sie möglicherweise Ihr Board beschädigen oder hier einen Konflikt verursachen.
Mit dem Parameter <amp>
kann ein GPIO zugewiesen werden, der beim Start der Wiedergabe auf den aktiven Pegel (Standard 1) gesetzt wird. Es wird zurückgesetzt, wenn Squeezelite inaktiv wird. Der Leerlauf-Timeout wird in der Squeezelite-Befehlszeile über -C <timeout>
festgelegt
Mit dem Parameter <power>
kann ein GPIO zugewiesen werden, der beim Einschalten des Players auf den aktiven Pegel (Standard 1) gesetzt und beim Ausschalten zurückgesetzt wird (gilt in LMS nicht für AirPlay, Spotify oder BT).
Wenn Sie über eine Audiobuchse verfügen, die das Einfügen unterstützt (verwenden Sie :0 oder :1, um den Pegel beim Einfügen festzulegen), können Sie angeben, an welchen GPIO sie angeschlossen ist. Mit dem Parameter jack_mutes_amp kann der Verstärker stummgeschaltet werden, wenn z. B. ein Headset angeschlossen ist.
Sie können auch die grüne und rote Status-LED mit ihrem jeweiligen aktiven Status (:0 oder :1) einstellen oder den Chipsatz angeben, wenn Sie eine adressierbare RGB-LED verwenden.
Der Parameter <ir>
legt den GPIO fest, der einem IR-Empfänger zugeordnet ist. Es ist nicht erforderlich, Pullup oder Kondensator hinzuzufügen
Syntax ist:
<gpio>=Vcc|GND|amp[:1|0]|power[:1:0]|ir[:nec|rc5]|jack[:0|1]|green[:0|1|ws2812]|red[:0|1|ws2812]|spkfault[:0|1][,<repeated sequence for next GPIO>]
Sie können die Standardeinstellungen für Jack- und Spkfault-LEDs zur Kompilierungszeit definieren, aber der NVS-Parameter hat Vorrang, außer bei benannten Konfigurationen ((SqueezeAMP, Muse ...), wo diese zur Laufzeit erzwungen werden. Beachten Sie, dass GPIO 36 und 39 nur Eingaben sind und nicht verwendet werden können Bei der Einstellung „Buchsen- oder Lautsprecherfehler“ wird der Wert durch eine 100-ms-Abfrage überprüft, aber das ist teuer
Es ist möglich, GPIO-Expander über den I2C- oder SPI-Bus hinzuzufügen. Sie sollten hauptsächlich für Schaltflächen verwendet werden, können aber auch generische Ausgaben unterstützen. Diese zusätzlichen GPIOs können beginnend mit einem beliebigen Wert nummeriert werden (40 und höher, da esp32 GPIO 0..39 hat). Dann können diese neuen „virtuellen“ GPIOs von (z. B.) 100 bis 115 in der Tastenkonfiguration, set_GPIO oder anderen Konfigurationseinstellungen verwendet werden.
Jeder Expander kann bis zu 32 GPIO unterstützen. Um einen Expander für Tasten zu verwenden, muss ein Interrupt bereitgestellt werden, der Polling-Modus ist nicht akzeptabel. Ein Expander ohne Unterbrechung kann weiterhin konfiguriert werden, es ist jedoch nur der Ausgang nutzbar. Beachten Sie, dass derselbe Interrupt von allen Expandern gemeinsam genutzt werden kann, solange sie Open Drain oder Open Collectors verwenden (was wahrscheinlich alle tun).
Der Parameter „gpio_exp_config“ ist eine durch Semikolons (;) getrennte Liste mit der folgenden Syntax für jeden Expander
model=<model>,addr=<addr>,[,port=system|dac][,base=<n>][,count=<n>][,intr=<gpio>][,cs=<gpio>][,speed=<Hz>]
Beachten Sie, dass PWM („led_brightness“ unten) für erweiterte GPIOs nicht unterstützt wird und diese nicht für Hochgeschwindigkeits- oder präzise Timing-Signale wie CS, D/C, Reset und Ready verwendet werden können. Tasten, Drehgeber, Verstärkersteuerung und Stromversorgung werden unterstützt. Abhängig vom tatsächlichen Chipsatz wird möglicherweise Pullup oder Pulldown unterstützt, sodass Sie möglicherweise externe Widerstände hinzufügen müssen (Pullup ist nur bei MCP23x17 möglich). Der pca8575 ist kein großartiger Chip, er erzeugt eine ganze Menge unerwünschter Interrupts, wenn er für den GPIO-Ausgang verwendet wird. Bei Verwendung eines SPI-Expanders muss der Bus über den gemeinsamen SPI-Bus konfiguriert werden
Unter set_GPIO erfahren Sie, wie Sie die grünen und roten LEDs (einschließlich adressierbarer RGB-LEDs) einstellen. Darüber hinaus lässt sich ihre Helligkeit über den Parameter „led_brigthness“ steuern. Die Syntax ist
[green=0..100][,red=0..100]
Hinweis: Bei der benannten Konfiguration kann der GPIO, der auf grüne und rote LEDs wirkt, nicht geändert werden, es gilt jedoch die Helligkeitsoption
Für eine verbesserte Visualisierung kann ein LED-Streifen mit bis zu 255 adressierbaren LEDs konfiguriert werden. Der VU-Meter-Visualizer verfügt über eine Batteriestatusanzeige (siehe Batterie). Derzeit werden nur WS2812B-LEDs unterstützt. Legen Sie die Hardwarekonfiguration des LED-Streifens oder die NVS-Syntax led_vu_config fest
type=[WS2812],length=<n>,gpio=<dataPin>[,scale=<gain>]
Dabei ist <n>
die Anzahl der LEDs im Streifen (1..255). Zur Verbesserung der Effektreaktionen kann ein <scale>
-Verstärkungswert (Prozentsatz) hinzugefügt werden.
Das neueste LMS-Plugin-Update ist erforderlich, um den Visualizer-Modus und die Helligkeit auf der ESP32-Einstellungsseite für den Player oder ein steuerbares Display festzulegen (siehe Extra/SqueezeESP32-Menüs). Das Plugin fügt zusätzliche LMS-CLI-Befehle hinzu.
Befehl | Notizen |
---|---|
<playerid> led_visual [<mode>] [<brightness>] | Schaltet den Visualizer-„Modus“ um oder wählt ihn aus. Die Helligkeit des Visualizers (0..255) kann über das Tag „brightness“ gesteuert werden. |
<playerid> dmx <R,G,B,R,G,B, ... R,G,B> [<offset>] | Setzt die LED-Farbe ab Position „Offset“ mit den Farbsequenzen „R“ (rot), „G“ (grün) und „B“ (blau). Fügen Sie der durch Trennzeichen getrennten Zeichenfolge zusätzliche RGB-Werte hinzu, um mehrere LEDs festzulegen. |
Ein allgemeiner Drehgeber wird unterstützt, Quadraturverschiebung durch Drücken. Solche Encoder verfügen normalerweise über zwei Pins für Encoder (A und B) und einen gemeinsamen C, der auf Masse gelegt werden muss, sowie einen optionalen SW-Pin zum Drücken. A, B und SW müssen hochgezogen werden, daher bietet ESP32 einen automatischen Hochlauf, aber Sie können Ihre eigenen Widerstände hinzufügen. Eine kleine Filterung auf A und B (~470 nF) hilft bei der Entprellung, die nicht von der Software vorgenommen wird.
Der Encoder ist normalerweise fest codiert, um bei LMS den Knopf nach links bzw. rechts bzw. zu drücken und bei BT, AirPlay und Spotify die Lautstärke zu verringern/erhöhen/abspielen. Durch die Verwendung der Option „Lautstärke“ ist es fest codiert, die Lautstärke ständig zu verringern/erhöhen/abspielen (auch in LMS). Die Option „Longpress“ ermöglicht einen alternativen Modus, wenn SW lange gedrückt wird. In diesem Modus ist links der vorherige, rechts der nächste und durch Drücken wird umgeschaltet. Jeder lange Druck auf SW wechselt zwischen den Modi (das tatsächliche Verhalten des Hauptmodus hängt von der „Lautstärke“ ab).
Es besteht auch die Möglichkeit, die Option „knobonly“ zu verwenden (ausschließlich bei „Volume“ und „Longpress“). Dieser Modus versucht, eine vollständige Navigation mit nur einem Knopf anzubieten, was aufgrund der Prinzipien der LMS-Benutzeroberfläche etwas verzerrt ist. Links, Rechts und Drücken befolgen die Navigationsregeln von LMS und insbesondere drücken Sie immer zum unteren Untermenüpunkt, auch wenn Sie in der Musikbibliothek navigieren. Das stellt eine Herausforderung dar, da es keine Schaltfläche „Wiedergabe“, „Zurück“ oder „Pause“ gibt. Folgende Problemumgehungen finden Sie:
Die Geschwindigkeit des Doppelklicks (oder Links-Rechts) kann mit dem optionalen Parameter „knobonly“ eingestellt werden. Dies ist keine perfekte Lösung und andere Ideen sind willkommen. Beachten Sie, dass die Benutzeroberfläche umso weniger reagiert, je länger Sie die Doppelklickgeschwindigkeit einstellen. Der Grund dafür ist, dass ich diese Verzögerung abwarten muss, bevor ich entscheiden kann, ob es sich um einen Einzel- oder Doppelklick handelt. Es kann auch zu Verzögerungen bei der Menünavigation kommen, die leicht als „Pause“ interpretiert werden können.
Verwenden Sie den Parameter rotation_config mit der folgenden Syntax:
A=<gpio>,B=<gpio>[,SW=gpio>[[,knobonly[=<ms>]]|[[,volume][,longpress]]]]
HW-Hinweis: Alle für Rotationszwecke verwendeten GPIOs verfügen über einen internen Pull-up, sodass normalerweise keine Vcc für den Encoder bereitgestellt werden muss. Wenn die von Ihnen verwendete Encoder-Karte jedoch auch über einen eigenen Pull-up verfügt, der stärker ist als der von ESP32 (was wahrscheinlich der Fall ist), kommt es zu Übersprechen zwischen GPIO, sodass Sie Vcc verwenden müssen. Schauen Sie sich Ihren Platinenschaltplan an und Sie werden verstehen, dass diese Platinen-Pull-Ups einen „gewinnenden“ Pull-Down erzeugen, wenn ein anderer Pin geerdet ist.
Das SW-GPIO ist optional, Sie können es bei Bedarf in eine reine Taste umwandeln, aber die Optionen „Lautstärke“, „Longpress“ und „Nur Knopf“ machen wenig Sinn, da der fehlende Schalter in diesen Modi eine wichtige Rolle spielt. Sie könnten immer noch den „Lautstärke“-Modus haben, aber Sie können ihn nicht für irgendetwas verwenden, außer die Lautstärke zu erhöhen oder zu verringern. Beachten Sie also, dass die Verwendung der Syntax [] oben etwas irreführend ist.
Sehen Sie sich auch den „WICHTIGEN HINWEIS“ im Abschnitt „Schaltflächen“ an und denken Sie daran, dass bei Aktivierung von „lms_ctrls_raw“ (siehe unten) keine dieser Optionen „Nur Knopf“, „Lautstärke“ und „Langdrücken“ zutrifft. Rohe Tastencodes (keine Aktionen) werden einfach an LMS gesendet
Beachten Sie, dass bei ESP32 GPIO 36 und 39 nur Eingaben sind und keine Interrupts verwenden können, sodass sie nicht auf A oder B eingestellt werden können. Wenn sie für SW verwendet werden, wird eine 100-ms-Abfrage verwendet, was teuer ist
Ein dedizierter Lautstärke-Drehgeber wird unterstützt, Quadraturverschiebung durch Drücken. Der Encoder ist fest codiert, um die Lautstärke zu erhöhen, zu verringern und die Wiedergabe für LMS, BT, AirPlay und Spotify umzuschalten (siehe Hinweis oben zum Filtern und HW-Hinweis sowie GPIO 36 und 39 auf esp32).
Verwenden Sie den Parameter volume_rotary mit der folgenden Syntax:
A=<gpio>,B=<gpio>[,SW=gpio>]
Schaltflächen werden mithilfe einer JSON-Zeichenfolge mit der folgenden Syntax beschrieben
[
{ "gpio" : <num>,
"type" : " BUTTON_LOW | BUTTON_HIGH " ,
"pull" :[ true|false ],
"long_press" : <ms>,
"debounce" : <ms>,
"shifter_gpio" : <-1|num>,
"normal" : { "pressed" : " <action> " , "released" : " <action> " },
"longpress" : { <same> },
"shifted" : { <same> },
"longshifted" : { <same> },
},
{ ... },
{ ... },
]
Wo (alle Parameter außer gpio sind optional)
Wobei <action>
entweder der Name einer anderen Konfiguration ist (REMAP) oder eines unter
ACTRLS_NONE, ACTRLS_POWER, ACTRLS_VOLUP, ACTRLS_VOLDOWN, ACTRLS_TOGGLE, ACTRLS_PLAY,
ACTRLS_PAUSE, ACTRLS_STOP, ACTRLS_REW, ACTRLS_FWD, ACTRLS_PREV, ACTRLS_NEXT,
BCTRLS_UP, BCTRLS_DOWN, BCTRLS_LEFT, BCTRLS_RIGHT,
BCTRLS_PS1, BCTRLS_PS2, BCTRLS_PS3, BCTRLS_PS4, BCTRLS_PS5, BCTRLS_PS6, BCTRLS_PS7, BCTRLS_PS8, BCTRLS_PS9, BCTRLS_PS10,
KNOB_LEFT, KNOB_RIGHT, KNOB_PUSH,
ACTRLS_SLEEP,
Beachten Sie, dass ACTRLS_S -Sleep keine tatsächliche Taste ist, die an LMS gesendet werden kann, sondern ein Haken, um den tiefen Schlafmodus zu aktivieren (siehe Schlaf).
Wenn Sie eine solche Zeichenfolge erstellt haben, verwenden Sie ihn, um einen neuen NVS -Parameter mit einem Namen unter 16 (?) Zeichen zu füllen. Sie können so viele dieser Konfigurationen wie möglich haben. Setzen Sie dann den Konfigurationsparameter "ACTRLS_CONfig" mit dem Namen Ihrer Standardkonfiguration
Zum Beispiel eine Konfiguration mit dem Namen "Schaltflächen":
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "normal" :{ "pressed" : " ACTRLS_VOLDOWN " }, "longpress" :{ "pressed" : " buttons_remap " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "shifter_gpio" : 4 , "normal" :{ "pressed" : " ACTRLS_VOLUP " }, "shifted" :{ "pressed" : " ACTRLS_TOGGLE " }}]
Definiert zwei Tasten
Während die Konfiguration "buttons_remap" mit dem Namen "Buttons_Remap"
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "normal" :{ "pressed" : " BCTRLS_DOWN " }, "longpress" :{ "pressed" : " buttons " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "shifter_gpio" : 4 , "normal" :{ "pressed" : " BCTRLS_UP " }}]
Definiert zwei Tasten
Unten finden Sie eine schwierige, aber funktionale 2-Button-Schnittstelle für Ihr Dekodierungsvergnügen:
actrls_config
:
buttons
buttons
:
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 ,
"normal" :{ "pressed" : " ACTRLS_VOLDOWN " },
"longpress" :{ "pressed" : " buttons_remap " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "shifter_gpio" : 4 ,
"normal" :{ "pressed" : " ACTRLS_VOLUP " },
"shifted" :{ "pressed" : " ACTRLS_TOGGLE " },
"longpress" :{ "pressed" : " ACTRLS_NEXT " }}
]
buttons_remap
:
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 ,
"normal" :{ "pressed" : " BCTRLS_DOWN " },
"longpress" :{ "pressed" : " buttons " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "shifter_gpio" : 4 ,
"normal" :{ "pressed" : " BCTRLS_UP " },
"shifted" :{ "pressed" : " BCTRLS_PUSH " },
"longpress" :{ "pressed" : " ACTRLS_PLAY " },
"longshifted" :{ "pressed" : " BCTRLS_LEFT " }}
]
Wichtiger Hinweis : LMS unterstützt auch die Möglichkeit, "RAW" -Kastcodes zu senden. Es ist ein bisschen kompliziert, also tragen Sie es mit mir. Tasten können entweder mit SqueePesp32 verarbeitet und einer "Funktion" wie Play/Pause zugeordnet werden oder sie können gerade als einfacher (RAW) -Codel an LMS gesendet werden, und die vollständige Logik von Press/Release/Longpress wird von LMS behandelt, Sie sind nicht. Ich habe die Kontrolle darüber.
Der Vorteil des "RAW" -Modus besteht darin, dass Sie einen Spieler erstellen können, der einem Boom so nah wie möglich ist (z. Begrenzter Satz von Tasten. Im 'RAW' -Modus müssen Sie nur die Zuordnung zwischen dem GPIO und der Taste definieren. In Bezug auf LMS spielt jede andere Option in diesen JSON -Nutzlasten keine Rolle. Wenn Sie nun BT oder Airplay verwenden, gilt das oben beschriebene vollständige JSON -Konstrukt vollständig, sodass die Optionen für Verschiebung, Longpress und Neuzuordnungen noch funktionieren.
Beachten Sie, dass bei Verwendung des Non -RAW -Modus die CLI (Befehlszeilenschnittstelle) von LMS verwendet wird und ohne Kennwort verfügbar sein muss
Es gibt keine gute oder schlechte Option, es ist Ihre Wahl. Verwenden Sie den NVS -Parameter "lms_ctrls_raw", um diese Option zu ändern
Beachten Sie, dass GPIO 36 und 39 nur eingegeben sind und Interrupt nicht verwenden können. Wenn sie für einen Knopf verwendet werden, wird eine 100 -ms -Umfrage gestartet, die teuer ist. Long Press wird wahrscheinlich auch nicht sehr gut funktionieren
Wired Ethernet wird von ESP32 mit verschiedenen Optionen unterstützt, aber Squeezesp32 unterstützt nur einen Microchip Lan8720 mit einer RMII-Schnittstelle wie diese oder spi-Ethernet-Brücken wie Davicom DM9051, das oder W5500 wie dies.
HINWEIS: Touch -Tasten, die auf einem Board wie dem Lyrat V4.3 finden können, werden derzeit nicht unterstützt.
GPIO | RMII -Signal | Notizen |
---|---|---|
Gpio21 | Tx_en | EMAC_TX_EN |
Gpio19 | TX0 | EMAC_TXD0 |
Gpio22 | TX1 | EMAC_TXD1 |
Gpio25 | RX0 | EMAC_RXD0 |
Gpio26 | RX1 | EMAC_RXD1 |
Gpio27 | CRS_DV | EMAC_RX_DRV |
Gpio0 | Ref_clk | 50 MHz Uhr |
model=lan8720,mdc=<gpio>,mdio=<gpio>[,rst=<gpio>]
Das Verbinden eines Reset -Pin für das LAN8720 ist optional, wird jedoch empfohlen, um zu vermeiden, dass GPIO0 (50 MHz -Eingangstakt) den ESP32 im Download -Modus zur Startzeit sperrt.
Die APLL des ESP32 ist für den Audio -Codec erforderlich, daher benötigen wir ein LAN8720, das a bietet