1

我正在尝试更改 IPropertyStore 中标志的值。但是,无论标志的值如何,我的代码的行为似乎都是相同的。

IPropertyStore_Commit这是因为我的代码在更改标志后 没有调用吗?

我确实尝试调用该方法,但是我得到了一个错误代码0x80004001,意思是“未实现”。因此,我的问题的第二部分:为什么不实施?


更详细地说,我正在开发一个 Java 软电话,它使用 WASAPI(通过 JNI)进行一些音频处理。本机代码是用 C 编写的。

最近启用了 AES(声学回声抑制),我发现 AGC(自动增益控制)也启用了。我试图通过在 IPropertyStore 对象上设置 MFPKEY_WMAAECMA_FEATR_AGC 键来禁用 AGC。但是,无论我将值设置为什么都没有区别。

相关代码片段如下:

// Obtain the property store
void *pvObject;
HRESULT hr = IMediaObject_QueryInterface((IMediaObject *) thiz, &iid_, &pvObject);
// Do some checking that the store is valid...

// Set the value of the AGC key:
PROPVARIANT propvar = ...
IPropertyStore_SetValue((IPropertyStore *)pvObject, (REFPROPERTYKEY) key, &propvar);

// Call commit - fails, with 0x80004001:
HRESULT hr = IPropertyStore_Commit((IPropertyStore *)pvObject);
4

1 回答 1

1

几个问题:

  1. 我不确定thiz实际上是什么;我很确定它不是IMediaObject 接口。
  2. 您不能只从IMediaObjectto 转换为IPropertyStore; 你必须QueryInterface指向IMediaObject.IPropertyStore
  3. 你不需要打电话IPropertyStore_Commit;至少,不用于设置 AGC 密钥。
  4. 当您调用 IPropertyStore_SetValue 时,请确保正确初始化 PROPVARIANT。MFPKEY_WMAAECMA_FEATR_AGC 是一个 BOOLEAN 属性,因此您的代码需要看起来像这样:

IMediaObject *pvObject;
HRESULT hr = IUnknown_QueryInterface((IUnknown*) thiz, IID_PPV_ARGS(&pvObject));
if (SUCCEEDED(hr))
{
     IPropertyStore* pvPropStore;
     hr = IMediaObject_QueryInterface(pvObject, IID_PPV_ARGS(&pvPropStore));
     if (SUCCEEDED(hr))
     {
         PROPVARIANT pvFeature;
         PropVariantInit(&pvFeature);
         pvFeature.vt = VT_BOOL;
         pvFeature.boolVal = fValue ? VBTRUE : VBFALSE;

         hr = IPropertyStore_SetValue(pvPropStore, MFPKEY_WMAAECMA_FEATR_AGC, pvFeature);
     }
}
于 2013-09-24T19:01:04.440 回答