29const DTMFGenerator::DTMFTone DTMFGenerator::tones_[] = {{
'0', 941, 1336},
51 , sampleRate_(sampleRate)
52 , tone_(
"", sampleRate, sampleFormat)
58 toneBuffers_[
i] = fillToneBuffer(
i);
69 if (code >=
'0' and code <=
'9')
70 state.sample = toneBuffers_[code -
'0'].get();
71 else if (code >=
'A' and code <=
'D')
72 state.sample = toneBuffers_[code -
'A' + 10].get();
76 state.sample = toneBuffers_[
NUM_TONES - 2].get();
80 state.sample = toneBuffers_[
NUM_TONES - 1].get();
90 state.offset =
frame->nb_samples % sampleRate_;
98 if (state.sample == 0)
102 state.offset = (state.offset +
frame->nb_samples) % sampleRate_;
107DTMFGenerator::fillToneBuffer(
int index)
111 ptr->nb_samples = sampleRate_;
113 ptr->sample_rate = sampleRate_;
117 tone_.
genSin(
ptr.get(), 0,
ptr->nb_samples, tones_[index].higher, tones_[index].lower);
AudioFormat getFormat() const
void getNextSamples(AVFrame *frame)
DTMFGenerator(unsigned int sampleRate, AVSampleFormat sampleFormat)
DTMF Generator contains frequency of each keys and can build one DTMF.
void getSamples(AVFrame *frame, unsigned char code)
static void genSin(AVFrame *buffer, size_t outPos, unsigned nb_samples, unsigned frequency1, unsigned frequency2)
Add a simple or double sin to the buffer, it double the sin in stereo.
void emitSignal(Args... args)
std::unique_ptr< AVFrame, AVFrame_deleter > FrameBuffer