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 DtmfEventDtmfEvent30 DtmfEvent() 31 : timestamp(0), 32 event_no(0), 33 volume(0), 34 duration(0), 35 end_bit(false) { 36 } DtmfEventDtmfEvent37 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