46template <
typename TcpClient,
typename UdpSocket>
93 if (factor <= 0.0f) factor = 1.0f;
94 float step = 1.0f / factor;
146 bool connected =
false;
152 LOGW(
"RTSPClient: connect attempt %u failed", (
unsigned)(
attempt + 1));
156 LOGE(
"RTSPClient: TCP connect failed");
159 m_tcp.setNoDelay(
true);
173 return fail(
"OPTIONS failed");
175 LOGW(
"RTSPClient: retrying OPTIONS");
186 return fail(
"DESCRIBE failed");
205 "Transport: RTP/AVP;unicast;client_port=%u-%u\r\n",
212 "Transport: RTP/AVP/UDP;unicast;client_port=%u-%u\r\n",
217 return fail(
"SETUP failed");
239 LOGW(
"RTSPClient: proceeding without PLAY response (RTP detected)");
241 return fail(
"PLAY failed");
261 if (
m_tcp.connected()) {
318 return "audio/adpcm";
417 const char* m =
mime();
419 LOGI(
"Selecting decoder: %s", m);
432 LOGI(
"copy: %d -> %d", (
int)n, (
int)written);
524 const char* p = path;
543 for (
uint16_t p = 5004; p < 65000; p += 2) {
544 if (
m_udp.begin(p)) {
545 LOGI(
"RTSPClient: bound UDP RTP port %u", (
unsigned)p);
572 sizeof(
m_hdrBuf),
nullptr, 0,
true);
580 if (length <= 12)
return length;
598 LOGI(
"Still have unprocessed data");
614 LOGE(
"packet too small: %d", n);
622 LOGW(
"no payload: %d", n);
634 for (
int i = 0; i < 2; ++i) {
646 while ((
millis() - start) < ms) {
678 "%s %s RTSP/1.0\r\nCSeq: %u\r\nUser-Agent: ArduinoAudioTools\r\n",
679 method, url, (
unsigned)
m_cseq++);
680 if (
reqLen <= 0)
return false;
693 const char*
end =
"\r\n";
699 LOGE(
"TCP write failed");
708 if (!
quiet)
LOGE(
"RTSPClient: header read timeout");
718 if (
got < 0)
return false;
740 state = (
c ==
'\r') ? 1 : 0;
743 state = (
c ==
'\n') ? 2 : 0;
746 state = (
c ==
'\r') ? 3 : 0;
749 state = (
c ==
'\n') ? 4 : 0;
766 int a =
m_tcp.available();
781 if (
sscanf(p,
"Content-Length: %d", &len) == 1)
return len;
789 while (*p ==
' ' || *p ==
'\t') ++p;
791 while (*p && *p !=
'\r' && *p !=
'\n' && *p !=
';' &&
814 while ((p =
strcasestr(p,
"a=rtpmap:")) !=
nullptr) {
817 if (
sscanf(p,
"%d", &
pt) != 1)
continue;
819 if (!
space)
continue;
829 int rate = 0,
ch = 0;
859 p +=
strlen(
"Content-Base:");
860 while (*p ==
' ' || *p ==
'\t') ++p;
862 while (*p && *p !=
'\r' && *p !=
'\n' && i <
sizeof(
m_contentBase) - 1) {
910 if (!url)
return false;
931 for (; pos <
sizeof(tmp) - 1 && pos <
blen; ++pos) tmp[pos] = base[pos];
932 if (pos > 0 && tmp[pos - 1] !=
'/' && pos <
sizeof(tmp) - 1)
937 while (*
ctrl && pos <
sizeof(tmp) - 1) tmp[pos++] = *
ctrl++;
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30