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