/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_VOICE_ENGINE_DTMF_INBAND_H_
#define WEBRTC_VOICE_ENGINE_DTMF_INBAND_H_

#include "webrtc/typedefs.h"
#include "webrtc/voice_engine/voice_engine_defines.h"

namespace webrtc {
class CriticalSectionWrapper;

class DtmfInband
{
public:
    DtmfInband(int32_t id);

    virtual ~DtmfInband();

    void Init();

    int SetSampleRate(uint16_t frequency);

    int GetSampleRate(uint16_t& frequency);

    int AddTone(uint8_t eventCode,
                int32_t lengthMs,
                int32_t attenuationDb);

    int ResetTone();
    int StartTone(uint8_t eventCode, int32_t attenuationDb);

    int StopTone();

    bool IsAddingTone();

    int Get10msTone(int16_t output[320], uint16_t& outputSizeInSamples);

    uint32_t DelaySinceLastTone() const;

    void UpdateDelaySinceLastTone();

private:
    void ReInit();
    int16_t DtmfFix_generate(int16_t* decoded,
                             int16_t value,
                             int16_t volume,
                             int16_t frameLen,
                             int16_t fs);

private:
    enum {kDtmfFrameSizeMs = 10};
    enum {kDtmfAmpHigh = 32768};
    enum {kDtmfAmpLow  = 23171};	// 3 dB lower than the high frequency

    int16_t DtmfFix_generateSignal(int16_t a1_times2,
                                   int16_t a2_times2,
                                   int16_t volume,
                                   int16_t* signal,
                                   int16_t length);

private:
    CriticalSectionWrapper& _critSect;
    int32_t _id;
    uint16_t _outputFrequencyHz;  // {8000, 16000, 32000}
    int16_t _oldOutputLow[2];     // Data needed for oscillator model
    int16_t _oldOutputHigh[2];    // Data needed for oscillator model
    int16_t _frameLengthSamples;  // {80, 160, 320}
    int32_t _remainingSamples;
    int16_t _eventCode;           // [0, 15]
    int16_t _attenuationDb;       // [0, 36]
    int32_t _lengthMs;
    bool _reinit;  // 'true' if the oscillator should be reinit for next event
    bool _playing;
    uint32_t _delaySinceLastToneMS; // time since last generated tone [ms]
};

}  // namespace webrtc

#endif // #ifndef WEBRTC_VOICE_ENGINE_DTMF_INBAND_H_
