Initialize COM for capture cleanup and release completed leases
This commit is contained in:
1 parent
543c9decba
commit
de71617e9f
3 files changed
+15
No files matched your search
@@ -164,6 +164,9 @@ add_library(chatgui_camera STATIC src/call_camera_capture.cpp src/call_camera_wo
|
|||||||
target_link_libraries(chatgui_camera PUBLIC ${QT_LIBS} utun)
|
target_link_libraries(chatgui_camera PUBLIC ${QT_LIBS} utun)
|
||||||
add_library(chatgui_audio_capture STATIC src/audio_capture.cpp)
|
add_library(chatgui_audio_capture STATIC src/audio_capture.cpp)
|
||||||
target_link_libraries(chatgui_audio_capture PUBLIC ${QT_LIBS} utun)
|
target_link_libraries(chatgui_audio_capture PUBLIC ${QT_LIBS} utun)
|
||||||
|
if(WIN32)
|
||||||
|
target_link_libraries(chatgui_audio_capture PRIVATE ole32)
|
||||||
|
endif()
|
||||||
add_library(chatgui_stream_publish STATIC src/stream_publish_engine.cpp src/stream_publish_window.cpp src/call_video_engine.cpp)
|
add_library(chatgui_stream_publish STATIC src/stream_publish_engine.cpp src/stream_publish_window.cpp src/call_video_engine.cpp)
|
||||||
target_link_libraries(chatgui_stream_publish PUBLIC chatgui_live_video chatgui_camera chatgui_audio_capture)
|
target_link_libraries(chatgui_stream_publish PUBLIC chatgui_live_video chatgui_camera chatgui_audio_capture)
|
||||||
target_include_directories(chatgui_stream_publish PRIVATE ${CMAKE_SOURCE_DIR}/../../lib/libopus/include)
|
target_include_directories(chatgui_stream_publish PRIVATE ${CMAKE_SOURCE_DIR}/../../lib/libopus/include)
|
||||||
|
|||||||
@@ -6,6 +6,10 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include "platform_compat.h"
|
||||||
|
#include <objbase.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
struct AudioCapture::Session {
|
struct AudioCapture::Session {
|
||||||
struct Slot {
|
struct Slot {
|
||||||
@@ -156,7 +160,14 @@ void AudioCapture::closeAsync() {
|
|||||||
DEBUG_INFO(DEBUG_CATEGORY_CALL, "capture: asynchronous close started shared=%d", session.use_count() > 1);
|
DEBUG_INFO(DEBUG_CATEGORY_CALL, "capture: asynchronous close started shared=%d", session.use_count() > 1);
|
||||||
try {
|
try {
|
||||||
m_closeThread = std::thread([this, session = std::move(session)]() mutable {
|
m_closeThread = std::thread([this, session = std::move(session)]() mutable {
|
||||||
|
#ifdef _WIN32
|
||||||
|
HRESULT com = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
|
||||||
|
if (FAILED(com)) DEBUG_ERROR(DEBUG_CATEGORY_CALL, "capture: close worker COM init failed HRESULT=0x%08lx", (unsigned long)com);
|
||||||
|
#endif
|
||||||
session.reset();
|
session.reset();
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (SUCCEEDED(com)) CoUninitialize();
|
||||||
|
#endif
|
||||||
DEBUG_INFO(DEBUG_CATEGORY_CALL, "capture: asynchronous close completed");
|
DEBUG_INFO(DEBUG_CATEGORY_CALL, "capture: asynchronous close completed");
|
||||||
m_closeDone.store(true, std::memory_order_release);
|
m_closeDone.store(true, std::memory_order_release);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -738,6 +738,7 @@ void StreamPublishEngine::videoLoop(StreamPublishConfig initial) {
|
|||||||
void StreamPublishEngine::tick() {
|
void StreamPublishEngine::tick() {
|
||||||
if (!active()) return;
|
if (!active()) return;
|
||||||
if (!m->running && m_capture.closing()) return;
|
if (!m->running && m_capture.closing()) return;
|
||||||
|
if (!m->running) m_microphone.release();
|
||||||
stream_publisher_status status;
|
stream_publisher_status status;
|
||||||
if (!gui_stream_publish_status(m->id, status)) {
|
if (!gui_stream_publish_status(m->id, status)) {
|
||||||
stop();
|
stop();
|
||||||
|
|||||||
Reference in new issue
Block a user