blob: 2f7b997dae5749ec638d68983a2faf03d6f2b0ea [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
kwiberg686a8ef2016-02-26 03:00:35 -080047// unique_ptr-like class to handle obtaining and releasing WebRTC interface
48// pointers.
henrike@webrtc.org28e20752013-07-10 00:45:36 +000049template<class T>
50class scoped_voe_ptr {
51 public:
52 explicit scoped_voe_ptr(const scoped_voe_engine& e)
53 : ptr(T::GetInterface(e.get())) {}
54 explicit scoped_voe_ptr(T* p) : ptr(p) {}
55 ~scoped_voe_ptr() { if (ptr) ptr->Release(); }
56 T* operator->() const { return ptr; }
57 T* get() const { return ptr; }
58
59 // Releases the current pointer.
60 void reset() {
61 if (ptr) {
62 ptr->Release();
63 ptr = NULL;
64 }
65 }
66
67 private:
68 T* ptr;
69};
70
71// Utility class for aggregating the various WebRTC interface.
72// Fake implementations can also be injected for testing.
73class VoEWrapper {
74 public:
75 VoEWrapper()
76 : engine_(webrtc::VoiceEngine::Create()), processing_(engine_),
Fredrik Solenbergb5727682015-12-04 15:22:19 +010077 base_(engine_), codec_(engine_),
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020078 hw_(engine_), network_(engine_),
79 rtp_(engine_), volume_(engine_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 }
81 VoEWrapper(webrtc::VoEAudioProcessing* processing,
82 webrtc::VoEBase* base,
83 webrtc::VoECodec* codec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 webrtc::VoEHardware* hw,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000085 webrtc::VoENetwork* network,
86 webrtc::VoERTP_RTCP* rtp,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087 webrtc::VoEVolumeControl* volume)
88 : engine_(NULL),
89 processing_(processing),
90 base_(base),
91 codec_(codec),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 hw_(hw),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093 network_(network),
94 rtp_(rtp),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095 volume_(volume) {
96 }
97 ~VoEWrapper() {}
98 webrtc::VoiceEngine* engine() const { return engine_.get(); }
99 webrtc::VoEAudioProcessing* processing() const { return processing_.get(); }
100 webrtc::VoEBase* base() const { return base_.get(); }
101 webrtc::VoECodec* codec() const { return codec_.get(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 webrtc::VoEHardware* hw() const { return hw_.get(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103 webrtc::VoENetwork* network() const { return network_.get(); }
104 webrtc::VoERTP_RTCP* rtp() const { return rtp_.get(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000105 webrtc::VoEVolumeControl* volume() const { return volume_.get(); }
106 int error() { return base_->LastError(); }
107
108 private:
109 scoped_voe_engine engine_;
110 scoped_voe_ptr<webrtc::VoEAudioProcessing> processing_;
111 scoped_voe_ptr<webrtc::VoEBase> base_;
112 scoped_voe_ptr<webrtc::VoECodec> codec_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000113 scoped_voe_ptr<webrtc::VoEHardware> hw_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000114 scoped_voe_ptr<webrtc::VoENetwork> network_;
115 scoped_voe_ptr<webrtc::VoERTP_RTCP> rtp_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116 scoped_voe_ptr<webrtc::VoEVolumeControl> volume_;
117};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118} // namespace cricket
119
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +0100120#endif // WEBRTC_MEDIA_ENGINE_WEBRTCVOE_H_