From 114bc5b3677929f111b34699bd7ce3d72e980104 Mon Sep 17 00:00:00 2001 From: Karl Blomster Date: Mon, 25 May 2009 16:42:33 +0000 Subject: [PATCH] Do COM initialization more properly (I think) in the FFMS2 providers. Originally committed to SVN as r2989. --- aegisub/src/audio_provider_ffmpegsource.cpp | 13 +++++++++---- aegisub/src/audio_provider_ffmpegsource.h | 2 ++ aegisub/src/video_provider_ffmpegsource.cpp | 11 ++++++++--- aegisub/src/video_provider_ffmpegsource.h | 2 ++ 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/aegisub/src/audio_provider_ffmpegsource.cpp b/aegisub/src/audio_provider_ffmpegsource.cpp index e74d50746..a0e3c9508 100644 --- a/aegisub/src/audio_provider_ffmpegsource.cpp +++ b/aegisub/src/audio_provider_ffmpegsource.cpp @@ -49,10 +49,14 @@ /////////// // Constructor FFmpegSourceAudioProvider::FFmpegSourceAudioProvider(Aegisub::String filename) { + COMInited = false; #ifdef WIN32 - if (!SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) { - throw _T("FFmpegSource audio provider: COM initialization failure"); - } + HRESULT res; + res = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + if (SUCCEEDED(res)) + COMInited = true; + else if (res != RPC_E_CHANGED_MODE) + throw _T("FFmpegSource video provider: COM initialization failure"); #endif FFMS_Init(); @@ -182,7 +186,8 @@ void FFmpegSourceAudioProvider::LoadAudio(Aegisub::String filename) { FFmpegSourceAudioProvider::~FFmpegSourceAudioProvider() { Close(); #ifdef WIN32 - CoUninitialize(); + if (COMInited) + CoUninitialize(); #endif } diff --git a/aegisub/src/audio_provider_ffmpegsource.h b/aegisub/src/audio_provider_ffmpegsource.h index 1241b5783..6806dbb74 100644 --- a/aegisub/src/audio_provider_ffmpegsource.h +++ b/aegisub/src/audio_provider_ffmpegsource.h @@ -51,6 +51,8 @@ private: unsigned MsgSize; wxString MsgString; + bool COMInited; + void Close(); void LoadAudio(Aegisub::String filename); diff --git a/aegisub/src/video_provider_ffmpegsource.cpp b/aegisub/src/video_provider_ffmpegsource.cpp index 3a88f70c9..0b2245d65 100644 --- a/aegisub/src/video_provider_ffmpegsource.cpp +++ b/aegisub/src/video_provider_ffmpegsource.cpp @@ -53,10 +53,14 @@ /////////////// // Constructor FFmpegSourceVideoProvider::FFmpegSourceVideoProvider(Aegisub::String filename, double fps) { + COMInited = false; #ifdef WIN32 - if (!SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) { + HRESULT res; + res = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + if (SUCCEEDED(res)) + COMInited = true; + else if (res != RPC_E_CHANGED_MODE) throw _T("FFmpegSource video provider: COM initialization failure"); - } #endif // initialize ffmpegsource FFMS_Init(); @@ -84,7 +88,8 @@ FFmpegSourceVideoProvider::FFmpegSourceVideoProvider(Aegisub::String filename, d FFmpegSourceVideoProvider::~FFmpegSourceVideoProvider() { Close(); #ifdef WIN32 - CoUninitialize(); + if (COMInited) + CoUninitialize(); #endif } diff --git a/aegisub/src/video_provider_ffmpegsource.h b/aegisub/src/video_provider_ffmpegsource.h index c98b9d18d..a51d42754 100644 --- a/aegisub/src/video_provider_ffmpegsource.h +++ b/aegisub/src/video_provider_ffmpegsource.h @@ -64,6 +64,8 @@ private: unsigned MessageSize; wxString ErrorMsg; + bool COMInited; + void LoadVideo(Aegisub::String filename, double fps); void Close();