Home | History | Annotate | Download | only in neteq
      1 /*
      2  *  Copyright (c) 2012 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_MODULES_AUDIO_CODING_NETEQ_DTMF_BUFFER_H_
     12 #define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DTMF_BUFFER_H_
     13 
     14 #include <list>
     15 #include <string>  // size_t
     16 
     17 #include "webrtc/base/constructormagic.h"
     18 #include "webrtc/typedefs.h"
     19 
     20 namespace webrtc {
     21 
     22 struct DtmfEvent {
     23   uint32_t timestamp;
     24   int event_no;
     25   int volume;
     26   int duration;
     27   bool end_bit;
     28 
     29   // Constructors
     30   DtmfEvent()
     31       : timestamp(0),
     32         event_no(0),
     33         volume(0),
     34         duration(0),
     35         end_bit(false) {
     36   }
     37   DtmfEvent(uint32_t ts, int ev, int vol, int dur, bool end)
     38       : timestamp(ts),
     39         event_no(ev),
     40         volume(vol),
     41         duration(dur),
     42         end_bit(end) {
     43   }
     44 };
     45 
     46 // This is the buffer holding DTMF events while waiting for them to be played.
     47 class DtmfBuffer {
     48  public:
     49   enum BufferReturnCodes {
     50     kOK = 0,
     51     kInvalidPointer,
     52     kPayloadTooShort,
     53     kInvalidEventParameters,
     54     kInvalidSampleRate
     55   };
     56 
     57   // Set up the buffer for use at sample rate |fs_hz|.
     58   explicit DtmfBuffer(int fs_hz);
     59 
     60   virtual ~DtmfBuffer();
     61 
     62   // Flushes the buffer.
     63   virtual void Flush();
     64 
     65   // Static method to parse 4 bytes from |payload| as a DTMF event (RFC 4733)
     66   // and write the parsed information into the struct |event|. Input variable
     67   // |rtp_timestamp| is simply copied into the struct.
     68   static int ParseEvent(uint32_t rtp_timestamp,
     69                         const uint8_t* payload,
     70                         size_t payload_length_bytes,
     71                         DtmfEvent* event);
     72 
     73   // Inserts |event| into the buffer. The method looks for a matching event and
     74   // merges the two if a match is found.
     75   virtual int InsertEvent(const DtmfEvent& event);
     76 
     77   // Checks if a DTMF event should be played at time |current_timestamp|. If so,
     78   // the method returns true; otherwise false. The parameters of the event to
     79   // play will be written to |event|.
     80   virtual bool GetEvent(uint32_t current_timestamp, DtmfEvent* event);
     81 
     82   // Number of events in the buffer.
     83   virtual size_t Length() const;
     84 
     85   virtual bool Empty() const;
     86 
     87   // Set a new sample rate.
     88   virtual int SetSampleRate(int fs_hz);
     89 
     90  private:
     91   typedef std::list<DtmfEvent> DtmfList;
     92 
     93   int max_extrapolation_samples_;
     94   int frame_len_samples_;  // TODO(hlundin): Remove this later.
     95 
     96   // Compares two events and returns true if they are the same.
     97   static bool SameEvent(const DtmfEvent& a, const DtmfEvent& b);
     98 
     99   // Merges |event| to the event pointed out by |it|. The method checks that
    100   // the two events are the same (using the SameEvent method), and merges them
    101   // if that was the case, returning true. If the events are not the same, false
    102   // is returned.
    103   bool MergeEvents(DtmfList::iterator it, const DtmfEvent& event);
    104 
    105   // Method used by the sort algorithm to rank events in the buffer.
    106   static bool CompareEvents(const DtmfEvent& a, const DtmfEvent& b);
    107 
    108   DtmfList buffer_;
    109 
    110   RTC_DISALLOW_COPY_AND_ASSIGN(DtmfBuffer);
    111 };
    112 
    113 }  // namespace webrtc
    114 #endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DTMF_BUFFER_H_
    115