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;
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<s16>(0x7FFF * val_f32);

View File

@ -45,11 +45,12 @@ bool MFCoInit() {
return true;
}
bool MFDecoderInit(IMFTransform** transform, GUID audio_format) {
unique_mfptr<IMFTransform> MFDecoderInit(GUID audio_format) {
HRESULT hr = S_OK;
MFT_REGISTER_TYPE_INFO reg = {0};
GUID category = MFT_CATEGORY_AUDIO_DECODER;
IMFActivate** activate;
unique_mfptr<IMFTransform> 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<void**>(static_cast<IMFTransform**>(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) {

View File

@ -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<IMFTransform> MFDecoderInit(GUID audio_format = MFAudioFormat_AAC);
void MFDeInit(IMFTransform* transform);
unique_mfptr<IMFSample> CreateSample(void* data, DWORD len, DWORD alignment = 1,
LONGLONG duration = 0);