2013-09-24 25 views
1

我試圖改變IPropertyStore中的一個標誌的值。但是,無論標誌的值如何,我的代碼似乎都表現得一樣。IPropertyStore_Commit方法 - 它是否需要,爲什麼不實施?

這是因爲改變後旗我的代碼不會調用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); 

回答

1

幾個問題:

  1. 我不知道什麼thiz實際上是;我很確定它是而不是 IMediaObject接口。
  2. 你不能只從IMediaObject轉換爲IPropertyStore;你必須QueryInterfaceIMediaObject指針爲IPropertyStore
  3. 你不應該需要調用IPropertyStore_Commit;至少不是用於設置AGC密鑰。
  4. 當你調用IPropertyStore_SetValue,確保PROPVARIANT正確初始化。 MFPKEY_WMAAECMA_FEATR_AGC是一個布爾值屬性,讓你的代碼需要看起來像這樣:

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); 
    } 
} 
相關問題