Forum: Mikrocontroller und Digitale Elektronik ESP8266Audiolib: Knacken zu Beginn und am Ende eines Streams


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
Ich befasse mich gerade mit dem Beispiel "streaming MP3 from HTTP" und 
der I2C-DAC-Emulation(Wemos D1 in der Arduino IDE), was im Prinzip auch 
funktioniert.

Leider ertönen immer zu Beginn eines Streams zwei und am Ende ein lauter 
Knackton. Das sind keine Übertragungsstörungen, der eigentliche Sound 
ist - im Rahmen des Möglichen - rel. sauber.

Das Soundfile wird jeweils über 3s ein- und ausgeblendet. Das Knacken 
muss mit der Initialisierung des RX-Pin als Ausgabepin zusammenhängen. 
Hat hier jemand so viel Durchblick um eine Idee zu äußern, wie man auch 
dei PWM soft ein- und ausblenden könnte?

Die Funktion out->SetGain(x) zum Einstellen der Lautstärke funktioniert 
zwar, hat aber nur Einfluss auf den Stream, nicht auf die Knackser.

Danke für Tips.

: Bearbeitet durch User
von Michael U. (amiga)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mich damit nicht befasst, bei mir hängt ein I2S-DAC dran.

Wenn beim Streamstart die PWM gestartet wird geht der Pegelvon 0 auf den 
Mittelwert des Audiosignals, das wird knacken, beim Stop genauso.
Es dürfte zumindest etwas Aufwand machen, beim Start der Ausgabe die PWM 
von nahe 0% (oder 100% falls es von H-Pehel am Pin ausgeht) auf den 
mittleren Ausgabepegel des Soundanfangs zu fahren oder zumindest auf 
50%.
Beim Abschalten passiert es ähnlich, da müßte man also auch zaubern.

Mit einem I2S-DAC passiert das prinzipiell nicht, der will ein passendes 
Frame damit hinten was rauskommt.

Gruß aus Berlin
Michael

von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
Michael U. schrieb:
> Hallo,
>
> ich habe mich damit nicht befasst, bei mir hängt ein I2S-DAC dran.
>
> Wenn beim Streamstart die PWM gestartet wird geht der Pegelvon 0 auf den
> Mittelwert des Audiosignals, das wird knacken, beim Stop genauso.
> Es dürfte zumindest etwas Aufwand machen, beim Start der Ausgabe die PWM
> von nahe 0% (oder 100% falls es von H-Pehel am Pin ausgeht) auf den
> mittleren Ausgabepegel des Soundanfangs zu fahren oder zumindest auf
> 50%.
> Beim Abschalten passiert es ähnlich, da müßte man also auch zaubern.
>
> Mit einem I2S-DAC passiert das prinzipiell nicht, der will ein passendes
> Frame damit hinten was rauskommt.

Die Ursache denke ich mir auch so. Im Prinzip kann es aber kein so 
großes Problem sein, beim Initialisieren der PWM in einem Loop von z.B. 
200ms "soft" auf 50%& zu fahren.

Ich habe mir mal Debug-ausgaben mit jeweils einer Wartezeit von 2s in 
den Code eingesetzt. Ich weiss nun, dass es jeweils an den markierten 
Stellen knackt (s. Code).

Leider ist das Lib-Bundle ziemlich umfangreich und ich weiss nicht so 
recht, wo anfangen.
1
#include <Arduino.h>
2
#include <ESP8266WiFi.h>
3
#include "AudioFileSourceICYStream.h"
4
#include "AudioFileSourceBuffer.h"
5
#include "AudioGeneratorMP3.h"
6
#include "AudioOutputI2SNoDAC.h"
7
8
const char *SSID =      "WNK-DIGITAL";
9
const char *PASSWORD =  "1248-WNK-1632";
10
const char *URL=        "http://192.168.200.8/mtest/audio.mp3";
11
12
AudioGeneratorMP3 *mp3;
13
AudioFileSourceICYStream *file;
14
AudioFileSourceBuffer *buff;
15
AudioOutputI2SNoDAC *out;
16
17
void setup()
18
{
19
  WiFi.disconnect();
20
  WiFi.softAPdisconnect(true);
21
  WiFi.mode(WIFI_STA);
22
  WiFi.begin(SSID, PASSWORD);
23
24
  while (WiFi.status() != WL_CONNECTED) {blinx(50);}
25
26
  file = new AudioFileSourceICYStream(URL);
27
  buff = new AudioFileSourceBuffer(file, 8192);
28
29
  out = new AudioOutputI2SNoDAC(); //<----------------- erster Knacks
30
31
  mp3 = new AudioGeneratorMP3();
32
  mp3->begin(buff, out);           //<----------------- zweiter Knacks
33
  out->SetGain(3);
34
}
35
36
void loop()
37
{  
38
  if (mp3->isRunning())
39
  {
40
    if (!mp3->loop()){mp3->stop();} //<--------------- dritter Knacks
41
  }
42
  else{blinx(1000);}
43
}
44
45
void blinx(int t)
46
{
47
  pinMode(LED_BUILTIN, OUTPUT);
48
  digitalWrite(LED_BUILTIN, LOW); delay(t);
49
  digitalWrite(LED_BUILTIN, HIGH); delay(t);  
50
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.