Hallo,
Ich versuche einen Snapcast Client mit meinem ESP32-A1S Audio Dev Kit zu
bauen. Und stoße dabei auf ein Problem bei dem ich nicht mehr weiter
komme.
Der Snapcast Server zerteilt den Audio Daten Strom vom Audioplayer in
20ms Stücke und sendet diese per tcp an den Client.
Das sind 3840 Bytes bei 48KHz Sample Frequenz und 16Bit Auflösung.
4Bytes für Rechts Links * 48000/50 = 3840Bytes (1 Sekunde / 20ms = 50).
Mein Problem ist das so ca. jedes 10te Datenpacket nicht vollständig von
meinem
Client empfangen wird. Bzw. recv() nicht 3840 als gelesene Bytes zurück
gibt.
Ich dachte immer das TCP/IP eine Empfangsbestätigung hat und damit
gewährleistet
das Datenpackete vollständig ankommen ?
meine Socket Read Funktion
1 | static int _snapcast_stream_socket_receive(const char *tag, const int sock, char * data, size_t max_len){
|
2 | int len = recv(sock, data, max_len, 0);
|
3 | // ESP_LOGI(tag, "[sock=%d]: MAX_LEN: %d", sock, max_len);
|
4 | if (len < 0) {
|
5 | if (errno == EINPROGRESS || errno == EAGAIN || errno == EWOULDBLOCK) {
|
6 | return 0; // Not an error
|
7 | }
|
8 | if (errno == ENOTCONN) {
|
9 | ESP_LOGW(tag, "[sock=%d]: Connection closed", sock);
|
10 | return -2; // Socket has been disconnected
|
11 | }
|
12 | log_socket_error(tag, sock, errno, "Error occurred during receiving");
|
13 | return -1;
|
14 | }
|
15 |
|
16 | return len;
|
17 | }
|
ich habe die komplette c Datei mit Header im Anhang.
Ich Nutze zur zeit pcm Audio, da ich dort immer eine konstante Anzahl
von Bytes gesendet bekomme und somit einfacher zu debugen ist. Später
will ich auf flac oder opus als Decoder umsteigen.