arduino-audio-tools
Loading...
Searching...
No Matches
RTSPAudioStreamerUsingTask.h
Go to the documentation of this file.
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#pragma once
9#include "RTSPAudioStreamer.h"
10
11namespace audio_tools {
12
37template <typename Platform>
39 public:
42 LOGD("Creating RTSP Audio streamer with task");
43 m_taskRunning = false;
45 }
46
51
53
55 if (!m_taskRunning) {
58 m_taskCore = core;
59 LOGI("Task parameters set: stack=%d bytes, priority=%d, core=%d",
60 stackSize, priority, core);
61 } else {
62 LOGW("Cannot change task parameters while streaming is active");
63 }
64 }
65
66 void start() override {
67 LOGI("Starting RTP Stream with task");
69 if (this->m_audioSource != nullptr && !m_taskRunning) {
70 m_taskRunning = true;
71 if (!m_streamingTask.create("RTSPStreaming", m_taskStackSize,
73 LOGE("Failed to create streaming task");
74 m_taskRunning = false;
75 return;
76 }
80 if (m_streamingTask.begin([this]() { this->streamingTaskLoop(); })) {
81 LOGI("Streaming task started successfully");
82 LOGI("Task: stack=%d bytes, priority=%d, core=%d, period=%d us",
84 this->m_timer_period_us);
85#ifdef ESP32
86 LOGI("Free heap size: %i KB", esp_get_free_heap_size() / 1000);
87#endif
88 } else {
89 LOGE("Failed to start streaming task");
90 m_taskRunning = false;
91 }
92 }
93 }
94
95 void stop() override {
96 LOGI("Stopping RTP Stream with task");
97 if (m_taskRunning) {
98 m_taskRunning = false;
100 delay(50);
101 }
103 LOGI("RTP Stream with task stopped - ready for restart");
104 }
105
106 bool isTaskRunning() const { return m_taskRunning; }
110
111 protected:
113 volatile bool m_taskRunning;
116 int m_taskCore = -1;
117 bool m_throttled = true;
121 unsigned long m_last_throttle_us = 0;
122
124 LOGD("Streaming task loop iteration");
125 auto iterationStartUs = micros();
128 }
129
130 inline void applyThrottling(unsigned long iterationStartUs) {
133 if (m_throttled && m_throttle_interval > 0) {
134 if (this->checkTimerPeriodChange()) {
135 LOGI("Timer period updated; resetting throttle window to %u us",
136 (unsigned)this->m_timer_period_us);
137 m_send_counter = 0;
139 return;
140 }
143 unsigned long nowUs = micros();
145 if (actualUs < expectedUs) {
147 if (remainingUs >= 1000) delay(remainingUs / 1000);
148 uint32_t remUs = remainingUs % 1000;
149 if (remUs > 0) delayMicroseconds(remUs);
150 }
151 m_send_counter = 0;
153 }
154 }
155 }
156};
157
158} // namespace audio_tools
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
Audio Source Interface - Contract for Audio Data Providers.
Definition IAudioSource.h:19
RTSPAudioStreamerBase - Core RTP Audio Streaming Engine.
Definition RTSPAudioStreamer.h:50
int m_timer_period_us
Definition RTSPAudioStreamer.h:513
virtual void start()
Start audio source (base implementation)
Definition RTSPAudioStreamer.h:344
virtual void setAudioSource(IAudioSource *source)
Configure the audio source for streaming.
Definition RTSPAudioStreamer.h:130
static void timerCallback(void *audioStreamerObj)
Static timer callback function for periodic RTP streaming.
Definition RTSPAudioStreamer.h:477
IAudioSource * m_audioSource
Definition RTSPAudioStreamer.h:511
uint32_t getTimerPeriodUs() const
Get the timer period in microseconds.
Definition RTSPAudioStreamer.h:408
virtual void stop()
Stop audio source (base implementation)
Definition RTSPAudioStreamer.h:372
bool checkTimerPeriodChange()
Check if timer period has changed and update if necessary.
Definition RTSPAudioStreamer.h:445
RTSPAudioStreamerUsingTask - Task-driven RTP Audio Streaming Engine.
Definition RTSPAudioStreamerUsingTask.h:38
RTSPAudioStreamerUsingTask(IAudioSource &source, bool throttled=true)
Definition RTSPAudioStreamerUsingTask.h:47
void applyThrottling(unsigned long iterationStartUs)
Definition RTSPAudioStreamerUsingTask.h:130
audio_tools::Task m_streamingTask
Definition RTSPAudioStreamerUsingTask.h:112
volatile bool m_taskRunning
Definition RTSPAudioStreamerUsingTask.h:113
virtual ~RTSPAudioStreamerUsingTask()
Definition RTSPAudioStreamerUsingTask.h:52
void setFixedDelayMs(uint32_t delayUs)
Definition RTSPAudioStreamerUsingTask.h:108
void setThrottled(bool isThrottled)
Definition RTSPAudioStreamerUsingTask.h:107
uint32_t m_throttle_interval
Definition RTSPAudioStreamerUsingTask.h:119
RTSPAudioStreamerUsingTask(bool throttled=true)
Definition RTSPAudioStreamerUsingTask.h:40
void start() override
Start audio source (base implementation)
Definition RTSPAudioStreamerUsingTask.h:66
unsigned long m_last_throttle_us
Definition RTSPAudioStreamerUsingTask.h:121
uint8_t m_taskPriority
Definition RTSPAudioStreamerUsingTask.h:115
uint16_t m_fixed_delay_ms
Definition RTSPAudioStreamerUsingTask.h:118
void setThrottleInterval(uint32_t interval)
Definition RTSPAudioStreamerUsingTask.h:109
bool isTaskRunning() const
Definition RTSPAudioStreamerUsingTask.h:106
void stop() override
Stop audio source (base implementation)
Definition RTSPAudioStreamerUsingTask.h:95
void setTaskParameters(uint32_t stackSize, uint8_t priority, int core=-1)
Definition RTSPAudioStreamerUsingTask.h:54
void streamingTaskLoop()
Definition RTSPAudioStreamerUsingTask.h:123
int m_taskCore
Definition RTSPAudioStreamerUsingTask.h:116
uint32_t m_send_counter
Definition RTSPAudioStreamerUsingTask.h:120
bool m_throttled
Definition RTSPAudioStreamerUsingTask.h:117
uint32_t m_taskStackSize
Definition RTSPAudioStreamerUsingTask.h:114
FreeRTOS task.
Definition Task.h:21
bool create(const char *name, int stackSize, int priority=1, int core=-1)
If you used the empty constructor, you need to call create!
Definition Task.h:32
void end()
suspends the task
Definition Task.h:65
bool begin(std::function< void()> process)
Definition Task.h:57
void setReference(void *r)
Definition Task.h:75
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
void delayMicroseconds(unsigned int us)
Definition Time.h:28
void delay(unsigned long ms)
Definition Time.h:23
unsigned long micros(void)
Definition Time.h:33
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512