arduino-audio-tools
Loading...
Searching...
No Matches
RTSPAudioSource.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#pragma once
10
11#include "AudioTools/CoreAudio/AudioStreams.h"
12#include "IAudioSource.h"
13#include "RTSPFormat.h"
14#include "RTSPPlatform.h"
15
16
17namespace audio_tools {
18
32 public:
33 RTSPAudioSource() = default;
34
38 virtual ~RTSPAudioSource() {
39 TRACEI();
40 stop(); // Ensure we're properly stopped
41 m_magic = 0xDEADFACE; // Invalidate magic number
42 }
43
48 RTSPAudioSource(AudioStream &stream) { setInput(stream); }
49
55 RTSPAudioSource(Stream &stream, AudioInfo info) { setInput(stream, info); }
56
62 RTSPAudioSource(Stream &stream, RTSPFormat &format) {
63 setInput(stream);
64 setFormat(format);
65 }
66
71 void setInput(AudioStream &stream) {
72 p_stream = &stream;
73 p_audiostream = &stream;
74 }
75
81 void setInput(Stream &stream, AudioInfo info) {
82 p_stream = &stream;
83 p_audiostream = nullptr;
84 setAudioInfo(info);
85 }
86
91 void setInput(Stream &stream) {
92 p_stream = &stream;
93 p_audiostream = nullptr;
94 }
95
105 TRACEI();
106 default_format.begin(info);
107 if (p_audiostream) {
108 p_audiostream->setAudioInfo(info);
109 }
110 }
111
118 int readBytes(void *dest, int byteCount) override {
119 // Validate object integrity
120 if (m_magic != MAGIC_NUMBER) {
121 LOGE("RTSPAudioSource: invalid magic number 0x%08x, object corrupted",
122 m_magic);
123 return 0;
124 }
125
126 // Validate parameters
127 if (dest == nullptr || byteCount <= 0) {
128 LOGW("RTSPAudioSource: invalid parameters dest=%p byteCount=%d", dest,
129 byteCount);
130 return 0;
131 }
132
133 time_of_last_read = millis();
134
135 int result = 0;
136 LOGD("readDataTo: %d", byteCount);
137 if (started && p_stream) {
138 result = p_stream->readBytes((uint8_t *)dest, byteCount);
139 }
140 return result;
141 }
142
149 void start() override {
150 TRACEI();
151
152 // Validate object integrity
153 if (m_magic != MAGIC_NUMBER) {
154 LOGE("RTSPAudioSource: start called on corrupted object, magic=0x%08x",
155 m_magic);
156 return;
157 }
158
160 if (p_audiostream) {
161 p_audiostream->begin();
162 }
163 started = true;
164 }
165
172 void stop() override {
173 TRACEI();
174
175 // Validate object integrity (allow stop even if corrupted for cleanup)
176 if (m_magic != MAGIC_NUMBER) {
177 LOGW(
178 "RTSPAudioSource: stop called on corrupted object, magic=0x%08x, "
179 "proceeding anyway",
180 m_magic);
181 }
182
184 started = false;
185 if (p_audiostream) {
186 p_audiostream->end();
187 }
188 }
189
191 void setFragmentSize(int fragmentSize) {
192 getFormat().setFragmentSize(fragmentSize);
193 }
194
196 void setTimerPeriod(int period) { getFormat().setTimerPeriodUs(period); }
197
202 bool isActive() {
203 if (!started) return false;
204 if (timeout > 0) {
205 return millis() - time_of_last_read < timeout;
206 }
207 return true;
208 }
209
211 bool isStarted() { return started; }
212
213 void setFormat(RTSPFormat &format) { p_format = &format; }
214
215 RTSPFormat &getFormat() override { return *p_format; }
216
217 void setTimeout(uint16_t to) { timeout = to; }
218
219 protected:
220 const uint32_t MAGIC_NUMBER =
221 0xFEEDFACE; // Magic number for object validation
222 uint32_t m_magic = MAGIC_NUMBER; // Object validity marker
223 Stream *p_stream = nullptr;
224 AudioStream *p_audiostream = nullptr;
225 uint32_t time_of_last_read = 0;
226 bool started = false;
227 RTSPFormatPCM default_format; // Used for AudioStream sources
228 RTSPFormat *p_format = &default_format; // kept internally as pointer;
229 // externally exposed as reference
230 uint16_t timeout = 0;
231};
232
233} // namespace audio_tools
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:122
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition BaseStream.h:130
Audio Source Interface - Contract for Audio Data Providers.
Definition IAudioSource.h:19
virtual void start()
Initialize audio source for streaming.
Definition IAudioSource.h:65
virtual void stop()
Cleanup audio source after streaming.
Definition IAudioSource.h:78
Unified RTSP Audio Source - Works with both Stream and AudioStream.
Definition RTSPAudioSource.h:31
RTSPFormat & getFormat() override
Get the audio format configuration.
Definition RTSPAudioSource.h:215
RTSPAudioSource(Stream &stream, RTSPFormat &format)
Construct with custom format.
Definition RTSPAudioSource.h:62
void start() override
Start the audio source.
Definition RTSPAudioSource.h:149
void setAudioInfo(AudioInfo info)
Set audio configuration manually.
Definition RTSPAudioSource.h:104
bool isStarted()
Returns true after start() has been called.
Definition RTSPAudioSource.h:211
void setInput(Stream &stream, AudioInfo info)
Set input from generic Stream with explicit audio info.
Definition RTSPAudioSource.h:81
void setTimerPeriod(int period)
Defines the timer period.
Definition RTSPAudioSource.h:196
void setFragmentSize(int fragmentSize)
Defines the fragment size.
Definition RTSPAudioSource.h:191
RTSPAudioSource(Stream &stream, AudioInfo info)
Construct from generic Stream with explicit audio info.
Definition RTSPAudioSource.h:55
bool isActive()
Check if source is actively being read (AudioStream only)
Definition RTSPAudioSource.h:202
RTSPAudioSource(AudioStream &stream)
Construct from AudioStream with automatic audio info detection.
Definition RTSPAudioSource.h:48
void stop() override
Stop the audio source.
Definition RTSPAudioSource.h:172
virtual ~RTSPAudioSource()
Destructor - Clean up resources.
Definition RTSPAudioSource.h:38
void setInput(AudioStream &stream)
Set input from AudioStream (with auto-detection)
Definition RTSPAudioSource.h:71
void setInput(Stream &stream)
Set input from generic Stream (audio info must be set separately)
Definition RTSPAudioSource.h:91
int readBytes(void *dest, int byteCount) override
Read audio data for RTSP streaming.
Definition RTSPAudioSource.h:118
Audio Format Definition - Base class for RTSP audio formats.
Definition RTSPFormat.h:48
void setTimerPeriodUs(int period)
Defines the timer period in microseconds.
Definition RTSPFormat.h:83
void setFragmentSize(int fragmentSize)
Defines the fragment size in bytes.
Definition RTSPFormat.h:69
Definition NoArduino.h:142
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
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:55