Ich habe die Lösung, wie angekündigt, versucht an der Wurzel zu packen.
Die Audiolib von Wolle hat intern ja 64 Stufen. Die Lautstärke wird dabei dem menschlichem Gehörempfinden logarithmisch angehoben und zwar quadratisch.
Das geht ab stufe 4 schon ganz gut aber eben weiter darunter nicht mehr so fein.
@Wolle: Gibt es noch eine andere Möglichkeit, als die Audo.cpp Datei der Library in den ESPUINO Source zu kopieren und dort zu ändern? Ansonsten ein Vorschlag weiter unten von mir.
Das war meine erste schnelle Lösung, die funktioniert, aber keineswegs ideal ist.
Ich habe die setVolume function mit einer Wertereihe belgt und dabei die Kurve ensprechend wertemäßig gewählt, dass diese am Beginn ganz flach ist.
//----------------------------------------------------------------------------
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;
}
@Wolle: Vorschlag
Ein Volume Array in der Lib public zugänglich machen (z.B. mit SetVolumeStepValues([…])) und die Werte mit den bisherigen (vol x vol) default vorbelegen. Damit wäre die function im Verhalten unverändert, man könnte die Kurve aber auch individuell nach Bedarf selber anpassen wie ich es z.B. gemacht habe.
Man könnte das auch ganz einfach so in den dev branch aufnehmen, dass die Wertetabelle in den settings.ini default wie bisher mit (vol x vol) vorbelegt vorgegeben ist und alternativ eine 2. Reihe mit meiner oder von wem auch immer individuell angepassten Lautstärkekurve zur Verfügung (Auswahl) gestellt wird. Letztere kann so durch auskommentieren gewählt werden und bei Bedarf auch noch beliebig angepasst werden.
Aufwand:
AudioLib:
Kleine Anpassung der Function setVolume wie oben vorgeschlagen
Neue function SetVolumeStepValues([…])
ESPuino:
Settings 2 Zeilen mit Wertetabelle
Eine Zeile zur Initialisierung der Wertetabelle in der AudioLib (z.B: SetVolumeStepValues([…]))
Ich bin jetzt jedenfalls happy mit dem Ergebnis. Wenn sich hier eine Lösung finden ließe, dass ich nicht bei jedem Update die Audio.cpp neu anpassen muss, wäre das toll.
Ich denke das ist auch allgemein von Interesse.
Versucht es einfach einmal mi der geänderten Audio::setVolume(uint8_t vol)
VG Niko