blob: 86e8d62b72c3897481f2dde9499f011e012f5247 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
mflodman@webrtc.org9a065d12012-03-07 08:12:21 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
pbos@webrtc.org956aa7e2013-05-21 13:52:32 +000011#include "webrtc/system_wrappers/interface/trace.h"
12#include "webrtc/voice_engine/dtmf_inband_queue.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000013
14namespace webrtc {
15
pbos@webrtc.org92135212013-05-14 08:31:39 +000016DtmfInbandQueue::DtmfInbandQueue(int32_t id):
niklase@google.com470e71d2011-07-07 08:21:25 +000017 _id(id),
18 _DtmfCritsect(*CriticalSectionWrapper::CreateCriticalSection()),
19 _nextEmptyIndex(0)
20{
21 memset(_DtmfKey,0, sizeof(_DtmfKey));
22 memset(_DtmfLen,0, sizeof(_DtmfLen));
23 memset(_DtmfLevel,0, sizeof(_DtmfLevel));
24}
25
26DtmfInbandQueue::~DtmfInbandQueue()
27{
28 delete &_DtmfCritsect;
29}
30
31int
pbos@webrtc.org6141e132013-04-09 10:09:10 +000032DtmfInbandQueue::AddDtmf(uint8_t key, uint16_t len, uint8_t level)
niklase@google.com470e71d2011-07-07 08:21:25 +000033{
mflodman@webrtc.org9a065d12012-03-07 08:12:21 +000034 CriticalSectionScoped lock(&_DtmfCritsect);
niklase@google.com470e71d2011-07-07 08:21:25 +000035
36 if (_nextEmptyIndex >= kDtmfInbandMax)
37 {
38 WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_id,-1),
39 "DtmfInbandQueue::AddDtmf() unable to add Dtmf tone");
40 return -1;
41 }
pbos@webrtc.org6141e132013-04-09 10:09:10 +000042 int32_t index = _nextEmptyIndex;
niklase@google.com470e71d2011-07-07 08:21:25 +000043 _DtmfKey[index] = key;
44 _DtmfLen[index] = len;
45 _DtmfLevel[index] = level;
46 _nextEmptyIndex++;
47 return 0;
48}
49
pbos@webrtc.org6141e132013-04-09 10:09:10 +000050int8_t
51DtmfInbandQueue::NextDtmf(uint16_t* len, uint8_t* level)
niklase@google.com470e71d2011-07-07 08:21:25 +000052{
mflodman@webrtc.org9a065d12012-03-07 08:12:21 +000053 CriticalSectionScoped lock(&_DtmfCritsect);
niklase@google.com470e71d2011-07-07 08:21:25 +000054
55 if(!PendingDtmf())
56 {
57 return -1;
58 }
pbos@webrtc.org6141e132013-04-09 10:09:10 +000059 int8_t nextDtmf = _DtmfKey[0];
niklase@google.com470e71d2011-07-07 08:21:25 +000060 *len=_DtmfLen[0];
61 *level=_DtmfLevel[0];
62
63 memmove(&(_DtmfKey[0]), &(_DtmfKey[1]),
pbos@webrtc.org6141e132013-04-09 10:09:10 +000064 _nextEmptyIndex*sizeof(uint8_t));
niklase@google.com470e71d2011-07-07 08:21:25 +000065 memmove(&(_DtmfLen[0]), &(_DtmfLen[1]),
pbos@webrtc.org6141e132013-04-09 10:09:10 +000066 _nextEmptyIndex*sizeof(uint16_t));
niklase@google.com470e71d2011-07-07 08:21:25 +000067 memmove(&(_DtmfLevel[0]), &(_DtmfLevel[1]),
pbos@webrtc.org6141e132013-04-09 10:09:10 +000068 _nextEmptyIndex*sizeof(uint8_t));
niklase@google.com470e71d2011-07-07 08:21:25 +000069
70 _nextEmptyIndex--;
71 return nextDtmf;
72}
73
henrika@webrtc.org944cbeb2014-03-18 10:32:33 +000074bool
niklase@google.com470e71d2011-07-07 08:21:25 +000075DtmfInbandQueue::PendingDtmf()
76{
henrika@webrtc.org944cbeb2014-03-18 10:32:33 +000077 CriticalSectionScoped lock(&_DtmfCritsect);
78 return _nextEmptyIndex > 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000079}
80
henrika@webrtc.org944cbeb2014-03-18 10:32:33 +000081void
niklase@google.com470e71d2011-07-07 08:21:25 +000082DtmfInbandQueue::ResetDtmf()
83{
henrika@webrtc.org944cbeb2014-03-18 10:32:33 +000084 CriticalSectionScoped lock(&_DtmfCritsect);
niklase@google.com470e71d2011-07-07 08:21:25 +000085 _nextEmptyIndex = 0;
86}
87
88} // namespace webrtc