Dev-Branch

Genau so meinte ich das :slight_smile:

genau dafür war das gedacht. Habe beim ersten Posting angeregt, dass entweder @wolle eine Möglichkeit schafft, das kompatibel zu erweitern oder eben wie ihr es vorgeschlagen habt.

Die Änderung in der Audio.cpp hätte den Vorteil, dass die Wahl der Stufen weiterhin einfach wie bisher frei gewählt werden könnte (z.B. bei DrehEncoder).

@Wolle wären es : 1 Zeile ind der Audio.h zu ändern und die neue (noch etwas mehr) erweiterte function in der Audio.cpp zu übernehmen.
Vorteil: Alles bleibt kompatibel und mit nur einem zusätzlichen Parameter beim Aufruf von SetVolume() wird entschieden, ob man die neue Lautstärkekurve möchte oder eben bei der bisherigen bleibt.
Zudem könnten auch andere Projekte, die diese Lib verwenden, davon profitieren.

Änderung in der Audio.h

void setVolume(uint8_t vol, uint8_t = 0);

Der neue 2. optionale default parameter gibt die gewünschte Kurvenform an (0=wie bisher, 1=neue Kurve)

Neue geänderte function in Audio.cpp

void Audio::setVolume(uint8_t vol, uint8_t curve) {
    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 ((curve==1) && (vol<21))
      m_vol = vols[vol];
    else
      m_vol = vol * vol;
    return;
}

Im espuino source wäre bei beiden Aufrufen der SetVolume() function der Parameter curve 1 zu erweitern.

audio->setVolume(AudioPlayer_CurrentVolume,1);

Fazit: Minimale Änderung,maximale Kompatibilität.

VG

Ich hab es nicht probiert, bin aber ziemlich sicher, dass das so gut funktioniert. Inzwischen lässt sich das in der AudioLib ja auch wie von dir gezeigt sehr kompakt anpassen.
Wobei wenn bei dem gezeigten Code eine höhere Anzahl Schritte gesetzt würden, die Skala bis 400 logarithmisch und ab da plötzlich quadratisch ist. Und in Bezug auf die geänderte Maximmallautstärke auch nicht mehr so ganz richtig.

Du könntest noch versuchen, statt der Quadratfunktion die Berechnung mit dem Logarithmus durchzuführen (also ohne Tabelle). Und die Maximallautstärke irgendwie sinnvoll wählen.
Ich kann mir nicht vorstellen, dass die log-funktion unzumutbar langsam ist, sonst spricht eigentlich nichts dagegen.
Dann ist das an einem Punk wo @Wolle das vielleicht sogar übernehmen möchte?

Macht Sinn!
Werde das diesbezüglich noch optimieren.

Gerade getestet , für mich vollkommen ok.

Damit ist auch ein anderer unschönen Effekt nicht mehr so auffallend.
Um nicht so große Sprünge zu haben habe ich bisher immer versucht mit 1 Step des Rotary die Lautstärke zu verändern, was in allen Regel nicht klappt da der Rotary anscheinend bei langsamen, vorsichtigen Drehungen wegen der Abtastzeiten nicht richtig ausgelesen wird. Ich habe das Problem auch mit meinem AV-Receiver.

Habe nun die Logarithmische Kurve via Berechnung implementiert damit diese Kurve auch sauber bei jeder beliebigen Stufenanzahl exakt passt. Hab es mit den default 21, 12 und 64 getestet.
Die Kurfenform hört sich exakt gleich an, einziger Unterschied ist wirklich die Anzahl der Steps.
Damit ist jetzt die Basis geschaffen, dass auch die Lautstärkestufen (Max Volume) der Anzahl der LEDs des LEDRinges angepasst werden können, ohne den Kurvenverlauf zu verändern.

Hier nochmals - insbesondere für einen Test - ganz kurz nochmals die Schritte auf, damit die Lautstärkekurve logarithmisch statt quadratisch ist.
Wäre schön, wenn das nocheinmal jemand zusätzlich testen und Feedback geben könnte. Dann würde ich nochmals einen Anlauf bei @wolle wagen.

  1. Die SetVolume function (vorerst testweise) direkt im Source der Audiolib Files .cpp und .h austauschen
In Audio.cpp

void Audio::setVolume(uint8_t vol, uint8_t curve) {
    if (vol > m_vol_steps) {
      vol = m_vol_steps;
    }
    uint16_t vol2 = vol * vol; 
    if ((curve == 1) && (vol > 0) && (m_vol_steps > 0)) {
      double log1 = log(1);
      m_vol = std::round( abs( std::exp( log1 + (vol-1) * (std::log(vol2)-log1) / (m_vol_steps-1)) ) );
      if (m_vol < vol) {
        m_vol = vol;
      }
    } else {
      m_vol = vol2;
    }
    return;
}


In Audio.h

void setVolume(uint8_t vol, uint8_t = 0);


Details dazu wie und wo siehe: Dev-Branch - #281 von Niko

  1. Im espuino src Verzeichnis: AudioPlayer.cpp
suche nach:
  audio->setVolume(AudioPlayer_CurrentVolume);
ersetze ALLE durch:
  audio->setVolume(AudioPlayer_CurrentVolume,1);  
    // 1= Logarithmische Kurve statt default quadratische

Damit wäre die neue Kurve einsatzbereit!

1 „Gefällt mir“

Das sieht besser aus, eint Tabelle für einen Spezialfall wäre nicht die Lösung gewesen. Das schaue ich mir genauer an.

3 „Gefällt mir“

Was mir noch aufgefallen ist:
espuino verwendet nicht die GetVolume() der Audiolib, die das aktuelle Volume über sqrt(m_vol) rückrechnet.

Um diese auch anpassen zu können, eventuell bei SetVolume() das zu setzende Volume in einer Variable speichern, um es bei GetVolume() wieder zurückliefern zu können. Das Rückrechnen des gerundeten Logarithmuswertes dürfte sich etwas schwieriger gestalten :wink:

VG

News aus dem DEV-Branch 20230804-1:

  • Ein größeres Refactoring der Weboberfläche: Der Template-Processor wurde ersetzt, damit sind accesspoint.html und management.html jetzt statisch und & GZIP komprimiert. Der Ressourcenverbrauch ist von 45KB auf 15KB gesunken & die Seite wird schneller ausgeliefert.
    Damit ist auch weiterer Schritt gemacht Trennung Frontend/Backend & Vorbereitung einer REST-API für zukünftige Web-UI

  • M3U Playlist-Fix, Danke an @Niko

  • Die Audio-Bibliothek kann „.oga“ Dateien (OGG Vorbis Audio) abspielen, das wird jetzt auch vom ESPuino unterstützt

10 „Gefällt mir“

Danke @tueddy und an alle Beteiligten.

2 „Gefällt mir“

Gibt es eine Anleitung wie ich DEV bauen kann? Mein Versuch lediglich den Branch in VS-Studio zu laden und zu bauen schlug plump fehl… Ich habe mich da jetzt noch nicht auf Fehlersuche begeben weil VS-Studio und Platform.io für mich absolute Unbekannte sind.

Hallo @Isstum,

etwas detailierter wäre schon fein.
Der knappen Info entnehme ich, dass du VS-Studio (Code) bereits installiert hast.
Wenn nicht, dann siehe: https://code.visualstudio.com
Wie sieht es mit PlattformIO aus?
Wenn nicht installiert, dann : Your Gateway to Embedded Software Development Excellence · PlatformIO

Von Git den DEV Branch herunterladen.

Das heruntergeladene ZIP-File: ESPuino-dev.zip unzippen.

Visual Studio Code öffnen und dort den gerade ungezippten Folder öffen:
Menüpunkte:
File
Open Folder …

Die Setting Files anpassen.

Project compilieren (gelbe Markierung) (ich denke das ist das Bauen, was du angesprochen hast)
Wenn das durchläuft dann Upload in den angeschlossenen ESP32 (rote Markierung)

2 „Gefällt mir“

Hallo Niko,
deine Formel ist schwieig zu verstehen. Ich habe Tests durchgeführt und festgestellt, dass bei größeren vol_steps am Anfang die Lautstärke über mehrere Werte kostant bleibt. Die Kurve ist am Beginn sehr flach.
Ich habe zur quadratischen eine kubische Kurve eingebaut, die eine größere Krümmung hat. Kannst du das bitte testen. Dazu gibt es im Repo einen Branch „volume-curve“.

setVolume(uint8_t vol, uint8_t curve)
curve = 0 ist wie bisher der quadratische Verlauf,
curve = 1 ist kubisch.

2 „Gefällt mir“

Danke, @Niko !

Du hast richtig geschlossen! Plattform.io hatte ich schon installiert und auch den Master schon vor langem gebaut bekommen.

Deine Anleitung hat mir insofern super geholfen als das ich vorher nicht auf die Idee gekommen bin den Dev einfach „zu öffnen“. Ich habe den komplizierten Weg über eine Änderung des bestehenden git-Settings im Master-Dev versucht ^^

Hallo @Wolle ,

leider kann ich nicht mehr nachvollziehen, wie du die Funktion in die neue function Audio::computeLimit() übertragen hast.
Die neue Funktion geht ja von einem auf 1 normierten Volumelevels mit Realzahlen, d.h. Werte zw. 0 und 1 bestimmen den Lautstärkepegel zw. 0 und 100%.

Ich habe deine neue Function nun auf diese neue Situation angepasst.
Die nun vorgeschlagene Variante würde alle Optionen offenlassen:

setVolume(volStep)
Kompatible Version mit bisheriger Kurvenform

setVolume(volStep,1)
Neue Kurvenform (logarithmisch)

Deine neue Kurvenform
setVolume(volStep,2) 2er Potenz ( wie bisher )
setVolume(volStep,3) 3er Potenz ( kubisch )
setVolume(volStep,n) nte Potenz

Hier oben beschriebene Funktion mit allen Optionen:

void Audio::computeLimit(){    // is calculated when the volume or balance changes
    double l = 1, r = 1, v = 1; // assume 100%

    /* balance is left -16...+16 right */
    /* TODO: logarithmic scaling of balance, too? */
    if(m_balance < 0){
        r -= (double)abs(m_balance) / 16;
    } else if(m_balance > 0){
        l -= (double)abs(m_balance) / 16;
    }
    // calc curve
    if ( m_curve == 1) {
        // logarithmic
        double log1 = log(1);
        if (m_vol>0) {
            v = m_vol * ((std::exp( log1 + (m_vol-1) * (std::log(m_vol_steps)-log1) / (m_vol_steps-1)))/m_vol_steps) / m_vol_steps;
        } else {
            v = 0;
        }
    } else if ( m_curve > 1) {
        // power to 
        v = (double)pow(m_vol, m_curve) / pow(m_vol_steps, m_curve);
    } else {
        // default compatible modus
        v = (double)pow(m_vol, 2) / pow(m_vol_steps, 2);
    }
    m_limit_left = l * v;
    m_limit_right = r * v;
    
    // log_i("m_limit_left %f,  m_limit_right %f ",m_limit_left, m_limit_right);
}

Wie gesagt, habe nun wieder alle Optionen mit Steps: 12, 21, 32, 64, 100 getestet und live am Lautsprecher überprüft.
Ich finde butterweiche natürliche Form.
VG

Zum Testen von verschiedenen Volume Stufen mit der neuen Kurvenform im ESPuino Projekt (dev) sind derzeit folgende kleine Adaptierungen notwendig:

Audioplayer.cpp

nach

#define AUDIOPLAYER_VOLUME_INIT 3u

neues define hinzufügen

#define VOLUMECURVE 1

In folgender function: AudioPlayer_SetMaxVolume(nvsMaxVolumeSpeaker); ggf. auskommentieren ( hat bei mir die Steps wieder verstellt)

	// Get maximum volume for speaker from NVS
	uint32_t nvsMaxVolumeSpeaker = gPrefsSettings.getUInt("maxVolumeSp", 0);
	if (nvsMaxVolumeSpeaker) {
		AudioPlayer_SetMaxVolumeSpeaker(nvsMaxVolumeSpeaker);
		// AudioPlayer_SetMaxVolume(nvsMaxVolumeSpeaker);
		Log_Printf(LOGLEVEL_INFO, restoredMaxLoudnessForSpeakerFromNvs, nvsMaxVolumeSpeaker);
	} else {
		gPrefsSettings.putUInt("maxVolumeSp", nvsMaxVolumeSpeaker);
		Log_Println(wroteMaxLoudnessForSpeakerToNvs, LOGLEVEL_ERROR);
	}

Folgendem Codeausschnitt:

void AudioPlayer_Task(void *parameter) {
	#ifdef BOARD_HAS_PSRAM
		AudioCustom *audio = new AudioCustom();
	#else
		static Audio audioAsStatic;         // Don't use heap as it's needed for other stuff :-)
		Audio *audio = &audioAsStatic;
	#endif

	#ifdef I2S_COMM_FMT_LSB_ENABLE
		audio->setI2SCommFMT_LSB(true);
	#endif

	uint8_t settleCount = 0;
	AudioPlayer_CurrentVolume = AudioPlayer_GetInitVolume();
	audio->setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
	audio->setVolume(AudioPlayer_CurrentVolume);
	audio->forceMono(gPlayProperties.currentPlayMono);
	if (gPlayProperties.currentPlayMono) {
		audio->setTone(3, 0, 0);
	}

	uint8_t currentVolume;
	static BaseType_t trackQStatus;
	static uint8_t trackCommand = NO_ACTION;
	bool audioReturnCode;

gegen folgenden tauschen:

void AudioPlayer_Task(void *parameter) {
	#ifdef BOARD_HAS_PSRAM
		AudioCustom *audio = new AudioCustom();
	#else
		static Audio audioAsStatic;         // Don't use heap as it's needed for other stuff :-)
		Audio *audio = &audioAsStatic;
	#endif

	#ifdef I2S_COMM_FMT_LSB_ENABLE
		audio->setI2SCommFMT_LSB(true);
	#endif

	uint8_t settleCount = 0;
	AudioPlayer_CurrentVolume = AudioPlayer_GetInitVolume();
	audio->setVolumeSteps(AUDIOPLAYER_VOLUME_MAX);
    AudioPlayer_SetMaxVolume(AUDIOPLAYER_VOLUME_MAX);
	audio->setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
	audio->setVolume(AudioPlayer_CurrentVolume,VOLUMECURVE);
	audio->forceMono(gPlayProperties.currentPlayMono);
	if (gPlayProperties.currentPlayMono) {
		audio->setTone(3, 0, 0);
	}

	uint8_t currentVolume;
	static BaseType_t trackQStatus;
	static uint8_t trackCommand = NO_ACTION;
	bool audioReturnCode;


und die beiden Funktionen:

audio->setVolume(currentVolume);

gegen folgende tauschen:

audio->setVolume(currentVolume,VOLUMECURVE);

Sofern ich nichts übersehen habe, sollten dann die Lautstärkestufen individuell mit

AUDIOPLAYER_VOLUME_MAX

festgelegt werden können - z.B. auf Anzahl LEDs des LED-Ringes bzw. Streifen.

Hallo Niko,
deinen Vorschlag habe ich umgesetzt.

Die blaue Kurve ist die bereits vorhandene, die rote ist deine. Gelb wäre die kubische, die hab ich nicht eingebaut. Es gibt nur 0 und 1.

6 „Gefällt mir“

Hallo @biologist ,
Hallo @tueddy,

um das Thema mit der Lautstärkekurve abschließen zu können, habe ich einen PR abgesetzt:

2 „Gefällt mir“

@Niko , @Wolle , Vielen Dank für Eure Arbeit!
Ich werde das testen & zeitnah übernehmen.

Heute Morgen lang langer Zeit wieder Problem mit mDNS SW-Version vom 20230802-1

Nach dem Einschalten hat sich Espuino mit der Fritz!Box verbunden -91 dBm, obwohl nur 3m vom Repeater entfernt . Zugriff mit mDNS nicht möglich.


Nach Restart hat sich Espuino mit dem Repeater verbunden , mDNS wieder ok.

Gestern hatte ich zur Probe mit einem anderen Espuino
Start mit bestem WLAN
gesetzt.
Nach Reboot hat der Espuino kein WiFi mehr aufgebaut. Nur noch grüne Leds und kein Zugriff möglich. WiFi aktivieren mittels CMD Tasten oder Karte ging auch nicht mehr.
Habe erase flash gemacht und neu installiert, wieder ok.
Ich habe den kompletten Vorgang noch 2 mal wiederholt , es ist aber nicht mehr aufgetreten.