mirror of
https://github.com/meshtastic/firmware.git
synced 2025-10-03 13:55:45 +00:00

Some checks failed
CI / setup (check) (push) Has been cancelled
CI / setup (esp32) (push) Has been cancelled
CI / setup (esp32c3) (push) Has been cancelled
CI / setup (esp32c6) (push) Has been cancelled
CI / setup (esp32s3) (push) Has been cancelled
CI / setup (nrf52840) (push) Has been cancelled
CI / setup (rp2040) (push) Has been cancelled
CI / setup (rp2350) (push) Has been cancelled
CI / setup (stm32) (push) Has been cancelled
CI / version (push) Has been cancelled
CI / build-debian-src (push) Has been cancelled
CI / package-pio-deps-native-tft (push) Has been cancelled
CI / test-native (push) Has been cancelled
CI / docker-deb-amd64 (push) Has been cancelled
CI / docker-deb-amd64-tft (push) Has been cancelled
CI / docker-alp-amd64 (push) Has been cancelled
CI / docker-alp-amd64-tft (push) Has been cancelled
CI / docker-deb-arm64 (push) Has been cancelled
CI / docker-deb-armv7 (push) Has been cancelled
CI / check (push) Has been cancelled
CI / build-esp32 (push) Has been cancelled
CI / build-esp32s3 (push) Has been cancelled
CI / build-esp32c3 (push) Has been cancelled
CI / build-esp32c6 (push) Has been cancelled
CI / build-nrf52840 (push) Has been cancelled
CI / build-rp2040 (push) Has been cancelled
CI / build-rp2350 (push) Has been cancelled
CI / build-stm32 (push) Has been cancelled
CI / gather-artifacts (esp32) (push) Has been cancelled
CI / gather-artifacts (esp32c3) (push) Has been cancelled
CI / gather-artifacts (esp32c6) (push) Has been cancelled
CI / gather-artifacts (esp32s3) (push) Has been cancelled
CI / gather-artifacts (nrf52840) (push) Has been cancelled
CI / gather-artifacts (rp2040) (push) Has been cancelled
CI / gather-artifacts (rp2350) (push) Has been cancelled
CI / gather-artifacts (stm32) (push) Has been cancelled
CI / release-artifacts (push) Has been cancelled
CI / release-firmware (esp32) (push) Has been cancelled
CI / release-firmware (esp32c3) (push) Has been cancelled
CI / release-firmware (esp32c6) (push) Has been cancelled
CI / release-firmware (esp32s3) (push) Has been cancelled
CI / release-firmware (nrf52840) (push) Has been cancelled
CI / release-firmware (rp2040) (push) Has been cancelled
CI / release-firmware (rp2350) (push) Has been cancelled
CI / release-firmware (stm32) (push) Has been cancelled
CI / publish-firmware (push) Has been cancelled
91 lines
2.1 KiB
C++
91 lines
2.1 KiB
C++
#pragma once
|
|
#include "PowerFSM.h"
|
|
#include "concurrency/OSThread.h"
|
|
#include "configuration.h"
|
|
#include "main.h"
|
|
#include "sleep.h"
|
|
|
|
#ifdef HAS_I2S
|
|
#include <AudioFileSourcePROGMEM.h>
|
|
#include <AudioGeneratorRTTTL.h>
|
|
#include <AudioOutputI2S.h>
|
|
#include <ESP8266SAM.h>
|
|
|
|
#define AUDIO_THREAD_INTERVAL_MS 100
|
|
|
|
class AudioThread : public concurrency::OSThread
|
|
{
|
|
public:
|
|
AudioThread() : OSThread("Audio") { initOutput(); }
|
|
|
|
void beginRttl(const void *data, uint32_t len)
|
|
{
|
|
setCPUFast(true);
|
|
rtttlFile = new AudioFileSourcePROGMEM(data, len);
|
|
i2sRtttl = new AudioGeneratorRTTTL();
|
|
i2sRtttl->begin(rtttlFile, audioOut);
|
|
}
|
|
|
|
// Also handles actually playing the RTTTL, needs to be called in loop
|
|
bool isPlaying()
|
|
{
|
|
if (i2sRtttl != nullptr) {
|
|
return i2sRtttl->isRunning() && i2sRtttl->loop();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void stop()
|
|
{
|
|
if (i2sRtttl != nullptr) {
|
|
i2sRtttl->stop();
|
|
delete i2sRtttl;
|
|
i2sRtttl = nullptr;
|
|
}
|
|
delete rtttlFile;
|
|
rtttlFile = nullptr;
|
|
|
|
setCPUFast(false);
|
|
}
|
|
|
|
void readAloud(const char *text)
|
|
{
|
|
if (i2sRtttl != nullptr) {
|
|
i2sRtttl->stop();
|
|
delete i2sRtttl;
|
|
i2sRtttl = nullptr;
|
|
}
|
|
|
|
ESP8266SAM *sam = new ESP8266SAM;
|
|
sam->Say(audioOut, text);
|
|
delete sam;
|
|
setCPUFast(false);
|
|
}
|
|
|
|
protected:
|
|
int32_t runOnce() override
|
|
{
|
|
canSleep = true; // Assume we should not keep the board awake
|
|
|
|
// if (i2sRtttl != nullptr && i2sRtttl->isRunning()) {
|
|
// i2sRtttl->loop();
|
|
// }
|
|
return AUDIO_THREAD_INTERVAL_MS;
|
|
}
|
|
|
|
private:
|
|
void initOutput()
|
|
{
|
|
audioOut = new AudioOutputI2S(1, AudioOutputI2S::EXTERNAL_I2S);
|
|
audioOut->SetPinout(DAC_I2S_BCK, DAC_I2S_WS, DAC_I2S_DOUT, DAC_I2S_MCLK);
|
|
audioOut->SetGain(0.2);
|
|
};
|
|
|
|
AudioGeneratorRTTTL *i2sRtttl = nullptr;
|
|
AudioOutputI2S *audioOut;
|
|
|
|
AudioFileSourcePROGMEM *rtttlFile;
|
|
};
|
|
|
|
#endif
|