arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
PWMAudioRenesas.h
1#pragma once
2#if defined(ARDUINO_ARCH_RENESAS)
3#include "AudioTools/CoreAudio/AudioPWM/PWMAudioBase.h"
4#include "AudioTools/CoreAudio/AudioTimer/AudioTimer.h"
5#include "pwm.h"
6
7namespace audio_tools {
8
9// forward declaration
10class PWMDriverRenesas;
15using PWMDriver = PWMDriverRenesas;
16
25 public:
26 PWMDriverRenesas() { LOGD("PWMDriverRenesas"); }
27
28 virtual PWMConfig defaultConfig() {
29 PWMConfig cfg;
30 Pins pwm_pins;
31 // add default pins
32 for (int j = 2; j < 13; j += 2) pwm_pins.push_back(j);
33 cfg.setPins(pwm_pins);
34 return cfg;
35 }
36
37 // Ends the output
38 virtual void end() override {
39 TRACED();
40 ticker.end(); // it does not hurt to call this even if it has not been
41 // started
42 is_timer_started = false;
43
44 // stop and release pins
45 for (int j = 0; j < audio_config.channels; j++) {
46 if (pins[j] != nullptr) {
47 pins[j]->suspend();
48 pins[j]->end();
49 delete pins[j];
50 pins[j] = nullptr;
51 }
52 }
53 pins.clear();
54 // pins.shrink_to_fit();
55 deleteBuffer();
56 }
57
58 protected:
59 Vector<PwmOut*> pins;
60 TimerAlarmRepeating ticker; // calls a callback repeatedly with a timeout
61
64 virtual void startTimer() override {
65 TRACED();
66 if (!is_timer_started) {
67 TRACED();
68 ticker.setCallbackParameter(this);
69 int sample_rate = effectiveOutputSampleRate();
70 if (isDecimateActive()) {
71 LOGI("Using reduced sample rate: %d", effectiveOutputSampleRate());
72 }
73 ticker.begin(defaultPWMAudioOutputCallback, sample_rate, HZ);
74 is_timer_started = true;
75 }
76 }
77
79 virtual void setupPWM() {
80 TRACED();
81 if (audio_config.pwm_frequency == 0){
82 audio_config.pwm_frequency = PWM_AUDIO_FREQUENCY;
83 }
84
85 pins.resize(audio_config.channels);
86 for (int j = 0; j < audio_config.channels; j++) {
87 LOGD("Processing channel %d", j);
88 auto gpio = audio_config.pins()[j];
89 PwmOut* pin = new PwmOut(gpio);
90 LOGI("PWM Pin: %d", gpio);
91 pin->begin(20000.0f, 0.0f); // 50: 20000hz at 0%
92 pins[j] = pin;
93 }
94 }
95
97 virtual void setupTimer() {}
98
99 virtual int maxChannels() { return PIN_PWM_COUNT; };
100
102 virtual int maxOutputValue() {
103 return 100; // percent
104 }
105
108 virtual void pwmWrite(int channel, int value) {
109 pins[channel]->pulse_perc(value);
110 }
111
113 static void defaultPWMAudioOutputCallback(void* obj) {
114 PWMDriverRenesas* accessAudioPWM = (PWMDriverRenesas*)obj;
115 if (accessAudioPWM != nullptr) {
116 accessAudioPWM->playNextFrame();
117 }
118 }
119
120 int maxSampleRate() override { return audio_config.max_sample_rate; }
121
122 int decimation() override {
123 for (int j = 1; j < 5; j++) {
124 if (j % 2 == 0 && audio_config.sample_rate / j <= maxSampleRate()) {
125 return j;
126 }
127 }
128 return 5;
129 }
130};
131
132} // namespace audio_tools
133
134#endif
Base Class for all PWM drivers.
Definition PWMAudioBase.h:110
virtual int effectiveOutputSampleRate()
Provides the effective sample rate.
Definition PWMAudioBase.h:242
void playNextFrame()
writes the next frame to the output pins
Definition PWMAudioBase.h:270
virtual bool isDecimateActive()
Definition PWMAudioBase.h:335
Audio output to PWM pins for Renesas based Arduino implementations.
Definition PWMAudioRenesas.h:24
virtual void startTimer() override
Definition PWMAudioRenesas.h:64
int maxSampleRate() override
Provides the max working sample rate.
Definition PWMAudioRenesas.h:120
virtual void setupPWM()
Setup PWM Pins.
Definition PWMAudioRenesas.h:79
virtual int maxOutputValue()
provides the max value for the configured resulution
Definition PWMAudioRenesas.h:102
virtual void pwmWrite(int channel, int value)
Definition PWMAudioRenesas.h:108
int decimation() override
Decimation factor to reduce the sample rate.
Definition PWMAudioRenesas.h:122
virtual void setupTimer()
not used -> see startTimer();
Definition PWMAudioRenesas.h:97
static void defaultPWMAudioOutputCallback(void *obj)
timer callback: write the next frame to the pins
Definition PWMAudioRenesas.h:113
Common Interface definition for TimerAlarmRepeating.
Definition AudioTimer.h:25
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
Configuration data for PWM audio output.
Definition PWMAudioBase.h:32
uint32_t pwm_frequency
additinal info which might not be used by all processors
Definition PWMAudioBase.h:46
uint32_t max_sample_rate
max sample sample rate that still produces good audio
Definition PWMAudioBase.h:53