arduino-audio-tools
Loading...
Searching...
No Matches
PWMAudioOutput.h
1#pragma once
2#include "AudioToolsConfig.h"
3#if defined(USE_PWM)
4
5#include "AudioTools/CoreAudio/AudioPWM/PWMDriverESP32.h"
6#include "AudioTools/CoreAudio/AudioPWM/PWMDriverMBED.h"
7#include "AudioTools/CoreAudio/AudioPWM/PWMDriverRP2040.h"
8#include "AudioTools/CoreAudio/AudioPWM/PWMDriverRenesas.h"
9#include "AudioTools/CoreAudio/AudioPWM/PWMDriverSTM32.h"
10// this is experimental at the moment
11#include "AudioTools/CoreAudio/AudioPWM/PWMDriverAVR.h"
12
13namespace audio_tools {
14
23 public:
24 // Default constructor with default driver
25 PWMAudioOutput() = default;
26
27 // Inject external driver (must live longer than this object)
28 PWMAudioOutput(DriverPWMBase &ext_driver)
29 : p_driver(&ext_driver) {}
30
32 if (p_driver && p_driver->isTimerStarted()) {
33 end();
34 }
35 }
36
37 virtual PWMConfig defaultConfig(RxTxMode mode=TX_MODE) {
38 if (mode!=TX_MODE) LOGE("mode not supported: using TX_MODE");
39 return p_driver->defaultConfig();
40 }
41
42 PWMConfig config() { return audio_config; }
43
45 void setAudioInfo(AudioInfo info) override {
46 TRACEI();
47 AudioOutput::cfg = info;
48 PWMConfig cfg = audio_config;
49 if (cfg.sample_rate != info.sample_rate || cfg.channels != info.channels ||
50 cfg.bits_per_sample != info.bits_per_sample) {
51 cfg.sample_rate = info.sample_rate;
53 cfg.channels = info.channels;
54 end();
55 begin(cfg);
56 cfg.logInfo();
57 }
58 }
59
61 AudioInfo result = audioInfo();
62 result.sample_rate = p_driver->effectiveOutputSampleRate();
63 return result;
64 }
65
67 bool begin(PWMConfig config) {
68 TRACED();
69 this->audio_config = config;
70 return begin();
71 }
72
73 bool begin() {
74 TRACED();
75 AudioOutput::setAudioInfo(audio_config);
76 return p_driver->begin(audio_config);
77 }
78
79 virtual void end() override { if (p_driver) p_driver->end(); }
80
81 int availableForWrite() override { return p_driver ? p_driver->availableForWrite() : 0; }
82
83 size_t write(const uint8_t *data, size_t len) override {
84 return p_driver ? p_driver->write(data, len) : 0; }
85
86 uint32_t underflowsPerSecond() { return p_driver ? p_driver->underflowsPerSecond() : 0; }
87 uint32_t framesPerSecond() { return p_driver ? p_driver->framesPerSecond() : 0; }
88
89 DriverPWMBase *driver() { return p_driver; }
90 void setBuffer(BaseBuffer<uint8_t> *buffer) { if (p_driver) p_driver->setBuffer(buffer); }
91
92 protected:
93 PWMConfig audio_config;
94 PWMDriver default_driver;
95 DriverPWMBase *p_driver = &default_driver;
96};
97
98
99} // namespace audio_tools
100
101#endif
Abstract Audio Ouptut class.
Definition AudioOutput.h:22
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioOutput.h:46
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioOutput.h:59
Base Class for all PWM drivers.
Definition PWMDriverBase.h:114
virtual int effectiveOutputSampleRate()
Provides the effective sample rate.
Definition PWMDriverBase.h:246
void setBuffer(BaseBuffer< uint8_t > *buffer)
Definition PWMDriverBase.h:243
Common functionality for PWM output. We generate audio using PWM with a frequency that is above the h...
Definition PWMAudioOutput.h:22
AudioInfo audioInfoOut() override
Definition PWMAudioOutput.h:60
bool begin(PWMConfig config)
starts the processing using Streams
Definition PWMAudioOutput.h:67
void setAudioInfo(AudioInfo info) override
updates the sample rate dynamically
Definition PWMAudioOutput.h:45
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition AudioTypes.h:28
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:53
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:55
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:57
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:59
Configuration data for PWM audio output.
Definition PWMDriverBase.h:32