audio_core: mf: make initialize function return smart pointer

This commit is contained in:
liushuyu 2019-02-08 21:42:50 -07:00 committed by B3N30
parent c91f5029ff
commit 168f2ee79a
3 changed files with 14 additions and 10 deletions

View file

@ -72,8 +72,9 @@ std::optional<BinaryResponse> WMFDecoder::Impl::Initalize(const BinaryRequest& r
BinaryResponse response; BinaryResponse response;
std::memcpy(&response, &request, sizeof(response)); std::memcpy(&response, &request, sizeof(response));
response.unknown1 = 0x0; response.unknown1 = 0x0;
transform = MFDecoderInit();
if (!MFDecoderInit(Amp(transform))) { if (transform == nullptr) {
LOG_CRITICAL(Audio_DSP, "Can't init decoder"); LOG_CRITICAL(Audio_DSP, "Can't init decoder");
return response; return response;
} }
@ -116,7 +117,7 @@ MFOutputState WMFDecoder::Impl::DecodingLoop(ADTSData adts_header,
// the following was taken from ffmpeg version of the decoder // the following was taken from ffmpeg version of the decoder
f32 val_f32; 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++) { for (std::size_t channel = 0; channel < adts_header.channels; channel++) {
val_f32 = output_buffer->at(i); val_f32 = output_buffer->at(i);
s16 val = static_cast<s16>(0x7FFF * val_f32); s16 val = static_cast<s16>(0x7FFF * val_f32);

View file

@ -45,11 +45,12 @@ bool MFCoInit() {
return true; return true;
} }
bool MFDecoderInit(IMFTransform** transform, GUID audio_format) { unique_mfptr<IMFTransform> MFDecoderInit(GUID audio_format) {
HRESULT hr = S_OK; HRESULT hr = S_OK;
MFT_REGISTER_TYPE_INFO reg = {0}; MFT_REGISTER_TYPE_INFO reg = {0};
GUID category = MFT_CATEGORY_AUDIO_DECODER; GUID category = MFT_CATEGORY_AUDIO_DECODER;
IMFActivate** activate; IMFActivate** activate;
unique_mfptr<IMFTransform> transform;
UINT32 num_activate; UINT32 num_activate;
reg.guidMajorType = MFMediaType_Audio; reg.guidMajorType = MFMediaType_Audio;
@ -61,22 +62,24 @@ bool MFDecoderInit(IMFTransform** transform, GUID audio_format) {
if (FAILED(hr) || num_activate < 1) { if (FAILED(hr) || num_activate < 1) {
ReportError("Failed to enumerate decoders", hr); ReportError("Failed to enumerate decoders", hr);
CoTaskMemFree(activate); CoTaskMemFree(activate);
return false; return nullptr;
} }
LOG_INFO(Audio_DSP, "Windows(R) Media Foundation found {} suitable decoder(s)", num_activate); LOG_INFO(Audio_DSP, "Windows(R) Media Foundation found {} suitable decoder(s)", num_activate);
for (unsigned int n = 0; n < num_activate; n++) { 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<void**>(static_cast<IMFTransform**>(Amp(transform))));
if (FAILED(hr)) if (FAILED(hr))
*transform = nullptr; transform = nullptr;
activate[n]->Release(); activate[n]->Release();
} }
if (*transform == nullptr) { if (transform == nullptr) {
ReportError("Failed to initialize MFT", hr); ReportError("Failed to initialize MFT", hr);
CoTaskMemFree(activate); CoTaskMemFree(activate);
return false; return nullptr;
} }
CoTaskMemFree(activate); CoTaskMemFree(activate);
return true; return std::move(transform);
} }
void MFDeInit(IMFTransform* transform) { void MFDeInit(IMFTransform* transform) {

View file

@ -60,7 +60,7 @@ void ReportError(std::string msg, HRESULT hr);
// exported functions // exported functions
bool MFCoInit(); bool MFCoInit();
bool MFDecoderInit(IMFTransform** transform, GUID audio_format = MFAudioFormat_AAC); unique_mfptr<IMFTransform> MFDecoderInit(GUID audio_format = MFAudioFormat_AAC);
void MFDeInit(IMFTransform* transform); void MFDeInit(IMFTransform* transform);
unique_mfptr<IMFSample> CreateSample(void* data, DWORD len, DWORD alignment = 1, unique_mfptr<IMFSample> CreateSample(void* data, DWORD len, DWORD alignment = 1,
LONGLONG duration = 0); LONGLONG duration = 0);