Bagikan melalui


Pertimbangan Implementasi untuk Pemberitahuan Bebek

Pengalaman Bebek Default yang disediakan oleh sistem menbekuk semua aliran non-komunikasi yang tersedia dalam sistem saat aliran komunikasi terbuka. Aplikasi media dapat mengambil alih penanganan default jika tahu kapan sesi komunikasi dimulai dan berakhir.

Pertimbangkan skenario yang diterapkan oleh aplikasi media dalam sampel DuckingMediaPlayer . Aplikasi menjeda aliran audio yang diputarnya ketika menerima pemberitahuan bebek dan melanjutkan pemutaran ketika menerima pemberitahuan yang tidak berfungsi. Peristiwa jeda dan lanjutkan tercermin dalam antarmuka pengguna aplikasi media. Ini didukung melalui dua pesan jendela yang ditentukan aplikasi, WM_APP_SESSION_DUCKED dan WM_APP_SESSION_UNDUCKED. Pemberitahuan bebek diterima secara asinkron di latar belakang dan aplikasi media tidak boleh memblokir utas pemberitahuan untuk memproses pesan jendela. Pesan jendela harus diproses pada utas antarmuka pengguna.

Perilaku bebek bekerja melalui mekanisme pemberitahuan. Untuk memberikan pengalaman yang disesuaikan, aplikasi media harus menerapkan antarmuka IAudioVolumeDuckNotification dan mendaftarkan implementasi dengan sistem audio. Setelah pendaftaran berhasil, aplikasi media menerima pemberitahuan peristiwa dalam bentuk panggilan balik melalui metode di antarmuka. Manajer sesi yang menangani sesi komunikasi memanggil IAudioVolumeDuckNotification::OnVolumeDuckNotification ketika aliran komunikasi terbuka dan kemudian memanggil IAudioVolumeDuckNotification::OnVolumeUnduckNotification ketika aliran ditutup pada perangkat komunikasi.

Kode berikut menunjukkan contoh implementasi antarmuka IAudioVolumeDuckNotification . Untuk definisi CMediaPlayer::D uckingOptOut, lihat Mendapatkan Peristiwa Bebek dari Perangkat Komunikasi.

class CMediaPlayer : public IAudioVolumeDuckNotification
{
    LONG _refCount;

    HWND _AppWindow;

    ~CMediaPlayer();

    STDMETHOD(OnVolumeDuckNotification) (LPCWSTR sessionID, 
                  UINT32 countCommunicationSessions);
    STDMETHOD(OnVolumeUnduckNotification) (LPCWSTR sessionID);

public:
    CDuckingImpl(HWND hWnd);
    HRESULT DuckingOptOut(bool GetDuckEvents);

    // IUnknown
    IFACEMETHODIMP QueryInterface(__in REFIID riid, __deref_out void **ppv);
    IFACEMETHODIMP_(ULONG) AddRef();
    IFACEMETHODIMP_(ULONG) Release();
};

CMediaPlayer::CMediaPlayer(HWND AppWindow) :
        _AppWindow(AppWindow),
        _refCount(1)
{
}
CMediaPlayer::~CMediaPlayer()
{
}

// When we receive a duck notification, 
// post a "Session Ducked" message to the application window.

STDMETHODIMP CMediaPlayer::OnVolumeDuckNotification(LPCWSTR SessionID, 
                                                    UINT32 CountCommunicationsSessions)
{
    PostMessage(_AppWindow, WM_APP_SESSION_DUCKED, 0, 0);
    return 0;
}


// When we receive an unduck notification, 
// post a "Session Unducked" message to the application window.

STDMETHODIMP CMediaPlayer::OnVolumeUnduckNotification(LPCWSTR SessionID)
{
    PostMessage(_AppWindow, WM_APP_SESSION_UNDUCKED, 0, 0);
    return 0;
}

IFACEMETHODIMP CMediaPlayer::QueryInterface(REFIID iid, void **pvObject)
{
    if (pvObject == NULL)
    {
        return E_POINTER;
    }
    *pvObject = NULL;
    if (iid == IID_IUnknown)
    {
        *pvObject = static_cast<IUnknown *>(static_cast<IAudioVolumeDuckNotification *>
                                                                              (this));
        AddRef();
    }
    else if (iid == __uuidof(IAudioVolumeDuckNotification))
    {
        *pvObject = static_cast<IAudioVolumeDuckNotification *>(this);
        AddRef();
    }
    else
    {
        return E_NOINTERFACE;
    }
    return S_OK;
}

IFACEMETHODIMP_(ULONG) CMediaPlayer::AddRef()
{
    return InterlockedIncrement(&_refCount);
}

IFACEMETHODIMP_(ULONG) CMediaPlayer::Release()
{
    LONG refs = InterlockedDecrement(&_refCount);

    if (refs == 0)
    {
        delete this; 
    }

    return refs;   
}

Menggunakan Perangkat Komunikasi

Pengalaman Bebek Default

Menonaktifkan Pengalaman Bebek Default

Menyediakan Perilaku Bebek Kustom

Mendapatkan Acara Bebek