Dev-Branch

Hallo @Niko,
die 22 Standardwerte (0…21) sind für Tasten oder Tochpads gedacht. Für Drehenkoder ist ein größerer Wertebereich besser geeignet (max 255). Ihr könnt mit audio.setVolumeSteps() den 21er Wert überschreiben. Dann ist die Lautstärke viel feinstufiger regelbar.

Hallo @Wolle!
Ich habe nur Taster und möchte nicht noch mehr steps verwenden. So wie es jetzt nach meiner Änderung ist, ist es perfekt (für mich jedenfalls).
Mein Vorschlag ginge ja nach den 22 Stufen nahtlos in das bisherige Verhalten über.
Abgesehen davon, großes Lob und Dank für diese coole Audiolib!

Software-Stand 20230731-2: Bei einem Neustart wird der ESPuino nicht länger ausgeschaltet sondern nur die Module mit xxxExit() beendet,
Es sollten jetzt auch keine Probleme mehr bei spezieller Hardware wie bei @compactflash auftreten.
Für das Ausschalten (Deep-Sleep) bleibt die Reihenfolge eh unverändert.
Sollten hier noch Probleme auftreten, wie immer hier melden…

2 „Gefällt mir“

Keine Meinung dazu?

Klar, am Besten Du stellst hier eine minimale M3U Playlist bereit um das Problem reproduziern. Oder gleich dazu einen Pull-request. Dann sollte sich das schnell lösen lassen.

1 „Gefällt mir“

Ohne das jetzt getestet zu haben sage ich nach Code-Review: Sieht so aus, als ob da ein Bug im aktuellen Code ist. Der m3u-Fall ist da nicht berücksichtigt. Oder sagen wir mal: Doch, schon, aber halt nicht, wenn da Webradio-Items drin sind. Weil dann funktioniert "audio->getAudioCurrentTime() < 5" halt nicht.

Ich habe die Implementierung davon nicht gemacht, aber wenn ich es richtig verstanden habe, dann ist DS die Anzahl der Stufen, auf die die Nachkommastelle der anzuzeigenden LEDs gecastet wird. D.h. wenn du 24 LEDs und 21 Stufen hast, dann sind das 1,14 LEDs pro Stufe. Bei Stufe 2 also 2,28. D.h. 2 volle LEDs und 0,28 weitere LEDs. Die Kommastelle wird gedimmt in einer Range von 0 bis 255 in 50 Schritten.
Also für mich klingt das erstmal ok, dass zwei LEDs voll leuchten und eine dritte so ein bisschen. Oder habe ich dich falsch verstanden?

1 „Gefällt mir“

Inhalt einer M3U Testdatei für WebRadioStations:

http://mp3channels.webradio.antenne.de/antenne
http://orf-live.ors-shoutcast.at/oe3-q2a
http://194.232.200.164:8000/;638826246082377stream.nsv

Bitte einfach die 3 Zeilen z.B. als WebRadio3.m3u in den ESPuino hochladen und über GUI abspielen.

Track Back mehrfach betätigen.
Es wird der rote LED-Ring aufleuchten wenn man auf Station 1 steht und dann aber auf die 2. eingetragene Station gewechselt und abgespielt. Das ist auch über die bauen LEDs ersichtlich (Station 2) bei Station 1 leuchten keine blauen LEDs. Somit wird ständig zw. 1. und 2. Station gewechselt.

Dann im AudioPlayer.cpp den Case: PREVIOUS RACK
durch folgenden ersetzten:

case PREVIOUSTRACK:
                    trackCommand = NO_ACTION;
                    if (gPlayProperties.pausePlay) {
                        audio->pauseResume();
                        gPlayProperties.pausePlay = false;
                    }
                    if (gPlayProperties.repeatCurrentTrack) { // End loop if button was pressed
                        gPlayProperties.repeatCurrentTrack = false;
                        #ifdef MQTT_ENABLE
                            publishMqtt(topicRepeatModeState, AudioPlayer_GetRepeatMode(), false);
                        #endif
                    }
                    if (gPlayProperties.playMode == WEBSTREAM) {
                        Log_Println(trackChangeWebstream, LOGLEVEL_INFO);
                        System_IndicateError();
                        continue;
                    } else if (gPlayProperties.playMode == LOCAL_M3U) {
                        Log_Println(cmndPrevTrack, LOGLEVEL_INFO);
                        if (gPlayProperties.currentTrackNumber > 0) {
                            gPlayProperties.currentTrackNumber--;
                        } else {
                            System_IndicateError();
                            continue;
                        }
                    } else {        
                        if (gPlayProperties.currentTrackNumber > 0 || gPlayProperties.repeatPlaylist) {
                            if (audio->getAudioCurrentTime() < 5) { // play previous track when current track time is small, else play current track again
                                if (gPlayProperties.currentTrackNumber == 0 && gPlayProperties.repeatPlaylist) {
                                    gPlayProperties.currentTrackNumber = gPlayProperties.numberOfTracks - 1;    // Go back to last track in loop-mode when first track is played
                                } else {
                                    gPlayProperties.currentTrackNumber--;
                                }
                            }

                            if (gPlayProperties.saveLastPlayPosition) {
                                AudioPlayer_NvsRfidWriteWrapper(gPlayProperties.playRfidTag, *(gPlayProperties.playlist + gPlayProperties.currentTrackNumber), 0, gPlayProperties.playMode, gPlayProperties.currentTrackNumber, gPlayProperties.numberOfTracks);
                                Log_Println(trackStartAudiobook, LOGLEVEL_INFO);
                            }

                            Log_Println(cmndPrevTrack, LOGLEVEL_INFO);
                            if (!gPlayProperties.playlistFinished) {
                                audio->stopSong();
                            }
                        } else {
                            if (gPlayProperties.saveLastPlayPosition) {
                                AudioPlayer_NvsRfidWriteWrapper(gPlayProperties.playRfidTag, *(gPlayProperties.playlist + gPlayProperties.currentTrackNumber), 0, gPlayProperties.playMode, gPlayProperties.currentTrackNumber, gPlayProperties.numberOfTracks);
                            }
                            audio->stopSong();
                            Led_Indicate(LedIndicatorType::Rewind);
                            audioReturnCode = audio->connecttoFS(gFSystem, *(gPlayProperties.playlist + gPlayProperties.currentTrackNumber));
                            // consider track as finished, when audio lib call was not successful
                            if (!audioReturnCode) {
                                System_IndicateError();
                                gPlayProperties.trackFinished = true;
                                continue;
                            }
                            Log_Println(trackStart, LOGLEVEL_INFO);
                            continue;
                        }
                    }
                    break;

Dann sollte es besser funktionieren.
Ich hoffe, ich habe keinen Testfall übersehen, wo sich die Änderungen unerwünscht auswirken könnten.

1 „Gefällt mir“

Habe auf Antwort an @tueddy meinen Vorschlag zur Reproduktion des Fehlverhaltens und zur Korrektur nach deiner Antwort gepostet.

Ich habe mich vielleicht zu wenig genau ausgedrückt worauf ich hinaus möchte:
Ich habe eben gesehen, dass hier der Parameter

#define DIMMABLE_STATES 50

ein Rolle spielt. Welche genau, habe ich auf die Schnelle nicht gesehen.
Mit stellen von 50 auf 1 hat sich das Verhalten insofern geändert, dass die 2 LED2 erst ab Stufe 6 (oder 5?) aufleuchtet, d.h. optisch verschoben. Das hat mir besser gefallen, da dann zumindest bis 5 bzw. 6 die Leds der Lautstärke entsprechen.
Ist aber nur optisch. Ich wollte halt wissen, ob das euch u.U. auch besser zusagt. Wenn nicht, bitte einfach vergessen.

Eins noch:
Ich habe nun auch für mein SmartHome die Möglichkeit zur Ausgabe von Textinformationen als Voiceinformation über den espuino analog zur Uhrzeitansage eingebaut.
Dabei musste ich ein paar Stolpersteine entfernen wie z.B: Nach Aktivierung von MQTT hat sich nach Start des espuino dieser immer wieder sofort beendet. Zudem wurden die Beleuchtung und die Lautstärke abgedreht.
Das hängt vermutlich mit der Einstellung des MQTT Brokers zusammen. Ich verwende den IOBroker mit MQTT Plugin. Hier habe ich für meine Aktoren diesen so eingestellt, dass diese sowohl bei Verbindung als auch beim Subscriben den aktuellen Wert der Nodes im IOBroker erhalten.
Das bewirkt eben das oben beschriebene Verhalten.
Diese Info teile ich für alle, die ebenfalls in solch einem Setup landen und die gleichen Probleme feststellen.
Ich habe auch hier Optimierungen im Source vorgenommen, dass das auch in diesem Setup problemlos läuft und wie schon erwähnt auch neue Topics wie

topicTellTextVolumeCmnd
topicTellTextCmnd
topicTellTextState

eingefügt.
Damit kann ich nun vom IOBroker Sprachnachrichten mit definierter Lautstärke vom espuino ausgeben lassen. Klassiker: „Waschmaschine ist fertig“

Wenn jemand Interesse hat oder das auch etwas für den devbranch sein sollte, dann bitte hier antworten.

Ist das Dein Ernst? Das nennt man auch „Papas eierlegende Wollmichsau“ & ich bin da komplett raus.

Da hast du mich aber gründlich missverstanden.
Ich habe extra geschrieben:

Betonung lag auf „WENN“!

Ich habe das bereits bei mir implementiert und dachte, falls es jemand interessiert, würde ich das gerne weitergeben!

Das hört sich dann so an:

Habe den M3U-Bugfix von @Niko getestet und er funktioniert sowohl für M3U-Playlisten als auch für Hörspielmodus. Könnte man meiner Meinung nach so übernehmen. Kann das noch wer testen/bestätigen?

1 „Gefällt mir“

Schau mal bei GitHub - SZenglein/ESP32-audioI2S: Play mp3 files from SD via I2S

Mir waren die Stufen auch zu grob und ich hab das vor Ewigkeiten geändert. Leider inzwischen schon sehr veraltet.

Es müssen gar nicht mehr als 21 Stufen sein, nur kleiner Schritte im unteren Bereich. Dafür war ursprünglich der maximale Wert in der AudioLib zu klein, aber inzwischen wurde das glaube ich auch geändert.

Was ich damit sagen will: Grundsätzlich lässt sich das Problem wie von dir angesprochen mit einer feineren logarithmischen Kurve am besten lösen, hatte ich so auch mal implementiert.

1 „Gefällt mir“

Einfach bei 21 Stufen bleiben wäre natürlich auch eine Möglichkeit und dann halt per Array von 21 intern auch 255 extern in Wolles Lib mappen.
Dann könnte sich jeder, der da an der Abstimmung was ändern will, das Array anpassen. Oder die 21 ganz fallen lassen und die Anzahl der Zahlen im Array legt dann die Anzahl der Stufen fest.

Wobei grundsätzlich finde ich 21 Stufen ok. Wegen mir kann das auch fix bei 21 bleiben.

1 „Gefällt mir“

Das wäre eine super Lösung , genau da liegt auch mein Problem.

Good job !!! :slightly_smiling_face: Danke

2 „Gefällt mir“

@compactflash Wieso wäre?

Genau diese Lösung habe ich doch schon weiter oben gepostet. Funktioniert bei mir ganz fein!

Anleitung zum Test meiner Änderung:

  • Die Datei Audio.cpp von @Wolle öffnen
    zu finden laut ScreenShot:
    (bei mir ist es die Hardwareumgebung (default_envs=) lolin_d32_pro_sdmmc_pe)

  • Suche nach: setVolume(
    und ersetze diese durch die von mir leicht geänderte:

//----------------------------------------------------------------------------
void Audio::setVolume(uint8_t vol) {
    uint16_t vols[21] = {0,1,2,3,5,7,11,16,22,30,40,52,66,83,103,127,156,193,240,301,400};
    if (vol > m_vol_steps) vol = m_vol_steps;
    if (vol<21)
      m_vol = vols[vol];
    else
      m_vol = vol * vol;
    return;
}
  • compileieren und testen :wink:

Falls du es versuchst, lass mich bitte wissen, ob das dann für dich auch das gewünschte Verhalten zeigt.

2 „Gefällt mir“

Das sieht tatsächlich ziemlich gut aus! Spricht was dagegen so das so oder so ähnlich in die Audiolib zu bringen?

Für einen Test eignet sich das ganz gut, ich würde aber vermeiden die Audio-Bibliothek zu patchen!
Wir wollen ja auch zukünftige Audio-Verbesserungen gern mitnehmen. Mein Vorschlag:

Die Lautstärkeschritte bleiben nach außen 21, sonst könnte sich jemand am Drehenkoder totdrehen.
Volume-steps werden intern im Audio Task auf z.B. 64 Schritte gesetzt. An nur zwei Stellen wird audio->setVolume() aufgerufen, dort bauen wir eine Map-Funktion ein die dann die 21 ESPuino Lautstärkestufen in die 64 Audio-Stufen umsetzt. Und in der Map-Funktion wird das dann so gemacht wie im Beispiel gezeigt…

1 „Gefällt mir“