@@ -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