arduino-audio-tools
Loading...
Searching...
No Matches
ICYStreamT< T > Class Template Reference

Icecast/Shoutcast audio stream that separates ICY metadata from audio bytes. More...

#include <ICYStreamT.h>

Inheritance diagram for ICYStreamT< T >:
AbstractURLStream AudioStream MimeSource BaseStream AudioInfoSupport AudioInfoSource BaseStream AudioInfoSupport AudioInfoSource Stream Stream Stream Stream Print Print Print Print Print Print Print Print

Public Member Functions

 ICYStreamT (Client &clientPar, int readBufferSize=DEFAULT_BUFFER_SIZE)
 ICYStreamT (const char *ssid, const char *password, int readBufferSize=DEFAULT_BUFFER_SIZE)
 Default constructor.
 ICYStreamT (int readBufferSize=DEFAULT_BUFFER_SIZE)
virtual void addNotifyAudioChange (AudioInfoSupport &bi)
 Adds target to be notified about audio changes.
virtual void addNotifyAudioChange (AudioInfoSupport &bi)
 Adds target to be notified about audio changes.
void addRequestHeader (const char *key, const char *value) override
 Adds/Updates a request header.
virtual AudioInfo audioInfo () override
 provides the actual input AudioInfo
virtual AudioInfo audioInfo () override
 provides the actual input AudioInfo
virtual AudioInfo audioInfoOut ()
virtual AudioInfo audioInfoOut ()
virtual int available () override
 Delegates available() from the underlying stream.
int availableForWrite () override
 Writes are not supported.
virtual bool begin ()
virtual bool begin (const char *urlStr, const char *acceptMime=nullptr, MethodID action=GET, const char *reqMime="", const char *reqData="") override
virtual void clearNotifyAudioChange ()
 Deletes all change notify subscriptions.
virtual void clearNotifyAudioChange ()
 Deletes all change notify subscriptions.
int contentLength () override
 Provides the reported data size from the http reply.
virtual void end () override
 Ends the processing.
virtual void flush () override
virtual void flush () override
const char * getReplyHeader (const char *key) override
 Provides reply header info.
virtual HttpRequest & httpRequest () override
 provides access to the HttpRequest
bool isNotifyActive ()
 Checks if the automatic AudioInfo update is active.
bool isNotifyActive ()
 Checks if the automatic AudioInfo update is active.
MetaDataICY & metaDataICY ()
const char * mime () override
 Provides the MIME type for the current stream.
 operator bool ()
 True if the underlying URL stream is ready/connected.
virtual int read () override
virtual size_t readBytes (uint8_t *data, size_t len) override
 Reads audio bytes, stripping out any interleaved ICY metadata.
virtual size_t readSilence (uint8_t *buffer, size_t length)
 Source to generate silence: just sets the buffer to 0.
virtual size_t readSilence (uint8_t *buffer, size_t length)
 Source to generate silence: just sets the buffer to 0.
virtual bool removeNotifyAudioChange (AudioInfoSupport &bi)
 Removes a target in order not to be notified about audio changes.
virtual bool removeNotifyAudioChange (AudioInfoSupport &bi)
 Removes a target in order not to be notified about audio changes.
virtual void setAudioInfo (AudioInfo newInfo) override
 Defines the input AudioInfo.
virtual void setAudioInfo (AudioInfo newInfo) override
 Defines the input AudioInfo.
void setCACert (const char *cert)
 Define the Root PEM certificate for TLS/SSL.
void setClient (Client &client) override
 (Re-)defines the client
void setConnectionClose (bool flag) override
 Add Connection: close to request header.
virtual bool setMetadataCallback (void(*fn)(MetaDataType info, const char *str, int len)) override
 Defines the metadata callback function.
void setNotifyActive (bool flag)
 Deactivate/Reactivate automatic AudioInfo updates: (default is active).
void setNotifyActive (bool flag)
 Deactivate/Reactivate automatic AudioInfo updates: (default is active).
void setPassword (const char *password) override
 Sets the password that will be used for logging in (when calling begin).
void setPowerSave (bool active)
 If set to true, activates power save mode at the cost of performance (ESP32 only).
void setReadBufferSize (int readBufferSize)
void setSSID (const char *ssid) override
 Sets the ssid that will be used for logging in (when calling begin).
void setWriteBufferSize (int size)
void setWriteBufferSize (int size)
size_t totalRead () override
 Total amout of data that was consumed so far.
const char * urlStr () override
 Provides the url as string.
bool waitForData (int timeout) override
virtual size_t write (const uint8_t *data, size_t len) override
virtual size_t write (const uint8_t *data, size_t len) override
virtual size_t write (uint8_t ch) override
virtual void writeSilence (size_t len)
 Writes len bytes of silence (=0).
virtual void writeSilence (size_t len)
 Writes len bytes of silence (=0).

Protected Member Functions

virtual int not_supported (int out, const char *msg="")
virtual int not_supported (int out, const char *msg="")
void notifyAudioChange (AudioInfo info)
void notifyAudioChange (AudioInfo info)
void refillReadBuffer ()
 Refill small read buffer (e.g. 8 bytes) to avoid single byte reads when calling read().
void refillReadBuffer ()
 Refill small read buffer (e.g. 8 bytes) to avoid single byte reads when calling read().

Protected Attributes

int _timeout = 10
void(* callback )(MetaDataType info, const char *str, int len) = nullptr
MetaDataICY icy
AudioInfo info
bool is_notify_active = true
Vector< AudioInfoSupport * > notify_vector
RingBuffer< uint8_t > tmp_in {0}
RingBuffer< uint8_t > tmp_out {0}
T url
int write_buffer_size = 8

Detailed Description

template<class T>
class audio_tools::ICYStreamT< T >

Icecast/Shoutcast audio stream that separates ICY metadata from audio bytes.

ICY/Shoutcast servers interleave metadata blocks into the audio byte stream. This wrapper enables ICY metadata handling while exposing a clean audio-only stream via the standard read/available methods. Metadata is parsed by MetaDataICY and delivered through a user-supplied callback.

The class inherits from AbstractURLStream and delegates network/HTTP work to an underlying URL-like stream instance of type T. ICY support is enabled by adding the request header "Icy-MetaData: 1" and by removing metadata bytes from the returned audio stream while forwarding metadata via the callback.

Notes

  • If you run into performance issues, check if the server delivers data with HTTP chunked transfer encoding. In that case, using protocol "HTTP/1.0" can sometimes improve performance.
  • Audio bytes returned by read()/readBytes() contain no metadata; metadata is only available through the callback.
  • Use the following predefined usings:
Template Parameters
TUnderlying URL stream type; must implement the AbstractURLStream interface (e.g., provide begin/end/read/available/httpRequest, credentials, headers, etc.).
Author
Phil Schatzmann

Constructor & Destructor Documentation

◆ ICYStreamT() [1/3]

template<class T>
ICYStreamT ( int readBufferSize = DEFAULT_BUFFER_SIZE)
inline

◆ ICYStreamT() [2/3]

template<class T>
ICYStreamT ( const char * ssid,
const char * password,
int readBufferSize = DEFAULT_BUFFER_SIZE )
inline

Default constructor.

◆ ICYStreamT() [3/3]

template<class T>
ICYStreamT ( Client & clientPar,
int readBufferSize = DEFAULT_BUFFER_SIZE )
inline

Member Function Documentation

◆ addNotifyAudioChange() [1/2]

virtual void addNotifyAudioChange ( AudioInfoSupport & bi)
inlinevirtualinherited

Adds target to be notified about audio changes.

Reimplemented in CodecNOP, CodecNOP, EncodedAudioOutput, and EncodedAudioStream.

◆ addNotifyAudioChange() [2/2]

virtual void addNotifyAudioChange ( AudioInfoSupport & bi)
inlinevirtualinherited

Adds target to be notified about audio changes.

Reimplemented in CodecNOP, CodecNOP, EncodedAudioOutput, and EncodedAudioStream.

◆ addRequestHeader()

template<class T>
void addRequestHeader ( const char * key,
const char * value )
inlineoverridevirtual

Adds/Updates a request header.

Implements AbstractURLStream.

◆ audioInfo() [1/2]

◆ audioInfo() [2/2]

◆ audioInfoOut() [1/2]

◆ audioInfoOut() [2/2]

◆ available()

template<class T>
virtual int available ( )
inlineoverridevirtual

Delegates available() from the underlying stream.

Reimplemented from BaseStream.

◆ availableForWrite()

int availableForWrite ( )
inlineoverridevirtualinherited

Writes are not supported.

Reimplemented from BaseStream.

Reimplemented in URLStreamESP32.

◆ begin() [1/2]

virtual bool begin ( )
inlinevirtualinherited

Reimplemented in AdapterAudioOutputToAudioStream, AdaptiveResamplingStream, AnalogAudioStream, AdapterAudioOutputToAudioStream, AudioInputMonitor, AudioInputMonitor, AudioStreamWrapper, AudioStreamWrapper, AudioTimeSourceStream, CallbackStream, CallbackStream, CatStream, CatStream, DynamicMemoryStream, DynamicMemoryStream, EncodedAudioStream, FilteredStream< T, TF >, FilteredStream< T, TF >, GeneratedSoundStream< T >, GeneratedSoundStream< T >, GeneratedSoundStream< int16_t >, InputMerge< T >, InputMerge< T >, MemoryStream, MemoryStream, ProgressStream, ProgressStream, QueueStream< T >, QueueStream< T >, QueueStream< uint8_t >, Throttle, Throttle, TimedStream, TimerCallbackAudioStream, TimerCallbackAudioStream, VolumeMeter, VolumeMeter, AudioBoardStream, AudioEffectStream, AudioEffectStreamT< T >, AudioFFTBase, AudioInputMonitor, AudioKitStream, AudioLoRa, AudioMP34DT05, AudioOutputWithCallback, AudioStreamWrapper, AudioTimeSourceStream, AutomaticGainControlStream, CallbackStream, CatStream, ChannelFormatConverterStream, ChannelFormatConverterStreamT< T >, DynamicMemoryStream, EncodedAudioStream, Equalizer3BandsPerChannelT< T >, Equalizer3BandsPerChannelT< float >, Equalizer3BandsT< T >, Equalizer3BandsT< float >, EqualizerNBands< SampleT, AccT, NUM_TAPS, NUM_BANDS >, ESPNowStream, FileLoopT< FileType >, FileLoopT< File >, FilteredStream< T, TF >, FormatConverterStream, FrequencyDetectorAutoCorrelation, GeneratedSoundStream< T >, GoertzelStream, HLSStreamT< URLStream >, HLSStreamT< URLStreamESP32 >, I2SCodecStream, I2SStream, InputMerge< T >, MeasuringStream, MemoryStream, MiniAudioStream, MozziStream, NRF24Stream, NumberFormatConverterStream, NumberFormatConverterStreamT< TFrom, TTo >, Pipeline, Pipeline::ModifyingStreamAdapter, PortAudioStream, ProgressStream, PureDataStream, QualityAnalysisStream, QueueStream< T >, ResampleStream, ResampleStreamT< TInterpolator >, SPDIFOutput, StdioStream, SupportedRatesStream, Throttle, TimedStream, TimerCallbackAudioStream, USBAudioDeviceBase, USBAudioHostBase, VBANStream, VolumeMeter, VolumeStream, VS1053Stream, and WM8960Stream.

◆ begin() [2/2]

template<class T>
virtual bool begin ( const char * urlStr,
const char * acceptMime = nullptr,
MethodID action = GET,
const char * reqMime = "",
const char * reqData = "" )
inlineoverridevirtual

Implements AbstractURLStream.

◆ clearNotifyAudioChange() [1/2]

virtual void clearNotifyAudioChange ( )
inlinevirtualinherited

◆ clearNotifyAudioChange() [2/2]

virtual void clearNotifyAudioChange ( )
inlinevirtualinherited

◆ contentLength()

template<class T>
int contentLength ( )
inlineoverridevirtual

Provides the reported data size from the http reply.

Implements AbstractURLStream.

◆ end()

template<class T>
virtual void end ( )
inlineoverridevirtual

Ends the processing.

Implements AbstractURLStream.

◆ flush() [1/2]

◆ flush() [2/2]

◆ getReplyHeader()

template<class T>
const char * getReplyHeader ( const char * key)
inlineoverridevirtual

Provides reply header info.

Implements AbstractURLStream.

◆ httpRequest()

template<class T>
virtual HttpRequest & httpRequest ( )
inlineoverridevirtual

provides access to the HttpRequest

Implements AbstractURLStream.

◆ isNotifyActive() [1/2]

bool isNotifyActive ( )
inlineinherited

Checks if the automatic AudioInfo update is active.

◆ isNotifyActive() [2/2]

bool isNotifyActive ( )
inlineinherited

Checks if the automatic AudioInfo update is active.

◆ metaDataICY()

template<class T>
MetaDataICY & metaDataICY ( )
inline

◆ mime()

const char * mime ( )
inlineoverridevirtualinherited

Provides the MIME type for the current stream.

Implements MimeSource.

◆ not_supported() [1/2]

virtual int not_supported ( int out,
const char * msg = "" )
inlineprotectedvirtualinherited

◆ not_supported() [2/2]

virtual int not_supported ( int out,
const char * msg = "" )
inlineprotectedvirtualinherited

◆ notifyAudioChange() [1/2]

void notifyAudioChange ( AudioInfo info)
inlineprotectedinherited

◆ notifyAudioChange() [2/2]

void notifyAudioChange ( AudioInfo info)
inlineprotectedinherited

◆ operator bool()

template<class T>
operator bool ( )
inlinevirtual

True if the underlying URL stream is ready/connected.

Reimplemented from AudioStream.

◆ read()

template<class T>
virtual int read ( )
inlineoverridevirtual

◆ readBytes()

template<class T>
virtual size_t readBytes ( uint8_t * data,
size_t len )
inlineoverridevirtual

Reads audio bytes, stripping out any interleaved ICY metadata.

Reimplemented from AudioStream.

◆ readSilence() [1/2]

virtual size_t readSilence ( uint8_t * buffer,
size_t length )
inlinevirtualinherited

Source to generate silence: just sets the buffer to 0.

◆ readSilence() [2/2]

virtual size_t readSilence ( uint8_t * buffer,
size_t length )
inlinevirtualinherited

Source to generate silence: just sets the buffer to 0.

◆ refillReadBuffer() [1/2]

void refillReadBuffer ( )
inlineprotectedinherited

Refill small read buffer (e.g. 8 bytes) to avoid single byte reads when calling read().

◆ refillReadBuffer() [2/2]

void refillReadBuffer ( )
inlineprotectedinherited

Refill small read buffer (e.g. 8 bytes) to avoid single byte reads when calling read().

◆ removeNotifyAudioChange() [1/2]

virtual bool removeNotifyAudioChange ( AudioInfoSupport & bi)
inlinevirtualinherited

Removes a target in order not to be notified about audio changes.

◆ removeNotifyAudioChange() [2/2]

virtual bool removeNotifyAudioChange ( AudioInfoSupport & bi)
inlinevirtualinherited

Removes a target in order not to be notified about audio changes.

◆ setAudioInfo() [1/2]

◆ setAudioInfo() [2/2]

◆ setCACert()

template<class T>
void setCACert ( const char * cert)
inlinevirtual

Define the Root PEM certificate for TLS/SSL.

Implements AbstractURLStream.

◆ setClient()

template<class T>
void setClient ( Client & client)
inlineoverridevirtual

(Re-)defines the client

Implements AbstractURLStream.

◆ setConnectionClose()

template<class T>
void setConnectionClose ( bool flag)
inlineoverridevirtual

Add Connection: close to request header.

Implements AbstractURLStream.

◆ setMetadataCallback()

template<class T>
virtual bool setMetadataCallback ( void(* fn )(MetaDataType info, const char *str, int len))
inlineoverridevirtual

Defines the metadata callback function.

Reimplemented from AbstractURLStream.

◆ setNotifyActive() [1/2]

void setNotifyActive ( bool flag)
inlineinherited

Deactivate/Reactivate automatic AudioInfo updates: (default is active).

◆ setNotifyActive() [2/2]

void setNotifyActive ( bool flag)
inlineinherited

Deactivate/Reactivate automatic AudioInfo updates: (default is active).

◆ setPassword()

template<class T>
void setPassword ( const char * password)
inlineoverridevirtual

Sets the password that will be used for logging in (when calling begin).

Implements AbstractURLStream.

◆ setPowerSave()

template<class T>
void setPowerSave ( bool active)
inlinevirtual

If set to true, activates power save mode at the cost of performance (ESP32 only).

Implements AbstractURLStream.

◆ setReadBufferSize()

template<class T>
void setReadBufferSize ( int readBufferSize)
inline

◆ setSSID()

template<class T>
void setSSID ( const char * ssid)
inlineoverridevirtual

Sets the ssid that will be used for logging in (when calling begin).

Implements AbstractURLStream.

◆ setWriteBufferSize() [1/2]

void setWriteBufferSize ( int size)
inlineinherited

◆ setWriteBufferSize() [2/2]

void setWriteBufferSize ( int size)
inlineinherited

◆ totalRead()

template<class T>
size_t totalRead ( )
inlineoverridevirtual

Total amout of data that was consumed so far.

Implements AbstractURLStream.

◆ urlStr()

template<class T>
const char * urlStr ( )
inlineoverridevirtual

Provides the url as string.

Implements AbstractURLStream.

◆ waitForData()

template<class T>
bool waitForData ( int timeout)
inlineoverridevirtual

Waits the indicated time for the data to be available waits for some data - returns false if the request has failed

Implements AbstractURLStream.

◆ write() [1/3]

virtual size_t write ( const uint8_t * data,
size_t len )
inlineoverridevirtualinherited

Implements BaseStream.

Reimplemented in A2DPStream, AdapterAudioOutputToAudioStream, AdaptiveResamplingStream, AnalogAudioStream, AnalogDriverESP32V1::IO16Bit, AnalogDriverESP32V2::IO16Bit, AdapterAudioOutputToAudioStream, AudioInputMonitor, AudioInputMonitor, AudioStreamWrapper, AudioStreamWrapper, AudioTimeSourceStream, BufferedStream, BufferedStream, CallbackStream, CallbackStream, ConverterStream< T >, ConverterStream< T >, EncodedAudioStream, FilteredStream< T, TF >, FilteredStream< T, TF >, FilteredStream< int16_t, int16_t >, MemoryStream, MemoryStream, ProgressStream, ProgressStream, RingBufferStream, RingBufferStream, Throttle, Throttle, TimedStream, VolumeMeter, VolumeMeter, AudioBLEClient, AudioBLEClient, AudioBLEServer, AudioBLEServer, AudioEffectStream, AudioEffectStreamT< T >, AudioFFTBase, AudioInputMonitor, AudioKitStream, AudioLoRa, AudioStreamWrapper, AudioTimeSourceStream, AutomaticGainControlStream, BufferedStream, BufferedTaskStream, CallbackStream, ChannelFormatConverterStream, ChannelFormatConverterStreamT< T >, ConverterStream< T >, EncodedAudioStream, Equalizer3BandsPerChannelT< T >, Equalizer3BandsPerChannelT< float >, Equalizer3BandsT< T >, Equalizer3BandsT< float >, EqualizerNBands< SampleT, AccT, NUM_TAPS, NUM_BANDS >, ESP3288AudioOutput, FadeStream, FaustStream< DSP >, FilteredStream< T, TF >, FormatConverterStream, FrequencyDetectorAutoCorrelation, FrequencyDetectorZeroCrossing, GoertzelStream, I2SCodecStream, I2SStream, LMSEchoCancellationStream< T >, MDFEchoCancellationStream< T, SampleType >, MeasuringStream, MemoryStream, MiniAudioStream, MozziStream, NRF24Stream, NumberFormatConverterStream, NumberFormatConverterStreamT< TFrom, TTo >, Pipeline::ModifyingStreamAdapter, Pipeline, PortAudioStream, ProgressStream, PureDataStream, QualityAnalysisStream, ResampleStream, ResampleStreamT< TInterpolator >, RingBufferStream, SPDIFOutput, SPIAudioSlave, SupportedRatesStream, TfLiteAudioStream, TfLiteAudioStreamBase, Throttle, TimedStream, URLStream, URLStreamESP32, USBAudioStreamBase, VBANStream, VolumeMeter, VolumeStream, VS1053Stream, and WM8960Stream.

◆ write() [2/3]

virtual size_t write ( const uint8_t * data,
size_t len )
inlineoverridevirtualinherited

Implements BaseStream.

Reimplemented in A2DPStream, AdapterAudioOutputToAudioStream, AdaptiveResamplingStream, AnalogAudioStream, AnalogDriverESP32V1::IO16Bit, AnalogDriverESP32V2::IO16Bit, AdapterAudioOutputToAudioStream, AudioInputMonitor, AudioInputMonitor, AudioStreamWrapper, AudioStreamWrapper, AudioTimeSourceStream, BufferedStream, BufferedStream, CallbackStream, CallbackStream, ConverterStream< T >, ConverterStream< T >, EncodedAudioStream, FilteredStream< T, TF >, FilteredStream< T, TF >, FilteredStream< int16_t, int16_t >, MemoryStream, MemoryStream, ProgressStream, ProgressStream, RingBufferStream, RingBufferStream, Throttle, Throttle, TimedStream, VolumeMeter, VolumeMeter, AudioBLEClient, AudioBLEClient, AudioBLEServer, AudioBLEServer, AudioEffectStream, AudioEffectStreamT< T >, AudioFFTBase, AudioInputMonitor, AudioKitStream, AudioLoRa, AudioStreamWrapper, AudioTimeSourceStream, AutomaticGainControlStream, BufferedStream, BufferedTaskStream, CallbackStream, ChannelFormatConverterStream, ChannelFormatConverterStreamT< T >, ConverterStream< T >, EncodedAudioStream, Equalizer3BandsPerChannelT< T >, Equalizer3BandsPerChannelT< float >, Equalizer3BandsT< T >, Equalizer3BandsT< float >, EqualizerNBands< SampleT, AccT, NUM_TAPS, NUM_BANDS >, ESP3288AudioOutput, FadeStream, FaustStream< DSP >, FilteredStream< T, TF >, FormatConverterStream, FrequencyDetectorAutoCorrelation, FrequencyDetectorZeroCrossing, GoertzelStream, I2SCodecStream, I2SStream, LMSEchoCancellationStream< T >, MDFEchoCancellationStream< T, SampleType >, MeasuringStream, MemoryStream, MiniAudioStream, MozziStream, NRF24Stream, NumberFormatConverterStream, NumberFormatConverterStreamT< TFrom, TTo >, Pipeline::ModifyingStreamAdapter, Pipeline, PortAudioStream, ProgressStream, PureDataStream, QualityAnalysisStream, ResampleStream, ResampleStreamT< TInterpolator >, RingBufferStream, SPDIFOutput, SPIAudioSlave, SupportedRatesStream, TfLiteAudioStream, TfLiteAudioStreamBase, Throttle, TimedStream, URLStream, URLStreamESP32, USBAudioStreamBase, VBANStream, VolumeMeter, VolumeStream, VS1053Stream, and WM8960Stream.

◆ write() [3/3]

◆ writeSilence() [1/2]

virtual void writeSilence ( size_t len)
inlinevirtualinherited

Writes len bytes of silence (=0).

◆ writeSilence() [2/2]

virtual void writeSilence ( size_t len)
inlinevirtualinherited

Writes len bytes of silence (=0).

Member Data Documentation

◆ _timeout

int _timeout = 10
protectedinherited

◆ callback

template<class T>
void(* callback) (MetaDataType info, const char *str, int len) = nullptr
protected

◆ icy

template<class T>
MetaDataICY icy
protected

◆ info

AudioInfo info
protectedinherited

◆ is_notify_active

bool is_notify_active = true
protectedinherited

◆ notify_vector

Vector< AudioInfoSupport * > notify_vector
protectedinherited

◆ tmp_in

RingBuffer< uint8_t > tmp_in {0}
protectedinherited

◆ tmp_out

RingBuffer< uint8_t > tmp_out {0}
protectedinherited

◆ url

template<class T>
T url
protected

◆ write_buffer_size

int write_buffer_size = 8
protectedinherited

The documentation for this class was generated from the following file: