Bagikan melalui


Cara Mendapatkan Peristiwa dari Sumber Jaringan

Pemecah masalah sumber memungkinkan aplikasi untuk membuat sumber jaringan dan membuka koneksi ke URL tertentu. Sumber jaringan memunculkan peristiwa untuk menandai awal dan akhir operasi asinkron membuka koneksi. Aplikasi dapat mendaftar untuk peristiwa ini dengan menggunakan antarmuka IMFSourceOpenMonitor .

Antarmuka ini mengekspos metode IMFSourceOpenMonitor::OnSourceEvent yang dipanggil sumber jaringan secara langsung saat membuka URL secara asinkron. Sumber jaringan memberi tahu aplikasi ketika mulai membuka URL dengan menaikkan peristiwa MEConnectStart . Sumber jaringan kemudian menaikkan peristiwa MEConnectEnd ketika menyelesaikan operasi terbuka.

Catatan

Untuk mengirim peristiwa ini ke aplikasi, sumber jaringan tidak menggunakan antarmuka IMFMediaEventGenerator karena peristiwa ini dinaikkan sebelum sumber jaringan dibuat. Aplikasi bisa mendapatkan semua peristiwa sumber jaringan lainnya dengan menggunakan antarmuka IMFMediaEventGenerator Sesi Media.

 

Untuk mendapatkan peristiwa dari sumber jaringan

  1. Terapkan antarmuka IMFSourceOpenMonitor . Dalam implementasi metode IMFSourceOpenMonitor::OnSourceEvent Anda, lakukan hal berikut:
    1. Dapatkan status peristiwa dengan memanggil IMFMediaEvent::GetStatus. Metode ini menunjukkan apakah operasi yang memicu peristiwa, seperti panggilan metode penyelesai sumber, berhasil. Jika operasi tidak berhasil, statusnya adalah kode kegagalan.
    2. Proses peristiwa berdasarkan jenis peristiwa: MEConnectStart atau MEConnectEnd, yang bisa diperoleh aplikasi dengan memanggil IMFMediaEvent::GetType.
  2. Konfigurasikan pasangan kunci-nilai dalam objek penyimpanan properti untuk menyimpan penunjuk ke implementasi IMFSourceOpenMonitor yang dijelaskan di langkah 1.
    1. Buat objek penyimpanan properti dengan memanggil fungsi PSCreateMemoryPropertyStore .
    2. Atur properti MFPKEY_SourceOpenMonitor dalam struktur PROPERTYKEY .
    3. Berikan nilai data jenis VT_UNKNOWN dalam struktur PROPVARIANT dengan mengatur penunjuk IUnknown ke implementasi aplikasi antarmuka IMFSourceOpenMonitor .
    4. Atur pasangan kunci-nilai di penyimpanan properti dengan memanggil IPropertyStore::SetValue.
  3. Teruskan penunjuk penyimpanan properti ke metode pemecah masalah sumber yang digunakan aplikasi untuk membuat sumber jaringan, seperti IMFSourceResolver::CreateObjectFromURL dan lainnya.

Contoh

Contoh berikut menunjukkan cara mengimplementasikan antarmuka IMFSourceOpenMonitor untuk mendapatkan peristiwa dari sumber jaringan.

class CSourceOpenMonitor : public IMFSourceOpenMonitor
{
public:
    CSourceOpenMonitor () : m_cRef(1) { }

    STDMETHODIMP QueryInterface(REFIID riid, void** ppv)
    {
        static const QITAB qit[] = 
        {
            QITABENT(CSourceOpenMonitor, IMFSourceOpenMonitor),
            { 0 }
        };
        return QISearch(this, qit, riid, ppv);
    }

    STDMETHODIMP_(ULONG) AddRef()
    {
        return InterlockedIncrement(&m_cRef);
    }

    STDMETHODIMP_(ULONG) Release()
    {
        LONG cRef = InterlockedDecrement(&m_cRef);
        if (cRef == 0)
        {
            delete this;
        }
        // For thread safety, return a temporary variable.
        return cRef;
    }


    STDMETHODIMP OnSourceEvent(IMFMediaEvent* pEvent)
    {
        MediaEventType eventType = MEUnknown;   // Event type
        HRESULT hrStatus = S_OK;                // Event status

        // Get the event type.
        HRESULT hr = pEvent->GetType(&eventType);

        // Get the event status. If the operation that triggered the event
        // did not succeed, the status is a failure code.
        if (SUCCEEDED(hr))
        {
            hr = pEvent->GetStatus(&hrStatus);
        }

        if (FAILED(hrStatus))
        {
            hr = hrStatus;
        }

        if (SUCCEEDED(hr))
        {
            // Switch on the event type.
            switch(eventType)
            {
                case MEConnectStart:
                    // The application does something. (Not shown.)
                    OutputDebugString(L"Connecting...\n");
                    break;

                case MEConnectEnd:
                    // The application does something. (Not shown.)
                    OutputDebugString(L"Connect End.\n");
                    break;
            }
        }
        else
        {
            // Event failed.
            // The application handled a failure. (Not shown.)
        }
        return S_OK;
    }
private:
    long    m_cRef;
};

Contoh berikut menunjukkan cara mengatur properti MFPKEY_SourceOpenMonitor pada sumber jaringan saat Anda membuka URL:

HRESULT CreateMediaSourceWithSourceOpenMonitor(
    PCWSTR pszURL, 
    IMFMediaSource **ppSource
    )
{
    IPropertyStore *pConfig = NULL;

    CSourceOpenMonitor *pMonitor = new (std::nothrow) CSourceOpenMonitor();

    if (pMonitor == NULL)
    {
        return E_OUTOFMEMORY;
    }

    // Configure the property store.
    HRESULT hr = PSCreateMemoryPropertyStore(IID_PPV_ARGS(&pConfig));

    if (SUCCEEDED(hr))
    {
        PROPVARIANT var;
        var.vt = VT_UNKNOWN;
        pMonitor->QueryInterface(IID_PPV_ARGS(&var.punkVal));

        hr = pConfig->SetValue(MFPKEY_SourceOpenMonitor, var);

        PropVariantClear(&var);
    }

    // Create the source media source.
    if (SUCCEEDED(hr))
    {
        hr = CreateMediaSource(pszURL, pConfig, ppSource);
    }

    SafeRelease(&pConfig);
    SafeRelease(&pMonitor);

    return hr;
}

Jaringan di Media Foundation