arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
PWMAudioMBED.h
1
2#pragma once
3#if defined(ARDUINO_ARCH_MBED)
4#include "AudioTools/CoreAudio/AudioPWM/PWMAudioBase.h"
5#include "AudioTools/CoreAudio/AudioTimer/AudioTimer.h"
6#include "mbed.h"
7
8namespace audio_tools {
9
10// forward declaration
11class PWMDriverMBED;
16using PWMDriver = PWMDriverMBED;
17
26 public:
27 PWMDriverMBED() = default;
28
29 // Ends the output
30 virtual void end() override {
31 TRACED();
32 ticker.end(); // it does not hurt to call this even if it has not been
33 // started
34 is_timer_started = false;
35
36 // stop and release pins
37 for (int j = 0; j < audio_config.channels; j++) {
38 if (pins[j] != nullptr) {
39 pins[j]->suspend();
40 delete pins[j];
41 pins[j] = nullptr;
42 }
43 }
44 pins.clear();
45 // pins.shrink_to_fit();
46 deleteBuffer();
47 }
48
49 protected:
51 TimerAlarmRepeating ticker; // calls a callback repeatedly with a timeout
52
55 virtual void startTimer() override {
56 if (!is_timer_started) {
57 TRACED();
58 long wait_time = 1000000l / audio_config.sample_rate;
59 ticker.setCallbackParameter(this);
60 ticker.begin(defaultPWMAudioOutputCallback, wait_time, US);
61 is_timer_started = true;
62 }
63 }
64
66 virtual void setupPWM() {
67 TRACED();
68 if (audio_config.pwm_frequency == 0){
69 audio_config.pwm_frequency = PWM_AUDIO_FREQUENCY;
70 }
71
72 unsigned long period =
73 1000000l / audio_config.pwm_frequency; // -> 30.517578125 microseconds
74 pins.resize(audio_config.channels);
75 for (int j = 0; j < audio_config.channels; j++) {
76 LOGD("Processing channel %d", j);
77 auto gpio = audio_config.pins()[j];
78 mbed::PwmOut* pin = new mbed::PwmOut(digitalPinToPinName(gpio));
79 LOGI("PWM Pin: %d", gpio);
80 pin->period_us(period);
81 pin->write(0.0f); // 0% duty cycle ->
82 pin->resume(); // in case it was suspended before
83 pins[j] = pin;
84 }
85 }
86
88 virtual void setupTimer() {}
89
91 virtual int maxChannels() { return 16; };
92
94 virtual int maxOutputValue() { return 1000; }
95
98 virtual void pwmWrite(int channel, int value) {
99 float float_value = static_cast<float>(value) / maxOutputValue();
100 pins[channel]->write(float_value); // pwm the value is between 0.0 and 1.0
101 }
102
104 static void defaultPWMAudioOutputCallback(void* obj) {
105 PWMDriverMBED* accessAudioPWM = (PWMDriverMBED*)obj;
106 if (accessAudioPWM != nullptr) {
107 accessAudioPWM->playNextFrame();
108 }
109 }
110};
111
112} // namespace audio_tools
113
114#endif
Base Class for all PWM drivers.
Definition PWMAudioBase.h:110
void playNextFrame()
writes the next frame to the output pins
Definition PWMAudioBase.h:270
Audio output to PWM pins for MBED based Arduino implementations.
Definition PWMAudioMBED.h:25
virtual void startTimer() override
Definition PWMAudioMBED.h:55
virtual int maxChannels()
Maximum supported channels.
Definition PWMAudioMBED.h:91
virtual void setupPWM()
Setup PWM Pins.
Definition PWMAudioMBED.h:66
virtual int maxOutputValue()
provides the max value for the configured resulution
Definition PWMAudioMBED.h:94
virtual void pwmWrite(int channel, int value)
Definition PWMAudioMBED.h:98
virtual void setupTimer()
not used -> see startTimer();
Definition PWMAudioMBED.h:88
static void defaultPWMAudioOutputCallback(void *obj)
timer callback: write the next frame to the pins
Definition PWMAudioMBED.h:104
Common Interface definition for TimerAlarmRepeating.
Definition AudioTimer.h:25
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
void defaultPWMAudioOutputCallback()
Definition PWMAudioAVR.h:132
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
uint32_t pwm_frequency
additinal info which might not be used by all processors
Definition PWMAudioBase.h:46