blob: 25ac5cc2d4b32700a623babd829d6bb0ce2d1877 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * 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.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010011#ifndef WEBRTC_MEDIA_ENGINE_WEBRTCVOE_H_
12#define WEBRTC_MEDIA_ENGINE_WEBRTCVOE_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000014#include "webrtc/base/common.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010015#include "webrtc/media/engine/webrtccommon.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000016
17#include "webrtc/common_types.h"
18#include "webrtc/modules/audio_device/include/audio_device.h"
19#include "webrtc/voice_engine/include/voe_audio_processing.h"
20#include "webrtc/voice_engine/include/voe_base.h"
21#include "webrtc/voice_engine/include/voe_codec.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000022#include "webrtc/voice_engine/include/voe_errors.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000023#include "webrtc/voice_engine/include/voe_hardware.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000024#include "webrtc/voice_engine/include/voe_network.h"
25#include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000026#include "webrtc/voice_engine/include/voe_volume_control.h"
27
28namespace cricket {
29// automatically handles lifetime of WebRtc VoiceEngine
30class scoped_voe_engine {
31 public:
32 explicit scoped_voe_engine(webrtc::VoiceEngine* e) : ptr(e) {}
33 // VERIFY, to ensure that there are no leaks at shutdown
34 ~scoped_voe_engine() { if (ptr) VERIFY(webrtc::VoiceEngine::Delete(ptr)); }
35 // Releases the current pointer.
36 void reset() {
37 if (ptr) {
38 VERIFY(webrtc::VoiceEngine::Delete(ptr));
39 ptr = NULL;
40 }
41 }
42 webrtc::VoiceEngine* get() const { return ptr; }
43 private:
44 webrtc::VoiceEngine* ptr;
45};
46
47// scoped_ptr class to handle obtaining and releasing WebRTC interface pointers
48template<class T>
49class scoped_voe_ptr {
50 public:
51 explicit scoped_voe_ptr(const scoped_voe_engine& e)
52 : ptr(T::GetInterface(e.get())) {}
53 explicit scoped_voe_ptr(T* p) : ptr(p) {}
54 ~scoped_voe_ptr() { if (ptr) ptr->Release(); }
55 T* operator->() const { return ptr; }
56 T* get() const { return ptr; }
57
58 // Releases the current pointer.
59 void reset() {
60 if (ptr) {
61 ptr->Release();
62 ptr = NULL;
63 }
64 }
65
66 private:
67 T* ptr;
68};
69
70// Utility class for aggregating the various WebRTC interface.
71// Fake implementations can also be injected for testing.
72class VoEWrapper {
73 public:
74 VoEWrapper()
75 : engine_(webrtc::VoiceEngine::Create()), processing_(engine_),
Fredrik Solenbergb5727682015-12-04 15:22:19 +010076 base_(engine_), codec_(engine_),
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020077 hw_(engine_), network_(engine_),
78 rtp_(engine_), volume_(engine_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079 }
80 VoEWrapper(webrtc::VoEAudioProcessing* processing,
81 webrtc::VoEBase* base,
82 webrtc::VoECodec* codec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 webrtc::VoEHardware* hw,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 webrtc::VoENetwork* network,
85 webrtc::VoERTP_RTCP* rtp,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000086 webrtc::VoEVolumeControl* volume)
87 : engine_(NULL),
88 processing_(processing),
89 base_(base),
90 codec_(codec),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091 hw_(hw),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 network_(network),
93 rtp_(rtp),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094 volume_(volume) {
95 }
96 ~VoEWrapper() {}
97 webrtc::VoiceEngine* engine() const { return engine_.get(); }
98 webrtc::VoEAudioProcessing* processing() const { return processing_.get(); }
99 webrtc::VoEBase* base() const { return base_.get(); }
100 webrtc::VoECodec* codec() const { return codec_.get(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101 webrtc::VoEHardware* hw() const { return hw_.get(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 webrtc::VoENetwork* network() const { return network_.get(); }
103 webrtc::VoERTP_RTCP* rtp() const { return rtp_.get(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104 webrtc::VoEVolumeControl* volume() const { return volume_.get(); }
105 int error() { return base_->LastError(); }
106
107 private:
108 scoped_voe_engine engine_;
109 scoped_voe_ptr<webrtc::VoEAudioProcessing> processing_;
110 scoped_voe_ptr<webrtc::VoEBase> base_;
111 scoped_voe_ptr<webrtc::VoECodec> codec_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000112 scoped_voe_ptr<webrtc::VoEHardware> hw_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000113 scoped_voe_ptr<webrtc::VoENetwork> network_;
114 scoped_voe_ptr<webrtc::VoERTP_RTCP> rtp_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115 scoped_voe_ptr<webrtc::VoEVolumeControl> volume_;
116};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117} // namespace cricket
118
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +0100119#endif // WEBRTC_MEDIA_ENGINE_WEBRTCVOE_H_