नहीं भेजा गया है, मैं विंडोज 7 के IAudioSessionManager2 COM इंटरफ़ेस (IAudioSessionNotification के साथ) के माध्यम से नए ऑडियो सत्रों की निगरानी करने की कोशिश कर रहा हूं। वर्तमान में, IAudioSessionNotification :: OnSessionCreated() को कभी नहीं कहा जाता है और मैं विचारों से बाहर क्यों चला गया हूं।IAudioSessionManager2 नोटिफिकेशन
कोड दर्ज की कस्टम IAudioSessionNotification:
#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; जो कभी नहीं होता है। बस अगर मेरी धारणाएं पूरी तरह से आधार से बाहर हैं, तो मुझे एक अधिसूचना की उम्मीद है जब भी कोई एप्लिकेशन जो ऑडियो चलाने के लिए नहीं है, ऐसा करने के लिए शुरू होता है; इसलिए एक वीडियो फ़ाइल के साथ वीएलसी लॉन्च करना तुरंत एक नोटिस में होना चाहिए, जबकि एक वेब ब्राउज़र के माध्यम से पेंडोरा का दौरा करने से इस तरह की सूचना भी शुरू हो जाएगी।
डीबगिंग से पता चलता है कि सभी लौटाए गए मूल्य S_OK हैं।
मेरा COM अनुभव काफी सीमित है, इसलिए सामान्य "डब्ल्यूटीएफ" को इंगित करना? भी सराहना की जाएगी।
क्या कस्टमऑडियो नोटिफिकेशन :: QueryInterface कहा जाता है? क्या यह एस_ओके वापस आता है? – sharptooth
अपने कारखाने के माध्यम से वस्तु का निर्माण करने के बाहर; नहीं, QueryInterface नहीं कहा जाता है। कम से कम, ब्रेकपॉइंट कभी नहीं फिसल जाता है। –