1/*
2 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_VOICE_ENGINE_DTMF_INBAND_H_
12#define WEBRTC_VOICE_ENGINE_DTMF_INBAND_H_
13
14#include "webrtc/typedefs.h"
15#include "webrtc/voice_engine/voice_engine_defines.h"
16
17namespace webrtc {
18class CriticalSectionWrapper;
19
20class DtmfInband
21{
22public:
23    DtmfInband(int32_t id);
24
25    virtual ~DtmfInband();
26
27    void Init();
28
29    int SetSampleRate(uint16_t frequency);
30
31    int GetSampleRate(uint16_t& frequency);
32
33    int AddTone(uint8_t eventCode,
34                int32_t lengthMs,
35                int32_t attenuationDb);
36
37    int ResetTone();
38    int StartTone(uint8_t eventCode, int32_t attenuationDb);
39
40    int StopTone();
41
42    bool IsAddingTone();
43
44    int Get10msTone(int16_t output[320], uint16_t& outputSizeInSamples);
45
46    uint32_t DelaySinceLastTone() const;
47
48    void UpdateDelaySinceLastTone();
49
50private:
51    void ReInit();
52    int16_t DtmfFix_generate(int16_t* decoded,
53                             int16_t value,
54                             int16_t volume,
55                             int16_t frameLen,
56                             int16_t fs);
57
58private:
59    enum {kDtmfFrameSizeMs = 10};
60    enum {kDtmfAmpHigh = 32768};
61    enum {kDtmfAmpLow  = 23171};	// 3 dB lower than the high frequency
62
63    int16_t DtmfFix_generateSignal(int16_t a1_times2,
64                                   int16_t a2_times2,
65                                   int16_t volume,
66                                   int16_t* signal,
67                                   int16_t length);
68
69private:
70    CriticalSectionWrapper& _critSect;
71    int32_t _id;
72    uint16_t _outputFrequencyHz;  // {8000, 16000, 32000}
73    int16_t _oldOutputLow[2];     // Data needed for oscillator model
74    int16_t _oldOutputHigh[2];    // Data needed for oscillator model
75    int16_t _frameLengthSamples;  // {80, 160, 320}
76    int32_t _remainingSamples;
77    int16_t _eventCode;           // [0, 15]
78    int16_t _attenuationDb;       // [0, 36]
79    int32_t _lengthMs;
80    bool _reinit;  // 'true' if the oscillator should be reinit for next event
81    bool _playing;
82    uint32_t _delaySinceLastToneMS; // time since last generated tone [ms]
83};
84
85}  // namespace webrtc
86
87#endif // #ifndef WEBRTC_VOICE_ENGINE_DTMF_INBAND_H_
88