From 168f2ee79a325c8a125eaeac41f28b8d8bd68f3d Mon Sep 17 00:00:00 2001 From: liushuyu Date: Fri, 8 Feb 2019 21:42:50 -0700 Subject: [PATCH] audio_core: mf: make initialize function return smart pointer --- src/audio_core/hle/wmf_decoder.cpp | 5 +++-- src/audio_core/hle/wmf_decoder_utils.cpp | 17 ++++++++++------- src/audio_core/hle/wmf_decoder_utils.h | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/audio_core/hle/wmf_decoder.cpp b/src/audio_core/hle/wmf_decoder.cpp index 06d4588990..cb981513a5 100644 --- a/src/audio_core/hle/wmf_decoder.cpp +++ b/src/audio_core/hle/wmf_decoder.cpp @@ -72,8 +72,9 @@ std::optional WMFDecoder::Impl::Initalize(const BinaryRequest& r BinaryResponse response; std::memcpy(&response, &request, sizeof(response)); response.unknown1 = 0x0; + transform = MFDecoderInit(); - if (!MFDecoderInit(Amp(transform))) { + if (transform == nullptr) { LOG_CRITICAL(Audio_DSP, "Can't init decoder"); return response; } @@ -116,7 +117,7 @@ MFOutputState WMFDecoder::Impl::DecodingLoop(ADTSData adts_header, // the following was taken from ffmpeg version of the decoder f32 val_f32; - for (size_t i = 0; i < output_buffer->size(); ) { + for (size_t i = 0; i < output_buffer->size();) { for (std::size_t channel = 0; channel < adts_header.channels; channel++) { val_f32 = output_buffer->at(i); s16 val = static_cast(0x7FFF * val_f32); diff --git a/src/audio_core/hle/wmf_decoder_utils.cpp b/src/audio_core/hle/wmf_decoder_utils.cpp index 8f0147a2c7..dbdaa1d0ec 100644 --- a/src/audio_core/hle/wmf_decoder_utils.cpp +++ b/src/audio_core/hle/wmf_decoder_utils.cpp @@ -45,11 +45,12 @@ bool MFCoInit() { return true; } -bool MFDecoderInit(IMFTransform** transform, GUID audio_format) { +unique_mfptr MFDecoderInit(GUID audio_format) { HRESULT hr = S_OK; MFT_REGISTER_TYPE_INFO reg = {0}; GUID category = MFT_CATEGORY_AUDIO_DECODER; IMFActivate** activate; + unique_mfptr transform; UINT32 num_activate; reg.guidMajorType = MFMediaType_Audio; @@ -61,22 +62,24 @@ bool MFDecoderInit(IMFTransform** transform, GUID audio_format) { if (FAILED(hr) || num_activate < 1) { ReportError("Failed to enumerate decoders", hr); CoTaskMemFree(activate); - return false; + return nullptr; } LOG_INFO(Audio_DSP, "Windows(R) Media Foundation found {} suitable decoder(s)", num_activate); for (unsigned int n = 0; n < num_activate; n++) { - hr = activate[n]->ActivateObject(IID_IMFTransform, (void**)transform); + hr = activate[n]->ActivateObject( + IID_IMFTransform, + reinterpret_cast(static_cast(Amp(transform)))); if (FAILED(hr)) - *transform = nullptr; + transform = nullptr; activate[n]->Release(); } - if (*transform == nullptr) { + if (transform == nullptr) { ReportError("Failed to initialize MFT", hr); CoTaskMemFree(activate); - return false; + return nullptr; } CoTaskMemFree(activate); - return true; + return std::move(transform); } void MFDeInit(IMFTransform* transform) { diff --git a/src/audio_core/hle/wmf_decoder_utils.h b/src/audio_core/hle/wmf_decoder_utils.h index 187ec68d7f..2c4ae029a2 100644 --- a/src/audio_core/hle/wmf_decoder_utils.h +++ b/src/audio_core/hle/wmf_decoder_utils.h @@ -60,7 +60,7 @@ void ReportError(std::string msg, HRESULT hr); // exported functions bool MFCoInit(); -bool MFDecoderInit(IMFTransform** transform, GUID audio_format = MFAudioFormat_AAC); +unique_mfptr MFDecoderInit(GUID audio_format = MFAudioFormat_AAC); void MFDeInit(IMFTransform* transform); unique_mfptr CreateSample(void* data, DWORD len, DWORD alignment = 1, LONGLONG duration = 0);