arduino-audio-tools
Loading...
Searching...
No Matches
AudioBoardStream.h
Go to the documentation of this file.
1#pragma once
2
3#include "AudioToolsConfig.h"
6
8void* p_lastAudioBoardStream = nullptr;
9
10
11namespace audio_tools {
12
24
25 struct AudioBoardAction : public AudioActions::Action {
26 AudioBoardAction(AudioBoard &board, AudioDriverKey key) {
27 this->key = key;
28 this->p_board = &board;
29 }
31 AudioBoard *p_board;
32 int id() override { return (int) key | 0x400; }
33 bool readValue() override { return p_board->isKeyPressed((int)key); }
34 };
35
36 public:
44 AudioBoardStream(audio_driver::AudioBoard &board) : I2SCodecStream(board) {
45 // pin mode already set up by driver library
46 actions.setPinMode(false);
47 // use the AudioBoard
50 }
51
52 bool begin() override { return I2SCodecStream::begin(); }
53
54 bool begin(I2SCodecConfig cfg) override { return I2SCodecStream::begin(cfg); }
55
61 // TRACED();
63 delay(1);
64 }
65
69 void addAction(AudioDriverKey key, void (*action)(bool, digital_pin_t, void *),
70 void *ref = nullptr) {
71 AudioBoardAction *abo = new AudioBoardAction(board(), key);
72 if (abo == nullptr) {
73 LOGE("Failed to allocate AudioBoardAction");
74 return;
75 }
76 abo->actionOn = action;
77 abo->ref = (ref == nullptr) ? this : ref;
78 actions.add(*abo);
79 }
80
84 void addAction(AudioDriverKey key, void (*actionOn)(bool, digital_pin_t, void *),
85 void (*actionOff)(bool, digital_pin_t, void *),
86 void *ref = nullptr) {
87
88 AudioBoardAction *abo = new AudioBoardAction(board(), key);
89 if (abo == nullptr) {
90 LOGE("Failed to allocate AudioBoardAction");
91 return;
92 }
93 abo->actionOn = actionOn;
94 abo->actionOff = actionOff;
95 abo->ref = (ref == nullptr) ? this : ref;
96 actions.add(*abo);
97 }
98
107 void addAction(digital_pin_t pin, void (*action)(bool, digital_pin_t, void *),
108 void *ref = nullptr) {
109 TRACEI();
110 // determine logic from config
111 AudioActions::ActiveLogic activeLogic = getActionLogic(pin);
112 actions.add(pin, action, activeLogic, ref == nullptr ? this : ref);
113 }
114
124 void addAction(digital_pin_t pin, void (*action)(bool, digital_pin_t, void *),
125 AudioActions::ActiveLogic activeLogic, void *ref = nullptr) {
126 TRACEI();
127 actions.add(pin, action, activeLogic, ref == nullptr ? this : ref);
128 }
129
132
134
140 void incrementVolume(float inc) {
141 float current_volume = getVolume();
142 float new_volume = current_volume + inc;
143 LOGI("incrementVolume: %f -> %f", current_volume, new_volume);
145 }
146
151 static void actionVolumeUp(bool, digital_pin_t, void *ref) {
152 TRACEI();
153 AudioBoardStream *self = (AudioBoardStream *)ref;
154 if (self == nullptr) self = (AudioBoardStream *)p_lastAudioBoardStream;
156 }
157
162 static void actionVolumeDown(bool, digital_pin_t, void *ref) {
163 TRACEI();
164 AudioBoardStream *self = (AudioBoardStream *)ref;
165 if (self == nullptr) self = (AudioBoardStream *)p_lastAudioBoardStream;
167 }
168
173 static void actionStartStop(bool, digital_pin_t, void *ref) {
174 TRACEI();
175 AudioBoardStream *self = (AudioBoardStream *)ref;
176 if (self == nullptr) self = (AudioBoardStream *)p_lastAudioBoardStream;
177 self->active = !self->active;
178 self->setActive(self->active);
179 }
180
185 static void actionStart(bool, digital_pin_t, void *ref) {
186 TRACEI();
187 AudioBoardStream *self = (AudioBoardStream *)ref;
188 if (self == nullptr) self = (AudioBoardStream *)p_lastAudioBoardStream;
189 self->active = true;
190 self->setActive(self->active);
191 }
192
196 static void actionStop(bool, digital_pin_t, void *ref) {
197 TRACEI();
198 AudioBoardStream *self = (AudioBoardStream *)ref;
199 if (self == nullptr) self = (AudioBoardStream *)p_lastAudioBoardStream;
200 self->active = false;
201 self->setActive(self->active);
202 }
203
209 static void actionHeadphoneDetection(bool, digital_pin_t, void *ref) {
210 AudioBoardStream *self = (AudioBoardStream *)ref;
211 if (self == nullptr) self = (AudioBoardStream *)p_lastAudioBoardStream;
212 if (self->pinHeadphoneDetect() != GPIO_NONE) {
213 // detect changes
214 bool isConnected = self->headphoneStatus();
215 if (self->headphoneIsConnected != isConnected) {
216 self->headphoneIsConnected = isConnected;
217
218 // update if things have stabilized
219 bool powerActive = !isConnected;
220 LOGW("Headphone jack has been %s",
221 isConnected ? "inserted" : "removed");
223 }
224 }
225 delay(1);
226 }
227
234 digital_pin_t pinAuxin() { return getPinID(PinFunction::AUXIN_DETECT); }
235
243 return getPinID(PinFunction::HEADPHONE_DETECT);
244 }
245
252 digital_pin_t pinPaEnable() { return getPinID(PinFunction::PA); }
253
254 // /**
255 // * @brief Get the gpio number for adc detection
256 // *
257 // * @return -1 non-existent
258 // * Others gpio number
259 // */
260 // digital_pin_t pinAdcDetect() { return getPin(AUXIN_DETECT); }
261
268 digital_pin_t pinInputRec() { return getPinID(PinFunction::KEY, 1); }
269
276 digital_pin_t pinInputMode() { return getPinID(PinFunction::KEY, 2); }
277
284 digital_pin_t pinInputSet() { return getPinID(PinFunction::KEY, 4); }
285
292 digital_pin_t pinInputPlay() { return getPinID(PinFunction::KEY, 3); }
293
300 digital_pin_t pinVolumeUp() { return getPinID(PinFunction::KEY, 6); }
301
308 digital_pin_t pinVolumeDown() { return getPinID(PinFunction::KEY, 5); }
309
316 digital_pin_t pinLed(int idx) { return getPinID(PinFunction::LED, idx); }
317
320
331
335 void setActive(bool active) { setMute(!active); }
336
339 // pin conflicts for pinInputMode() with the SD CS pin for AIThinker and
340 // buttons
343 if (input_mode != GPIO_NONE && (input_mode != sd_cs || !cfg.sd_active)) {
344 LOGD("actionInputMode")
346 }
347 }
348
351 // pin conflicts with SD Lyrat SD CS digital_pin_t and buttons / Conflict on
352 // Audiokit V. 2957
356 if ((vol_up != GPIO_NONE && vol_down != GPIO_NONE) &&
357 (!cfg.sd_active || (vol_down != sd_cs && vol_up != sd_cs))) {
358 LOGD("actionVolumeDown")
360 LOGD("actionVolumeUp")
362 } else {
363 LOGW("Volume Buttons ignored because of conflict");
364 }
365 }
366
369 // pin conflicts with AIThinker A101: key6 and headphone detection
371 if (head_phone != GPIO_NONE && (getPinID(PinFunction::KEY, 6) != head_phone)) {
374 }
375 }
376
387
391 }
392
394
395 bool isKeyPressed(int key) {
396 if (!board()) return false;
397 return board().isKeyPressed(key);
398 }
399
402
403 protected:
404 static bool readPinCB(digital_pin_t pin, void* ref) {
405 return static_cast<AudioBoardStream*>(ref)->digitalRead(pin);
406 }
407
410 bool active = true;
412
415 // execute only once
416 if (sd_cs != GPIO_NONE) return sd_cs;
417
418 auto sd_opt = getPins().getSPIPins(PinFunction::SD);
419 if (sd_opt) {
420 sd_cs = sd_opt.value().cs;
421 } else {
422 // no spi -> no sd
423 LOGI("No sd defined -> sd_active=false")
424 cfg.sd_active = false;
426 }
427 return sd_cs;
428 }
429
432 auto opt = board().getPins().getPin(pin);
433 PinLogic logic = PinLogic::Input;
434 if (opt) logic = opt.value().pin_logic;
435 switch (logic) {
436 case PinLogic::Input:
437 case PinLogic::InputActiveLow:
439 case PinLogic::InputActiveHigh:
441 case PinLogic::InputActiveTouch:
443 default:
445 }
446 }
447};
448
449} // namespace audio_tools
void * p_lastAudioBoardStream
global reference to access from static callback methods
Definition AudioBoardStream.h:8
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
A simple class to assign functions to gpio pins e.g. to implement a simple navigation control or volu...
Definition AudioActions.h:29
ActiveLogic
Defines the logic for the action execution.
Definition AudioActions.h:32
@ ActiveTouch
Definition AudioActions.h:36
@ ActiveLow
Definition AudioActions.h:33
@ ActiveHigh
Definition AudioActions.h:34
@ ActiveChange
Definition AudioActions.h:35
void processActions()
Execute all actions if the corresponding pin is low. To minimize the runtime: With each call we proce...
Definition AudioActions.h:196
void add(Action &action)
Adds an Action.
Definition AudioActions.h:139
void setReadCallback(bool(*read_cb_par)(digital_pin_t, void *), void *ref=nullptr)
Sets a callback function to read the pin state.
Definition AudioActions.h:276
void setUsePinInterrupt(bool active)
Use interrupts instead of processActions() call in loop.
Definition AudioActions.h:258
void setPinMode(bool active)
setup pin mode when true
Definition AudioActions.h:266
New functionality which replaces the AudioKitStream that is based on the legacy AudioKit library....
Definition AudioBoardStream.h:23
bool active
Definition AudioBoardStream.h:410
digital_pin_t pinHeadphoneDetect()
Get the gpio number for headphone detection.
Definition AudioBoardStream.h:242
void addAction(AudioDriverKey key, void(*actionOn)(bool, digital_pin_t, void *), void(*actionOff)(bool, digital_pin_t, void *), void *ref=nullptr)
Defines a new action that is executed when the Button is pressed and released.
Definition AudioBoardStream.h:84
static void actionVolumeUp(bool, digital_pin_t, void *ref)
Increase the volume.
Definition AudioBoardStream.h:151
void setSpeakerActive(bool active)
the same as setPAPower()
Definition AudioBoardStream.h:319
digital_pin_t pinVolumeUp()
number for volume up function
Definition AudioBoardStream.h:300
static void actionStop(bool, digital_pin_t, void *ref)
Stop.
Definition AudioBoardStream.h:196
digital_pin_t pinInputSet()
Get number for set function.
Definition AudioBoardStream.h:284
digital_pin_t pinLed(int idx)
Get LED pin.
Definition AudioBoardStream.h:316
digital_pin_t pinInputPlay()
Get number for play function.
Definition AudioBoardStream.h:292
float action_increment_value
Definition AudioBoardStream.h:411
AudioActions & audioActions()
Provides access to the AudioActions.
Definition AudioBoardStream.h:131
bool begin(I2SCodecConfig cfg) override
Starts the I2S interface.
Definition AudioBoardStream.h:54
bool isKeyPressed(int key)
Definition AudioBoardStream.h:395
static void actionStart(bool, digital_pin_t, void *ref)
Start.
Definition AudioBoardStream.h:185
void addHeadphoneDetectionAction()
Adds headphone determination.
Definition AudioBoardStream.h:368
void processActions()
Process input keys and pins.
Definition AudioBoardStream.h:60
void setActionVolumeIncrementValue(float value)
Defines the increment value used by actionVolumeDown/actionVolumeUp.
Definition AudioBoardStream.h:389
static void actionHeadphoneDetection(bool, digital_pin_t, void *ref)
Switch off the PA if the headphone in plugged in and switch it on again if the headphone is unplugged...
Definition AudioBoardStream.h:209
void addDefaultActions()
Setup the supported default actions (volume, start/stop, headphone detection)
Definition AudioBoardStream.h:381
void addAction(digital_pin_t pin, void(*action)(bool, digital_pin_t, void *), void *ref=nullptr)
Defines a new action that is executed when the indicated pin is active.
Definition AudioBoardStream.h:107
bool headphoneIsConnected
Definition AudioBoardStream.h:409
void incrementVolume(float inc)
Relative volume control.
Definition AudioBoardStream.h:140
AudioBoardStream(audio_driver::AudioBoard &board)
Default constructor: for available AudioBoard values check the audioboard variables in https://pschat...
Definition AudioBoardStream.h:44
void setActive(bool active)
The oposite of setMute(): setActive(true) calls setMute(false)
Definition AudioBoardStream.h:335
digital_pin_t pinInputRec()
Get the record-button id for adc-button.
Definition AudioBoardStream.h:268
digital_pin_t pinAuxin()
Get the gpio number for auxin detection.
Definition AudioBoardStream.h:234
void addVolumeActions()
add volume up and volume down action
Definition AudioBoardStream.h:350
AudioActions actions
Definition AudioBoardStream.h:408
void addStartStopAction()
add start/stop on inputMode
Definition AudioBoardStream.h:338
digital_pin_t pinInputMode()
Get the number for mode-button.
Definition AudioBoardStream.h:276
static void actionStartStop(bool, digital_pin_t, void *ref)
Toggle start stop.
Definition AudioBoardStream.h:173
digital_pin_t pinVolumeDown()
Get number for volume down function.
Definition AudioBoardStream.h:308
static bool readPinCB(digital_pin_t pin, void *ref)
Definition AudioBoardStream.h:404
bool begin() override
Definition AudioBoardStream.h:52
digital_pin_t pinPaEnable()
Get the gpio number for PA enable.
Definition AudioBoardStream.h:252
void setUsePinInterrupt(bool active)
Defines if we use pin interrupts for audio actions (default: false)
Definition AudioBoardStream.h:401
bool headphoneStatus()
Returns true if the headphone was detected.
Definition AudioBoardStream.h:327
float actionVolumeIncrementValue()
Definition AudioBoardStream.h:393
digital_pin_t getSdCsPin()
Definition AudioBoardStream.h:413
static void actionVolumeDown(bool, digital_pin_t, void *ref)
Decrease the volume.
Definition AudioBoardStream.h:162
void addAction(AudioDriverKey key, void(*action)(bool, digital_pin_t, void *), void *ref=nullptr)
Defines a new action that is executed when the Button is pressed.
Definition AudioBoardStream.h:69
void addAction(digital_pin_t pin, void(*action)(bool, digital_pin_t, void *), AudioActions::ActiveLogic activeLogic, void *ref=nullptr)
Defines a new action that is executed when the indicated pin is active.
Definition AudioBoardStream.h:124
AudioActions & getActions()
Definition AudioBoardStream.h:133
AudioActions::ActiveLogic getActionLogic(digital_pin_t pin)
Determines the action logic (ActiveLow or ActiveTouch) for the pin.
Definition AudioBoardStream.h:431
I2S Stream which also sets up a codec chip and i2s.
Definition I2SCodecStream.h:55
I2SCodecConfig cfg
Definition I2SCodecStream.h:229
bool digitalRead(digital_pin_t pin)
get value of digital pin
Definition I2SCodecStream.h:223
digital_pin_t getPinID(PinFunction function)
Provides the gpio for the indicated function.
Definition I2SCodecStream.h:198
bool begin()
Definition I2SCodecStream.h:82
DriverDeviceInfo & getPins()
Provides access to the pin information.
Definition I2SCodecStream.h:212
AudioBoard & board()
Provides the board.
Definition I2SCodecStream.h:189
bool setMute(bool mute)
Mute / unmote.
Definition I2SCodecStream.h:166
float getVolume()
legacy: same as volume()
Definition I2SCodecStream.h:163
bool setPAPower(bool active)
Sets the output of the PA Power Pin.
Definition I2SCodecStream.h:177
bool setVolume(float vol) override
sets the volume (range 0.0f - 1.0f)
Definition I2SCodecStream.h:151
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
gpio_dt_spec digital_pin_t
Zephyr GPIO spec as digital_pin_t.
Definition Arduino.h:266
static gpio_dt_spec GPIO_NONE
GPIO_NONE is no pin defined.
Definition Arduino.h:269
void delay(uint32_t ms)
Definition Arduino.h:255
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:508
Action definition per pin.
Definition AudioActions.h:40
Configuration for I2SCodecStream.
Definition I2SCodecStream.h:33
bool sd_active
Definition I2SCodecStream.h:37