1

IPropertyStore のフラグの値を変更しようとしています。ただし、フラグの値に関係なく、私のコードは同じように動作するようです。

IPropertyStore_Commitこれは、フラグを変更した後 にコードが呼び出されないためですか?

メソッドを呼び出そうとしましたが、0x80004001「実装されていません」という意味のエラー コードが表示されました。したがって、私の質問の 2 番目の部分: なぜ実装されていないのですか?


より詳細には、オーディオ処理の一部に (JNI 経由で) WASAPI を利用する Java ソフトフォンに取り組んでいます。ネイティブ コードは 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);
4

1 に答える 1

1

いくつかの問題:

  1. thiz実際に何があるかわかりません。IMediaObject インターフェイスではないことは確かです。
  2. IMediaObjectfrom からtoにキャストすることはできませんIPropertyStoreQueryInterfaceIMediaObjectポインターが必要です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 に答える