@@ -81,6 +81,20 @@ class RingRTCVideoEncoderFactory : public VideoEncoderFactory {
8181 factory_;
8282};
8383
84+ // Cleanup class for ADM. Will drop a reference on the rust side, potentially
85+ // invoking the destructor.
86+ class AudioDeviceModuleCleanup {
87+ public:
88+ AudioDeviceModuleCleanup (void (*free_adm_cb)(const void *), void * rust_adm)
89+ : free_adm_cb_(free_adm_cb), adm_(rust_adm) {}
90+
91+ ~AudioDeviceModuleCleanup () { free_adm_cb_ (adm_); }
92+
93+ private:
94+ void (*free_adm_cb_)(const void *);
95+ void * adm_;
96+ };
97+
8498class PeerConnectionFactoryWithOwnedThreads
8599 : public PeerConnectionFactoryOwner {
86100 public:
@@ -165,7 +179,9 @@ class PeerConnectionFactoryWithOwnedThreads
165179 auto factory = CreateModularPeerConnectionFactory (std::move (dependencies));
166180 return make_ref_counted<PeerConnectionFactoryWithOwnedThreads>(
167181 std::move (factory), std::move (network_thread), std::move (worker_thread),
168- std::move (signaling_thread), std::move (injectable_network), adm.get ());
182+ std::move (signaling_thread), std::move (injectable_network), adm.get (),
183+ audio_config_borrowed->free_adm_cb ,
184+ audio_config_borrowed->rust_adm_borrowed );
169185 }
170186
171187 ~PeerConnectionFactoryWithOwnedThreads () override {
@@ -268,8 +284,11 @@ class PeerConnectionFactoryWithOwnedThreads
268284 std::unique_ptr<Thread> owned_worker_thread,
269285 std::unique_ptr<Thread> owned_signaling_thread,
270286 std::unique_ptr<rffi::InjectableNetwork> injectable_network,
271- AudioDeviceModule* audio_device_module)
272- : owned_network_thread_(std::move(owned_network_thread)),
287+ AudioDeviceModule* audio_device_module,
288+ void (*free_adm_cb)(const void *),
289+ void* rust_adm_borrowed)
290+ : adm_cleanup_(free_adm_cb, rust_adm_borrowed),
291+ owned_network_thread_(std::move(owned_network_thread)),
273292 owned_worker_thread_(std::move(owned_worker_thread)),
274293 owned_signaling_thread_(std::move(owned_signaling_thread)),
275294 injectable_network_(std::move(injectable_network)),
@@ -292,6 +311,8 @@ class PeerConnectionFactoryWithOwnedThreads
292311 return thread;
293312 }
294313
314+ // This must be destroyed last.
315+ AudioDeviceModuleCleanup adm_cleanup_;
295316 const std::unique_ptr<Thread> owned_network_thread_;
296317 const std::unique_ptr<Thread> owned_worker_thread_;
297318 const std::unique_ptr<Thread> owned_signaling_thread_;
0 commit comments