res_audiosocket.c: Add retry mechanism for reading data from AudioSocket

The added retry mechanism addresses an issue that arises when fragmented TCP
packets are received, each containing only a portion of an AudioSocket packet.
This situation can occur if the external service sending the AudioSocket data
has Nagle's algorithm enabled.

(cherry picked from commit 787c8f647c)
This commit is contained in:
Sven Kube
2025-05-13 16:01:32 +02:00
committed by George Joseph
parent 3c6b22820a
commit bb944fb16a

View File

@@ -315,6 +315,18 @@ struct ast_frame *ast_audiosocket_receive_frame_with_hangup(const int svc,
while (i < *length) {
n = read(svc, data + i, *length - i);
if (n == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
int poll_result = ast_wait_for_input(svc, 5);
if (poll_result == 1) {
continue;
} else if (poll_result == 0) {
ast_log(LOG_WARNING, "Poll timed out while waiting for data\n");
} else {
ast_log(LOG_WARNING, "Poll error: %s\n", strerror(errno));
}
}
ast_log(LOG_ERROR, "Failed to read payload from AudioSocket: %s\n", strerror(errno));
ret = -1;
break;