私は、Windows 7のIAudioSessionManager2 COMインターフェイス(IAudioSessionNotificationと組み合わせて)を介して新しいオーディオセッションを監視しようとしています。現時点では、IAudioSessionNotification :: OnSessionCreated()は呼び出されません。理由についてはアイデアが不足しています。カスタムIAudioSessionNotificationを登録IAudioSessionManager2通知が送信されない
コード:
#define SAFE_RELEASE(comObj) \
if(comObj != NULL) \
{ (comObj)->Release(); comObj = NULL; }
BOOL success = false;
HRESULT res;
IClassFactory* pFactory;
IMMDevice* pDevice;
IMMDeviceEnumerator* pEnumerator;
SESSION_LISTENER = NULL;
SESSION = NULL;
res = CoInitialize(NULL);
if(res != S_OK && res != S_FALSE)
return false;
res = CoGetClassObject(CLSID_CustomAudioFactory, CLSCTX_ALL, NULL, __uuidof(IClassFactory), (void**)&pFactory);
if(res != S_OK) goto Exit;
res = pFactory->CreateInstance(NULL, CLSID_CustomAudioNotifications, (void**)&SESSION_LISTENER);
if(res != S_OK) goto Exit;
res = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);
if(res != S_OK) goto Exit;
res = pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
if(res != S_OK) goto Exit;
res = pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&SESSION);
if(res != S_OK) goto Exit;
res = SESSION->RegisterSessionNotification(SESSION_LISTENER);
if(res != S_OK) goto Exit;
success = true;
Exit:
SAFE_RELEASE(pFactory);
SAFE_RELEASE(pEnumerator);
SAFE_RELEASE(pDevice);
if(!success)
{
SAFE_RELEASE(SESSION_LISTENER);
SAFE_RELEASE(SESSION);
}
CustomAudioNotifications宣言:
class CustomAudioNotifications : public IAudioSessionNotification
{
public:
//Constructors
CustomAudioNotifications() { InterlockedIncrement(&g_notifyCount); m_listener = NULL; }
~CustomAudioNotifications() { InterlockedDecrement(&g_notifyCount); SAFE_RELEASE(m_listener); }
//IUnknown interface
HRESULT __stdcall QueryInterface(
REFIID riid ,
void **ppObj);
ULONG __stdcall AddRef();
ULONG __stdcall Release();
//Notification
HRESULT __stdcall OnSessionCreated(IAudioSessionControl *NewSession);
private:
LONG m_nRefCount;
};
は、セッションが当面のために作成されるたびに、単にウィンドウにメッセージを投稿OnSessionCreated。それは決して起こらない。私の前提が完全に根本から外れている場合に備えて、まだオーディオを再生していないアプリケーションが開始するたびに通知が出ることを期待しています。 VLCをビデオファイルで起動するとすぐに通知が表示され、Webブラウザ経由でPandoraを訪れるとそのような通知が行われます。
デバッグは、すべての戻り値がS_OKであることを示します。
私のCOMエクスペリエンスはかなり制限されているので、一般的な「WTF」を指摘しています。また評価されるだろう。
CustomAudioNotifications :: QueryInterfaceが呼び出されていますか?それはS_OKを返しますか? – sharptooth
そのファクトリを介してオブジェクトを構築することの外側。いいえ、QueryInterfaceは呼び出されません。少なくとも、ブレークポイントは決してトリップされません。 –