19template <
class T =
int16_t>
23 this->m_frequency = frequency;
24 if (frequency == 0.0f) this->m_cycles = 0.0f;
28 if (this->m_frequency == 0.0f)
return 0;
29 float value = this->m_amplitude * sinf(2.0f * (
float)M_PI * this->m_cycles);
30 this->m_cycles += this->m_frequency * this->m_deltaTime;
31 this->m_cycles -= floorf(this->m_cycles);
32 return (T)lroundf(value);
52 bool begin(audio_tools::AudioInfo info,
float volume) {
54 audio_tools::AudioInfo gen_info = info;
55 gen_info.channels = 1;
57 LOGE(
"tone generator could not be started");
66 void tone(
float freq,
size_t nsamples) {
70 while (nsamples > 0) {
71 int frames = nsamples < (size_t)frames_per_buffer ? nsamples
74 for (
int j = 0; j < frames; j++) {
79 const uint8_t* data = (
const uint8_t*)
buffer;
80 size_t open = idx *
sizeof(int16_t);
82 size_t written =
p_print->write(data, open);
92 float mag = 32767.0f * volume + 0.5f;
93 if (volume > 1.0f) mag = 32767;
108 if (
gain == 32767)
return sample;
109 return (int16_t)((int32_t)sample *
gain / 32767);
130 if (sample > 1.0f) sample = 1.0f;
131 if (sample < -1.0f) sample = -1.0f;
132 int16_t value = lroundf(sample *
gain);
133 for (
int ch = 0; ch <
channels; ch++) {
145 const uint8_t* data = (
const uint8_t*)
buffer;
146 size_t open =
idx *
sizeof(int16_t);
148 size_t written =
p_print->write(data, open);
175 bool begin(
int bits_per_sample,
int channels,
int channel) {
176 if (!(bits_per_sample == 8 || bits_per_sample == 16 ||
177 bits_per_sample == 32)) {
178 LOGE(
"bits_per_sample must be 8, 16 or 32, not %d", bits_per_sample);
182 LOGE(
"invalid number of channels: %d", channels);
185 if (channel >= channels) {
186 LOGE(
"channel %d is not available (channels=%d)", channel, channels);
189 bits = bits_per_sample;
190 int bytes =
bits / 8;
202 void write(
const uint8_t* data,
size_t len, F on_sample) {
229 return (int8_t)ptr[0] / 128.0f;
232 memcpy(&v, ptr,
sizeof(v));
237 memcpy(&v, ptr,
sizeof(v));
238 return v / 2147483648.0f;
259 if (result < 0)
return result;
260 if (++
pos == (
size_t)
data.size()) {
262 }
else if (
pos >= 64 &&
pos * 2 >= (
size_t)
data.size()) {
277 audio_tools::Vector<uint8_t>
data;
294 tones.setGenerator(generator);
299 return tones.generator();
317 if (*
this)
tones.tone(0, nsamples);
322 if (*
this)
tones.tone(freq, nsamples);
331 const char*
mime()
override {
return "audio/pcm"; }
361 const char*
mime()
override {
return "audio/pcm"; }
372 vsnprintf(tmp,
sizeof(tmp), fmt, args);
FIFO for received data which grows when needed: e.g. one decoding step can produce more data than exp...
Definition ModemBase.h:249
int available()
Definition ModemBase.h:255
audio_tools::Vector< uint8_t > data
Definition ModemBase.h:277
void clear()
Definition ModemBase.h:271
int read()
Definition ModemBase.h:257
int peek()
Definition ModemBase.h:256
size_t write(uint8_t ch) override
Definition ModemBase.h:251
size_t pos
Definition ModemBase.h:278
Default sine generator of the encoders: like minimodem it keeps the phase continuous when the frequen...
Definition ModemBase.h:20
T readSample() override
Definition ModemBase.h:27
void setFrequency(float frequency) override
Definition ModemBase.h:22
Common API of the demodulators (FSKDecoder, MFSKDecoder): PCM audio data is written to the decoder an...
Definition ModemBase.h:344
bool is_quiet
Definition ModemBase.h:365
virtual bool isFinished()=0
true if the decoding was stopped (rx_one)
void setStatusOutput(Print &out)
Defines the output for the ### CARRIER / ### NOCARRIER messages.
Definition ModemBase.h:347
void setQuiet(bool quiet)
Suppresses the status messages.
Definition ModemBase.h:350
virtual bool isCarrier()=0
true while a carrier is detected
Print * p_status
Definition ModemBase.h:364
void status(const char *fmt,...)
Definition ModemBase.h:367
const char * mime() override
Definition ModemBase.h:361
virtual void flush()=0
Processes all buffered samples (e.g. at the end of the input).
Common API of the modulators (FSKEncoder, MFSKEncoder): the written data is converted to 16 bit PCM a...
Definition ModemBase.h:286
virtual bool writeIdle(size_t nsamples)
Sends an idle carrier: returns false if this is not supported.
Definition ModemBase.h:310
virtual float symbolRate()=0
Symbols (bits for FSK) per second.
const char * mime() override
Definition ModemBase.h:331
void setOutput(Print &out) override
Definition ModemBase.h:288
void writeSilence(size_t nsamples)
Writes the indicated number of samples of silence.
Definition ModemBase.h:316
virtual bool endTransmission(size_t silence_samples=0)=0
void writeTone(float freq, size_t nsamples)
Writes a tone for the indicated number of samples.
Definition ModemBase.h:321
void setGenerator(audio_tools::SoundGenerator< int16_t > &generator)
Definition ModemBase.h:293
ToneOutput tones
Definition ModemBase.h:334
void flush()
Ends the transmission.
Definition ModemBase.h:326
virtual bool isTransmitting()=0
true between the first character and endTransmission()
audio_tools::SoundGenerator< int16_t > & getGenerator()
Provides the active tone generator.
Definition ModemBase.h:298
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
Print * p_print
Definition ModemBase.h:157
int channels
Definition ModemBase.h:160
int16_t buffer[BUFFER_SIZE]
Definition ModemBase.h:158
int idx
Definition ModemBase.h:159
void flush()
Writes the buffered samples.
Definition ModemBase.h:140
static constexpr int BUFFER_SIZE
Definition ModemBase.h:156
void setOutput(Print &out)
Definition ModemBase.h:120
void begin(int channels, float volume)
Definition ModemBase.h:122
void write(float sample)
Writes a sample to all channels.
Definition ModemBase.h:129
int32_t gain
Definition ModemBase.h:161
Writes tones of a SoundGenerator as 16 bit PCM with the requested number of channels and volume to a ...
Definition ModemBase.h:41
void setGenerator(audio_tools::SoundGenerator< int16_t > &generator)
Definition ModemBase.h:45
audio_tools::SoundGenerator< int16_t > * p_generator
Definition ModemBase.h:102
void setOutput(Print &out)
Definition ModemBase.h:43
bool begin(audio_tools::AudioInfo info, float volume)
Starts the generator: volume is the amplitude (0.0 - 1.0).
Definition ModemBase.h:52
Print * p_print
Definition ModemBase.h:100
void tone(float freq, size_t nsamples)
Definition ModemBase.h:66
audio_tools::SoundGenerator< int16_t > & generator()
Definition ModemBase.h:49
static int32_t amplitude(float volume)
minimodem's conversion of the volume to a 16 bit amplitude
Definition ModemBase.h:91
int16_t scale(int16_t sample)
Definition ModemBase.h:107
int32_t gain
Definition ModemBase.h:103
static constexpr int BUFFER_FRAMES
Definition ModemBase.h:99
FSKToneGenerator< int16_t > default_generator
Definition ModemBase.h:101
int16_t buffer[BUFFER_FRAMES *2]
Definition ModemBase.h:105
int channels
Definition ModemBase.h:104
TinyModem: software audio modems and packets with error correction.
Definition AX25.h:11