/*
 *  Copyright (c) 2012 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_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_AUDIO_H_
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_AUDIO_H_

#include "rtp_rtcp_config.h"          // misc. defines (e.g. MAX_PACKET_LENGTH)
#include "common_types.h"             // Transport
#include "typedefs.h"

#include "dtmf_queue.h"
#include "rtp_utility.h"

#include "rtp_sender.h"

namespace webrtc {
class RTPSenderAudio: public DTMFqueue
{
public:
    RTPSenderAudio(const WebRtc_Word32 id, RtpRtcpClock* clock,
                   RTPSenderInterface* rtpSender);
    virtual ~RTPSenderAudio();

    void ChangeUniqueId(const WebRtc_Word32 id);

    WebRtc_Word32 Init();

    WebRtc_Word32 RegisterAudioPayload(
        const char payloadName[RTP_PAYLOAD_NAME_SIZE],
        const WebRtc_Word8 payloadType,
        const WebRtc_UWord32 frequency,
        const WebRtc_UWord8 channels,
        const WebRtc_UWord32 rate,
        ModuleRTPUtility::Payload*& payload);

    WebRtc_Word32 SendAudio(const FrameType frameType,
                            const WebRtc_Word8 payloadType,
                            const WebRtc_UWord32 captureTimeStamp,
                            const WebRtc_UWord8* payloadData,
                            const WebRtc_UWord32 payloadSize,
                            const RTPFragmentationHeader* fragmentation);

    // set audio packet size, used to determine when it's time to send a DTMF packet in silence (CNG)
    WebRtc_Word32 SetAudioPacketSize(const WebRtc_UWord16 packetSizeSamples);

    // Set status and ID for header-extension-for-audio-level-indication.
    // Valid ID range is [1,14].
    WebRtc_Word32 SetAudioLevelIndicationStatus(const bool enable,
                                              const WebRtc_UWord8 ID);

    // Get status and ID for header-extension-for-audio-level-indication.
    WebRtc_Word32 AudioLevelIndicationStatus(bool& enable,
                                           WebRtc_UWord8& ID) const;

    // Store the audio level in dBov for header-extension-for-audio-level-indication.
    // Valid range is [0,100]. Actual value is negative.
    WebRtc_Word32 SetAudioLevel(const WebRtc_UWord8 level_dBov);

    // Send a DTMF tone using RFC 2833 (4733)
      WebRtc_Word32 SendTelephoneEvent(const WebRtc_UWord8 key,
                                   const WebRtc_UWord16 time_ms,
                                   const WebRtc_UWord8 level);

    bool SendTelephoneEventActive(WebRtc_Word8& telephoneEvent) const;

    void SetAudioFrequency(const WebRtc_UWord32 f);

    int AudioFrequency() const;

    // Set payload type for Redundant Audio Data RFC 2198
    WebRtc_Word32 SetRED(const WebRtc_Word8 payloadType);

    // Get payload type for Redundant Audio Data RFC 2198
    WebRtc_Word32 RED(WebRtc_Word8& payloadType) const;

    WebRtc_Word32 RegisterAudioCallback(RtpAudioFeedback* messagesCallback);

protected:
    WebRtc_Word32 SendTelephoneEventPacket(const bool ended,
                                         const WebRtc_UWord32 dtmfTimeStamp,
                                         const WebRtc_UWord16 duration,
                                         const bool markerBit); // set on first packet in talk burst

    bool MarkerBit(const FrameType frameType,
                   const WebRtc_Word8 payloadType);

private:
    WebRtc_Word32             _id;
    RtpRtcpClock&             _clock;
    RTPSenderInterface*     _rtpSender;
    CriticalSectionWrapper* _audioFeedbackCritsect;
    RtpAudioFeedback*   _audioFeedback;

    CriticalSectionWrapper*   _sendAudioCritsect;

    WebRtc_UWord32            _frequency;
    WebRtc_UWord16            _packetSizeSamples;

    // DTMF
    bool            _dtmfEventIsOn;
    bool            _dtmfEventFirstPacketSent;
    WebRtc_Word8      _dtmfPayloadType;
    WebRtc_UWord32    _dtmfTimestamp;
    WebRtc_UWord8     _dtmfKey;
    WebRtc_UWord32    _dtmfLengthSamples;
    WebRtc_UWord8     _dtmfLevel;
    WebRtc_UWord32    _dtmfTimeLastSent;
    WebRtc_UWord32    _dtmfTimestampLastSent;

    WebRtc_Word8      _REDPayloadType;

    // VAD detection, used for markerbit
    bool            _inbandVADactive;
    WebRtc_Word8      _cngNBPayloadType;
    WebRtc_Word8      _cngWBPayloadType;
    WebRtc_Word8      _cngSWBPayloadType;
    WebRtc_Word8      _lastPayloadType;

    // Audio level indication (https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/)
    bool            _includeAudioLevelIndication;
    WebRtc_UWord8     _audioLevelIndicationID;
    WebRtc_UWord8     _audioLevel_dBov;
};
} // namespace webrtc

#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_AUDIO_H_
