arduino-audio-tools
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes | List of all members
SPIRegAudioSlave Class Reference

SPI audio slave based on the TinySPISlave library: the master controls us via a small register map (see SPIRegAudioRegisters.h): More...

#include <SPIRegAudioSlave.h>

Inheritance diagram for SPIRegAudioSlave:
Inheritance graph
[legend]
Collaboration diagram for SPIRegAudioSlave:
Collaboration graph
[legend]

Public Member Functions

 SPIRegAudioSlave (BaseBuffer< uint8_t > &buffer)
 
virtual void addNotifyAudioChange (AudioInfoSupport &bi)
 Adds target to be notified about audio changes.
 
virtual AudioInfo audioInfo () override
 provides the actual input AudioInfo
 
virtual AudioInfo audioInfoOut ()
 
int available () override
 Readable audio bytes.
 
int availableForWrite () override
 Free space in the buffer: this is the value provided to the master.
 
virtual bool begin ()
 
bool begin (SPIRegAudioSlaveConfig cfg=SPIRegAudioSlaveConfig())
 
virtual void clearNotifyAudioChange ()
 Deletes all change notify subscriptions.
 
void end () override
 
virtual void flush () override
 
bool isActive () const
 
bool isNotifyActive ()
 Checks if the automatic AudioInfo update is active.
 
const char * mime () override
 
const char * mimeType ()
 Mime type defined by the master (empty if not set)
 
virtual operator bool ()
 
uint32_t overflowBytes () const
 Number of audio bytes dropped because the master ignored the flow control.
 
size_t readBytes (uint8_t *data, size_t len) override
 
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 void setAudioInfo (AudioInfo newInfo) override
 Defines the input AudioInfo.
 
void setMimeCallback (void(*cb)(const char *mime, void *ctx), void *ctx=nullptr)
 
void setNotifyActive (bool flag)
 Deactivate/Reactivate automatic AudioInfo updates: (default is active)
 
void setWriteBufferSize (int size)
 
void update ()
 Call from loop(): applies AudioInfo / mime changes made by the master.
 
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).
 

Protected Member Functions

virtual int not_supported (int out, const char *msg="")
 
void notifyAudioChange (AudioInfo info)
 
void onFrame (size_t len)
 Processes one frame: runs in ISR / SPI task context!
 
void refillReadBuffer ()
 Refill small read buffer (e.g. 8 bytes) to avoid single byte reads when calling read()
 
void stageReply (uint8_t addr, size_t want)
 
void storeWrite (uint8_t addr, size_t len)
 

Static Protected Member Functions

static void decodeInfo (const uint8_t *in, AudioInfo &out)
 
static void encodeInfo (const AudioInfo &in, uint8_t *out)
 
static void frameThunk (size_t len, void *self)
 

Protected Attributes

int _timeout = 10
 
bool active = false
 
SPIRegAudioSlaveConfig config
 
AudioInfo info
 
uint8_t info_raw [SPIREG_AUDIO_INFO_SIZE]
 
bool is_notify_active = true
 
void(* mime_cb )(const char *, void *) = nullptr
 
void * mime_ctx = nullptr
 
char mime_raw [SPIREG_MIME_SIZE]
 
char mime_str [SPIREG_MIME_SIZE] = {0}
 
Vector< AudioInfoSupport * > notify_vector
 
volatile uint32_t overflow_bytes = 0
 
BaseBuffer< uint8_t > * p_buffer = nullptr
 
volatile bool pending_info = false
 
volatile bool pending_mime = false
 
TinySPISlave spi
 
RingBuffer< uint8_t > tmp_in {0}
 
RingBuffer< uint8_t > tmp_out {0}
 
int write_buffer_size = MAX_SINGLE_CHARS
 

Detailed Description

SPI audio slave based on the TinySPISlave library: the master controls us via a small register map (see SPIRegAudioRegisters.h):

The received audio is stored in the provided buffer; read it with readBytes() or copy it to an output with StreamCopy. Call update() from loop(): it applies format changes (AudioInfo notifications) in the application context. The SPI frames themselves are processed in the interrupt (RP2040/STM32) or in the TinySPISlave task (ESP32), so the buffer should be safe for one writer (SPI) and one reader (loop), e.g. a RingBuffer.

Note
Requires the TinySPISlave library (ESP32, RP2040/RP2350, STM32).
RingBuffer<uint8_t> buffer(8 * 1024);
SPIRegAudioSlave slave(buffer);
cfg.sck = 18; cfg.miso = 19; cfg.mosi = 23; cfg.cs = 5;
slave.begin(cfg);
slave.addNotifyAudioChange(i2s); // format is set by the master
StreamCopy copier(i2s, slave);
void loop() { slave.update(); copier.copy(); }
void loop()
Implements a typed Ringbuffer.
Definition Buffers.h:363
SPI audio slave based on the TinySPISlave library: the master controls us via a small register map (s...
Definition SPIRegAudioSlave.h:56
Configuration for SPIRegAudioSlave.
Definition SPIRegAudioSlave.h:15

Constructor & Destructor Documentation

◆ SPIRegAudioSlave()

SPIRegAudioSlave ( BaseBuffer< uint8_t > &  buffer)
inline

Member Function Documentation

◆ addNotifyAudioChange()

virtual void addNotifyAudioChange ( AudioInfoSupport &  bi)
inlinevirtualinherited

◆ audioInfo()

virtual AudioInfo audioInfo ( )
inlineoverridevirtualinherited

◆ audioInfoOut()

virtual AudioInfo audioInfoOut ( )
inlinevirtualinherited

◆ available()

int available ( )
inlineoverridevirtual

Readable audio bytes.

Reimplemented from BaseStream.

◆ availableForWrite()

int availableForWrite ( )
inlineoverridevirtual

Free space in the buffer: this is the value provided to the master.

Reimplemented from BaseStream.

◆ begin() [1/2]

virtual bool begin ( )
inlinevirtualinherited

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

◆ begin() [2/2]

◆ clearNotifyAudioChange()

virtual void clearNotifyAudioChange ( )
inlinevirtualinherited

Deletes all change notify subscriptions.

Reimplemented in RTSPClient< TcpClient, UdpSocket >.

◆ decodeInfo()

static void decodeInfo ( const uint8_t *  in,
AudioInfo &  out 
)
inlinestaticprotected

◆ encodeInfo()

static void encodeInfo ( const AudioInfo &  in,
uint8_t *  out 
)
inlinestaticprotected

◆ end()

void end ( )
inlineoverridevirtual

Reimplemented from BaseStream.

◆ flush()

virtual void flush ( )
inlineoverridevirtualinherited

◆ frameThunk()

static void frameThunk ( size_t  len,
void *  self 
)
inlinestaticprotected

◆ isActive()

bool isActive ( ) const
inline

◆ isNotifyActive()

bool isNotifyActive ( )
inlineinherited

Checks if the automatic AudioInfo update is active.

◆ mime()

const char * mime ( )
inlineoverridevirtual

Mime type defined by the master (nullptr if not set): this allows to use the slave as source for the MultiDecoder

Implements MimeSource.

◆ mimeType()

const char * mimeType ( )
inline

Mime type defined by the master (empty if not set)

◆ not_supported()

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

◆ notifyAudioChange()

void notifyAudioChange ( AudioInfo  info)
inlineprotectedinherited

◆ onFrame()

void onFrame ( size_t  len)
inlineprotected

Processes one frame: runs in ISR / SPI task context!

◆ operator bool()

virtual operator bool ( )
inlinevirtualinherited

◆ overflowBytes()

uint32_t overflowBytes ( ) const
inline

Number of audio bytes dropped because the master ignored the flow control.

◆ readBytes()

size_t readBytes ( uint8_t *  data,
size_t  len 
)
inlineoverridevirtual

Reimplemented from AudioStream.

◆ readSilence()

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

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

◆ refillReadBuffer()

void refillReadBuffer ( )
inlineprotectedinherited

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

◆ removeNotifyAudioChange()

virtual bool removeNotifyAudioChange ( AudioInfoSupport &  bi)
inlinevirtualinherited

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

Reimplemented in RTSPClient< TcpClient, UdpSocket >.

◆ setAudioInfo()

virtual void setAudioInfo ( AudioInfo  info)
inlineoverridevirtualinherited

◆ setMimeCallback()

void setMimeCallback ( void(*)(const char *mime, void *ctx)  cb,
void *  ctx = nullptr 
)
inline

Callback which is called from update() when the master has defined a (new) mime type: e.g. to restart the decoder

◆ setNotifyActive()

void setNotifyActive ( bool  flag)
inlineinherited

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

◆ setWriteBufferSize()

void setWriteBufferSize ( int  size)
inlineinherited

◆ stageReply()

void stageReply ( uint8_t  addr,
size_t  want 
)
inlineprotected

◆ storeWrite()

void storeWrite ( uint8_t  addr,
size_t  len 
)
inlineprotected

◆ update()

void update ( )
inline

Call from loop(): applies AudioInfo / mime changes made by the master.

◆ write() [1/2]

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

Implements BaseStream.

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

◆ write() [2/2]

virtual size_t write ( uint8_t  ch)
inlineoverridevirtualinherited

◆ writeSilence()

virtual void writeSilence ( size_t  len)
inlinevirtualinherited

Writes len bytes of silence (=0).

Member Data Documentation

◆ _timeout

int _timeout = 10
protectedinherited

◆ active

bool active = false
protected

◆ config

SPIRegAudioSlaveConfig config
protected

◆ info

AudioInfo info
protectedinherited

◆ info_raw

uint8_t info_raw[SPIREG_AUDIO_INFO_SIZE]
protected

◆ is_notify_active

bool is_notify_active = true
protectedinherited

◆ mime_cb

void(* mime_cb) (const char *, void *) = nullptr
protected

◆ mime_ctx

void* mime_ctx = nullptr
protected

◆ mime_raw

char mime_raw[SPIREG_MIME_SIZE]
protected

◆ mime_str

char mime_str[SPIREG_MIME_SIZE] = {0}
protected

◆ notify_vector

Vector<AudioInfoSupport*> notify_vector
protectedinherited

◆ overflow_bytes

volatile uint32_t overflow_bytes = 0
protected

◆ p_buffer

BaseBuffer<uint8_t>* p_buffer = nullptr
protected

◆ pending_info

volatile bool pending_info = false
protected

◆ pending_mime

volatile bool pending_mime = false
protected

◆ spi

TinySPISlave spi
protected

◆ tmp_in

RingBuffer<uint8_t> tmp_in {0}
protectedinherited

◆ tmp_out

RingBuffer<uint8_t> tmp_out {0}
protectedinherited

◆ write_buffer_size

int write_buffer_size = MAX_SINGLE_CHARS
protectedinherited

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