1/*
2 *  Copyright (c) 2011 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#include "webrtc/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h"
12#include "webrtc/voice_engine/voice_engine_defines.h"
13
14class DtmfTest : public AfterStreamingFixture {
15 protected:
16  void RunSixteenDtmfEvents(bool out_of_band) {
17    TEST_LOG("Sending telephone events:\n");
18    EXPECT_EQ(0, voe_dtmf_->SetDtmfFeedbackStatus(false));
19
20    for (int i = 0; i < 16; i++) {
21      TEST_LOG("%d ", i);
22      TEST_LOG_FLUSH;
23      EXPECT_EQ(0, voe_dtmf_->SendTelephoneEvent(
24          channel_, i, out_of_band, 160, 10));
25      Sleep(500);
26    }
27    TEST_LOG("\n");
28  }
29};
30
31TEST_F(DtmfTest, DtmfFeedbackIsEnabledByDefaultButNotDirectFeedback) {
32  bool dtmf_feedback = false;
33  bool dtmf_direct_feedback = false;
34
35  EXPECT_EQ(0, voe_dtmf_->GetDtmfFeedbackStatus(dtmf_feedback,
36                                                dtmf_direct_feedback));
37
38  EXPECT_TRUE(dtmf_feedback);
39  EXPECT_FALSE(dtmf_direct_feedback);
40}
41
42TEST_F(DtmfTest, ManualSuccessfullySendsInBandTelephoneEvents) {
43  RunSixteenDtmfEvents(false);
44}
45
46TEST_F(DtmfTest, ManualSuccessfullySendsOutOfBandTelephoneEvents) {
47  RunSixteenDtmfEvents(true);
48}
49
50TEST_F(DtmfTest, TestTwoNonDtmfEvents) {
51  EXPECT_EQ(0, voe_dtmf_->SendTelephoneEvent(channel_, 32, true));
52  EXPECT_EQ(0, voe_dtmf_->SendTelephoneEvent(channel_, 110, true));
53}
54
55TEST_F(DtmfTest, ManualCanDisableDtmfPlayoutExceptOnIphone) {
56  TEST_LOG("Disabling DTMF playout (no tone should be heard) \n");
57  EXPECT_EQ(0, voe_dtmf_->SetDtmfPlayoutStatus(channel_, false));
58  EXPECT_EQ(0, voe_dtmf_->SendTelephoneEvent(channel_, 0, true));
59  Sleep(500);
60
61  TEST_LOG("Enabling DTMF playout (tone should be heard) \n");
62  EXPECT_EQ(0, voe_dtmf_->SetDtmfPlayoutStatus(channel_, true));
63  EXPECT_EQ(0, voe_dtmf_->SendTelephoneEvent(channel_, 0, true));
64  Sleep(500);
65}
66
67// This test modifies the DTMF payload type from the default 106 to 88
68// and then runs through 16 DTMF out.of-band events.
69TEST_F(DtmfTest, ManualCanChangeDtmfPayloadType) {
70  webrtc::CodecInst codec_instance = webrtc::CodecInst();
71
72  TEST_LOG("Changing DTMF payload type.\n");
73
74  // Start by modifying the receiving side.
75  for (int i = 0; i < voe_codec_->NumOfCodecs(); i++) {
76    EXPECT_EQ(0, voe_codec_->GetCodec(i, codec_instance));
77    if (!_stricmp("telephone-event", codec_instance.plname)) {
78      codec_instance.pltype = 88;  // Use 88 instead of default 106.
79      EXPECT_EQ(0, voe_base_->StopSend(channel_));
80      EXPECT_EQ(0, voe_base_->StopPlayout(channel_));
81      EXPECT_EQ(0, voe_base_->StopReceive(channel_));
82      EXPECT_EQ(0, voe_codec_->SetRecPayloadType(channel_, codec_instance));
83      EXPECT_EQ(0, voe_base_->StartReceive(channel_));
84      EXPECT_EQ(0, voe_base_->StartPlayout(channel_));
85      EXPECT_EQ(0, voe_base_->StartSend(channel_));
86      break;
87    }
88  }
89
90  Sleep(500);
91
92  // Next, we must modify the sending side as well.
93  EXPECT_EQ(0, voe_dtmf_->SetSendTelephoneEventPayloadType(
94      channel_, codec_instance.pltype));
95
96  RunSixteenDtmfEvents(true);
97
98  EXPECT_EQ(0, voe_dtmf_->SetDtmfFeedbackStatus(true, false));
99}
100