Skip to content

Commit 674b6af

Browse files
committed
Lazy-load audio/video managers #44
1 parent e50249b commit 674b6af

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

webrtc-jni/src/main/cpp/include/WebRTCContext.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#include <jni.h>
2525
#include <memory>
26+
#include <mutex>
2627

2728
namespace jni
2829
{
@@ -40,9 +41,12 @@ namespace jni
4041
avdev::VideoDeviceManager * getVideoDeviceManager();
4142

4243
private:
43-
void initializeDeviceManagers();
44+
void initializeAudioManager();
45+
void initializeVideoManager();
4446

4547
private:
48+
std::mutex aMutex;
49+
std::mutex vMutex;
4650
std::unique_ptr<avdev::AudioDeviceManager> audioDevManager;
4751
std::unique_ptr<avdev::VideoDeviceManager> videoDevManager;
4852
};

webrtc-jni/src/main/cpp/src/WebRTCContext.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ namespace jni
9696
JavaFactories::add<webrtc::DataBuffer>(std::make_unique<DataBufferFactory>(env, PKG"RTCDataChannelBuffer"));
9797

9898
initializeClassLoader(env, PKG_INTERNAL"NativeClassLoader");
99-
initializeDeviceManagers();
10099
}
101100

102101
void WebRTCContext::initializeClassLoader(JNIEnv* env, const char * loaderName)
@@ -126,26 +125,48 @@ namespace jni
126125

127126
avdev::AudioDeviceManager * WebRTCContext::getAudioDeviceManager()
128127
{
128+
std::unique_lock<std::mutex> mlock(aMutex);
129+
130+
if (audioDevManager == nullptr) {
131+
initializeAudioManager();
132+
}
133+
129134
return audioDevManager.get();
130135
}
131136

132137
avdev::VideoDeviceManager * WebRTCContext::getVideoDeviceManager()
133138
{
139+
std::unique_lock<std::mutex> mlock(vMutex);
140+
141+
if (videoDevManager == nullptr) {
142+
initializeVideoManager();
143+
}
144+
134145
return videoDevManager.get();
135146
}
136147

137-
void WebRTCContext::initializeDeviceManagers()
148+
void WebRTCContext::initializeAudioManager()
138149
{
139150
#ifdef _WIN32
140151
audioDevManager = std::make_unique<avdev::WindowsAudioDeviceManager>();
141-
videoDevManager = std::make_unique<avdev::WindowsVideoDeviceManager>();
142152
#endif
143153
#ifdef __linux__
144154
audioDevManager = std::make_unique<avdev::PulseAudioDeviceManager>();
145-
videoDevManager = std::make_unique<avdev::V4l2VideoDeviceManager>();
146155
#endif
147156
#ifdef __APPLE__
148157
audioDevManager = std::make_unique<avdev::CoreAudioDeviceManager>();
158+
#endif
159+
}
160+
161+
void WebRTCContext::initializeVideoManager()
162+
{
163+
#ifdef _WIN32
164+
videoDevManager = std::make_unique<avdev::WindowsVideoDeviceManager>();
165+
#endif
166+
#ifdef __linux__
167+
videoDevManager = std::make_unique<avdev::V4l2VideoDeviceManager>();
168+
#endif
169+
#ifdef __APPLE__
149170
videoDevManager = std::make_unique<avdev::AVFVideoDeviceManager>();
150171
#endif
151172
}

0 commit comments

Comments
 (0)