arduino-audio-tools
Loading...
Searching...
No Matches
RTSPServer.h
1/*
2 * Author: Phil Schatzmann
3 *
4 * Based on Micro-RTSP library:
5 * https://github.com/geeksville/Micro-RTSP
6 * https://github.com/Tomp0801/Micro-RTSP-Audio
7 *
8 */
9
10#pragma once
11#include "RTSPAudioStreamer.h"
12#include "RTSPServerBase.h"
13#ifdef ESP32
14#include <WiFi.h>
15#include <esp_wifi.h>
16
17#include "AudioTools/Concurrency/RTOS.h"
18#endif
19
20namespace audio_tools {
21
39template <typename Platform>
40class RTSPServer : public RTSPServerBase<Platform> {
41 public:
43
44 RTSPServer(streamer_t& streamer, int port = 8554, int core = 1)
45 : RTSPServerBase<Platform>(streamer, port), core(core) {}
46
47 ~RTSPServer() { end(); }
48
49#ifdef ESP32
50
51 bool begin(const char* ssid, const char* password) {
52 return RTSPServerBase<Platform>::begin(ssid, password);
53 }
54#endif
55
56 bool begin() {
57 if (!RTSPServerBase<Platform>::begin()) return false;
58 if (!serverTask.begin([this]() { serverThreadLoop(); })) {
59 LOGE("Couldn't start server thread");
60 return false;
61 }
62 return true;
63 }
64
65 void end() {
66 sessionTask.end();
67 serverTask.end();
69 }
70
71 protected:
72 int core = 0;
73 audio_tools::Task serverTask{"RTSPServerThread", 10000, 5, core};
74 audio_tools::Task sessionTask{"RTSPSessionTask", 8000, 8, core};
75
76 void serverThreadLoop() {
77 unsigned long lastCheck = millis();
78 LOGD("Server thread listening... (numClients: %d)", this->client_count);
79 int prevClientCount = this->client_count;
80 this->acceptClient();
81 // If a new client was accepted, start session task
82 if (this->client_count > prevClientCount) {
83 LOGI("Client connected");
84 if (!sessionTask.begin([this]() { sessionThreadLoop(); })) {
85 LOGE("Couldn't start sessionThread");
86 Platform::closeSocket(&this->client);
87 this->client_count--;
88 } else {
89 LOGI("Number of clients: %d", this->client_count);
90 }
91 } else if (this->client_count > 0) {
92 LOGD("Waiting for current session to end (numClients: %d)", this->client_count);
93 }
94 int time = 200 - (millis() - lastCheck);
95 if (time < 0) time = 0;
96 delay(time);
97 }
98
99 void sessionThreadLoop() {
100 LOGD("RTSP Task running");
101 while (this->rtspSession && this->rtspSession->isSessionOpen()) {
102 this->handleSession();
103 delay(30);
104 }
105 delay(500);
106 LOGI("Session cleaned up: (numClients: %d)", this->client_count);
107 sessionTask.end();
108 }
109};
110
111} // namespace audio_tools
RTSPAudioStreamerBase - Core RTP Audio Streaming Engine.
Definition RTSPAudioStreamer.h:50
RTSPServerBase - Shared logic for RTSPServer and RTSPServerTaskless.
Definition RTSPServerBase.h:29
void handleSession()
Handle requests session if active.
Definition RTSPServerBase.h:125
virtual bool begin()
Start server.
Definition RTSPServerBase.h:66
void end()
Stop server and clean up.
Definition RTSPServerBase.h:76
void acceptClient()
Accept new client if none is active.
Definition RTSPServerBase.h:108
RTSPServer - Multi-client Audio Streaming Server (task-based)
Definition RTSPServer.h:40
bool begin()
Start server.
Definition RTSPServer.h:56
FreeRTOS task.
Definition Task.h:21
void end()
suspends the task
Definition Task.h:65
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
uint32_t millis()
Returns the milliseconds since the start.
Definition Time.h:12