1/*
2 *  Copyright (c) 2013 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_VOICE_ENGINE_INCLUDE_MOCK_FAKE_VOE_EXTERNAL_MEDIA_H_
12#define WEBRTC_VOICE_ENGINE_INCLUDE_MOCK_FAKE_VOE_EXTERNAL_MEDIA_H_
13
14#include <map>
15
16#include "webrtc/system_wrappers/interface/scoped_ptr.h"
17#include "webrtc/test/fake_common.h"
18#include "webrtc/voice_engine/include/voe_external_media.h"
19
20namespace webrtc {
21
22class FakeVoEExternalMedia : public VoEExternalMedia {
23 public:
24  FakeVoEExternalMedia() {}
25  virtual ~FakeVoEExternalMedia() {}
26
27  WEBRTC_STUB(Release, ());
28  WEBRTC_FUNC(RegisterExternalMediaProcessing,
29      (int channel, ProcessingTypes type, VoEMediaProcess& processObject)) {
30    callback_map_[type] = &processObject;
31    return 0;
32  }
33  WEBRTC_FUNC(DeRegisterExternalMediaProcessing,
34      (int channel, ProcessingTypes type)) {
35    callback_map_.erase(type);
36    return 0;
37  }
38  WEBRTC_STUB(SetExternalRecordingStatus, (bool enable));
39  WEBRTC_STUB(SetExternalPlayoutStatus, (bool enable));
40  WEBRTC_STUB(ExternalRecordingInsertData,
41      (const int16_t speechData10ms[], int lengthSamples,
42       int samplingFreqHz, int current_delay_ms));
43  WEBRTC_STUB(ExternalPlayoutGetData,
44      (int16_t speechData10ms[], int samplingFreqHz,
45       int current_delay_ms, int& lengthSamples));
46  WEBRTC_STUB(GetAudioFrame, (int channel, int desired_sample_rate_hz,
47                              AudioFrame* frame));
48  WEBRTC_STUB(SetExternalMixing, (int channel, bool enable));
49
50  // Use this to trigger the Process() callback to a registered media processor.
51  // If |audio| is NULL, a zero array of the correct length will be forwarded.
52  void CallProcess(ProcessingTypes type, int16_t* audio,
53                   int samples_per_channel, int sample_rate_hz,
54                   int num_channels) {
55    const int length = samples_per_channel * num_channels;
56    scoped_ptr<int16_t[]> data;
57    if (!audio) {
58      data.reset(new int16_t[length]);
59      memset(data.get(), 0, length * sizeof(data[0]));
60      audio = data.get();
61    }
62
63    std::map<ProcessingTypes, VoEMediaProcess*>::const_iterator it =
64        callback_map_.find(type);
65    if (it != callback_map_.end()) {
66      it->second->Process(0, type, audio, samples_per_channel, sample_rate_hz,
67                          num_channels == 2 ? true : false);
68    }
69  }
70
71 private:
72  std::map<ProcessingTypes, VoEMediaProcess*> callback_map_;
73};
74
75}  // namespace webrtc
76
77#endif  //  WEBRTC_VOICE_ENGINE_INCLUDE_MOCK_FAKE_VOE_EXTERNAL_MEDIA_H_
78