34 cfg.sample_rate = info.sample_rate;
35 cfg.channels = info.channels;
36 cfg.bits_per_sample = info.bits_per_sample;
42 using audio_tools::AudioEncoder::begin;
52 if (!
cfg.isValid())
return false;
53 if (
cfg.bits_per_sample != 16) {
54 LOGE(
"DTMFEncoder: bits_per_sample must be 16, not %d",
55 (
int)
cfg.bits_per_sample);
58 if (
cfg.channels < 1) {
59 LOGE(
"DTMFEncoder: invalid number of channels: %d", (
int)
cfg.channels);
75 size_t write(
const uint8_t* data,
size_t len)
override {
77 for (
size_t j = 0; j < len; j++) {
82 }
else if (data[j] ==
',') {
106 for (
size_t j = 0; j < silence_samples; j++)
samples.write(0.0f);
115 for (
size_t j = 0; j < nsamples; j++)
samples.write(0.0f);
125 return 1000.0f / (
cfg.tone_ms +
cfg.pause_ms);
141 size_t n = (size_t)
cfg.tone_ms *
cfg.sample_rate / 1000;
142 size_t ramp =
RAMP_MS *
cfg.sample_rate / 1000;
143 if (2 * ramp > n) ramp = n / 2;
146 for (
size_t j = 0; j < n; j++) {
148 if (j < ramp) gain *= 0.5f - 0.5f * cosf((
float)M_PI * j / ramp);
150 gain *= 0.5f - 0.5f * cosf((
float)M_PI * (n - j) / ramp);
151 samples.write(gain * (sinf(w1 * j) + sinf(w2 * j)));
157 size_t n = (size_t)ms *
cfg.sample_rate / 1000;
158 for (
size_t j = 0; j < n; j++)
samples.write(0.0f);
bool begin(DTMFConfig config)
Starts the processing with the indicated configuration.
Definition DTMFEncoder.h:45
DTMFConfig defaultConfig()
Provides a default configuration.
Definition DTMFEncoder.h:25
bool endTransmission(size_t silence_samples=0) override
Definition DTMFEncoder.h:104
bool transmitting
Definition DTMFEncoder.h:138
SampleOutput samples
Definition DTMFEncoder.h:136
DTMFEncoder(Print &out)
Definition DTMFEncoder.h:22
void silence(int ms)
Definition DTMFEncoder.h:156
void setAudioInfo(audio_tools::AudioInfo info) override
Defines the sample rate and number of channels of the generated audio.
Definition DTMFEncoder.h:33
bool is_active
Definition DTMFEncoder.h:137
DTMFConfig cfg
Definition DTMFEncoder.h:135
bool isTransmitting() override
true between the first key and endTransmission()
Definition DTMFEncoder.h:121
static constexpr float RAMP_MS
Definition DTMFEncoder.h:134
DTMFConfig & config()
The configuration which was provided in begin().
Definition DTMFEncoder.h:129
void end() override
Definition DTMFEncoder.h:69
bool writeKey(char key)
Definition DTMFEncoder.h:93
void setOutput(Print &out) override
Definition DTMFEncoder.h:27
size_t write(const uint8_t *data, size_t len) override
Sends the keys.
Definition DTMFEncoder.h:75
float symbolRate() override
Keys per second.
Definition DTMFEncoder.h:124
bool begin() override
Definition DTMFEncoder.h:50
bool writeIdle(size_t nsamples) override
Sends silence for the indicated number of samples.
Definition DTMFEncoder.h:113
void sendKey(int row, int column)
Definition DTMFEncoder.h:140
audio_tools::AudioInfo audioInfo() override
Definition DTMFEncoder.h:40
static const float * rows()
row frequencies in Hz
Definition DTMF.h:87
static const float * columns()
column frequencies in Hz
Definition DTMF.h:93
static bool find(char ch, int &row, int &column)
Definition DTMF.h:103
Common API of the modulators (FSKEncoder, MFSKEncoder): the written data is converted to 16 bit PCM a...
Definition ModemBase.h:286
void setOutput(Print &out) override
Definition ModemBase.h:288
ToneOutput tones
Definition ModemBase.h:334
Writes float samples (-1.0 to 1.0) as 16 bit PCM with the requested number of channels and volume to ...
Definition ModemBase.h:118
TinyModem: software audio modems and packets with error correction.
Definition AX25.h:11
Configuration of the DTMF (touch tone) modem (DTMFEncoder, DTMFDecoder): each of the characters 0-9,...
Definition DTMF.h:20