3#include "AudioToolsConfig.h"
4#include "AudioTools/AudioLibs/I2SCodecStream.h"
5#include "AudioTools/CoreAudio/AudioActions.h"
21 AudioBoardAction(AudioBoard &
board, AudioDriverKey key) {
23 this->p_board = &
board;
27 int id()
override {
return key | 0x400; }
28 bool readValue()
override {
return p_board->isKeyPressed(key); }
46 bool begin()
override {
return I2SCodecStream::begin(); }
64 void addAction(AudioDriverKey key,
void (*action)(
bool,
int,
void *),
65 void *ref =
nullptr) {
66 AudioBoardAction *abo =
new AudioBoardAction(
board(), key);
67 abo->actionOn = action;
68 abo->ref = (ref ==
nullptr) ?
this : ref;
75 void addAction(AudioDriverKey key,
void (*actionOn)(
bool,
int,
void *),
76 void (*actionOff)(
bool,
int,
void *),
77 void *ref =
nullptr) {
79 AudioBoardAction *abo =
new AudioBoardAction(
board(), key);
80 abo->actionOn = actionOn;
81 abo->actionOn = actionOff;
82 abo->ref = (ref ==
nullptr) ?
this : ref;
94 void addAction(
int pin,
void (*action)(
bool,
int,
void *),
95 void *ref =
nullptr) {
99 actions.
add(pin, action, activeLogic, ref ==
nullptr ?
this : ref);
111 void addAction(
int pin,
void (*action)(
bool,
int,
void *),
112 AudioActions::ActiveLogic activeLogic,
void *ref =
nullptr) {
114 actions.
add(pin, action, activeLogic, ref ==
nullptr ?
this : ref);
129 float new_volume = current_volume + inc;
130 LOGI(
"incrementVolume: %f -> %f", current_volume, new_volume);
161 self->active = !self->active;
182 self->active =
false;
196 if (self->headphoneIsConnected != isConnected) {
197 self->headphoneIsConnected = isConnected;
200 bool powerActive = !isConnected;
201 LOGW(
"Headphone jack has been %s",
202 isConnected ?
"inserted" :
"removed");
224 return getPinID(PinFunction::HEADPHONE_DETECT);
310 return headphoneGpioPin > 0 ? !
digitalRead(headphoneGpioPin) :
false;
322 int sd_cs = getSdCsPin();
324 if (input_mode != -1 && (input_mode != sd_cs || !cfg.sd_active)) {
325 LOGD(
"actionInputMode")
334 int sd_cs = getSdCsPin();
337 if ((vol_up != -1 && vol_down != -1) &&
338 (!cfg.sd_active || (vol_down != sd_cs && vol_up != sd_cs))) {
339 LOGD(
"actionVolumeDown")
341 LOGD(
"actionVolumeUp")
344 LOGW(
"Volume Buttons ignored because of conflict: %d ",
pinVolumeDown());
352 if (head_phone != -1 && (
getPinID(PinFunction::KEY, 6) != head_phone)) {
354 AudioActions::ActiveChange,
this);
371 action_increment_value = value;
374 float actionVolumeIncrementValue() {
return action_increment_value; }
376 bool isKeyPressed(
int key) {
377 if (!
board())
return false;
378 return board().isKeyPressed(key);
382 AudioActions actions;
383 bool headphoneIsConnected =
false;
385 float action_increment_value = 0.02;
388 static GpioPin sd_cs = -2;
390 if (sd_cs != -2)
return sd_cs;
392 auto sd_opt =
getPins().getSPIPins(PinFunction::SD);
394 sd_cs = sd_opt.value().cs;
397 LOGI(
"No sd defined -> sd_active=false")
398 cfg.sd_active = false;
406 auto opt =
board().getPins().getPin(pin);
407 PinLogic logic = PinLogic::Input;
408 if (opt) logic = opt.value().pin_logic;
410 case PinLogic::Input:
411 case PinLogic::InputActiveLow:
412 return AudioActions::ActiveLow;
413 case PinLogic::InputActiveHigh:
414 return AudioActions::ActiveHigh;
415 case PinLogic::InputActiveTouch:
416 return AudioActions::ActiveTouch;
418 return AudioActions::ActiveLow;