2013-09-24 3 views
1

IPropertyStore에서 플래그의 값을 변경하려고합니다. 그러나 내 코드는 플래그의 값에 관계없이 같은 방식으로 동작하는 것으로 보입니다.IPropertyStore_Commit 메서드 - 필요하고 구현되지 않는 이유는 무엇입니까?

내 코드가 플래그를 변경 한 후 IPropertyStore_Commit을 호출하지 않았기 때문에 이것이 발생 했습니까?

"구현되지 않았 음"을 의미하는 0x80004001 오류 코드가 있지만이 메서드를 호출하려고했습니다. 따라서 제 질문의 두 번째 부분은 왜 구현되지 않았습니까?


더 구체적으로, 나는 오디오 프로세싱의 일부 (JNI를 통해) WASAPI를 사용합니다 자바 소프트 폰에서 일하고 있어요. 네이티브 코드는 C로 작성되었습니다.

최근에 AES (Acoustic Echo Suppression)가 활성화 되었기 때문에 AGC (Automatic Gain Control)도 활성화되어있는 것으로 나타났습니다. 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으로 전송할 수 없습니다. 당신은 QueryInterface 을위한 IMediaObject 포인터가 있어야합니다.
  3. IPropertyStore_Commit으로 전화하지 않아도됩니다. 적어도 AGC 키를 설정하는 것이 아닙니다.
  4. IPropertyStore_SetValue를 호출 할 때 PROPVANTANT가 올바르게 초기화되었는지 확인하십시오. 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); 
    } 
} 
관련 문제