Come ottenere eventi dall'origine di rete
Il resolver di origine consente a un'applicazione di creare un'origine di rete e aprire una connessione a un URL specifico. L'origine di rete genera eventi per contrassegnare l'inizio e la fine dell'operazione asincrona di apertura di una connessione. Un'applicazione può eseguire la registrazione per questi eventi usando l'interfaccia IMFSourceOpenMonitor .
Questa interfaccia espone il metodo IMFSourceOpenMonitor::OnSourceEvent che l'origine di rete chiama direttamente quando apre l'URL in modo asincrono. L'origine di rete invia una notifica all'applicazione all'avvio dell'apertura dell'URL generando l'evento MEConnectStart . L'origine di rete genera quindi l'evento MEConnectEnd al termine dell'operazione di apertura.
Nota
Per inviare questi eventi all'applicazione, l'origine di rete non usa l'interfaccia IMFMediaEventGenerator perché questi eventi vengono generati prima della creazione dell'origine di rete. L'applicazione può ottenere tutti gli altri eventi di origine di rete usando l'interfaccia IMFMediaEventGenerator della sessione multimediale.
Per ottenere eventi dall'origine di rete
- Implementare l'interfaccia IMFSourceOpenMonitor . Nell'implementazione del metodo IMFSourceOpenMonitor::OnSourceEvent eseguire le operazioni seguenti:
- Ottenere lo stato dell'evento chiamando IMFMediaEvent::GetStatus. Questo metodo indica se l'operazione che ha attivato l'evento, ad esempio una chiamata al metodo resolver di origine, ha avuto esito positivo. Se l'operazione non riesce, lo stato è un codice di errore.
- Elaborare l'evento in base al tipo di evento : MEConnectStart o MEConnectEnd, che l'applicazione può ottenere chiamando IMFMediaEvent::GetType.
- Configurare una coppia chiave-valore in un oggetto archivio proprietà per archiviare un puntatore all'implementazione IMFSourceOpenMonitor descritta nel passaggio 1.
- Creare un oggetto archivio proprietà chiamando la funzione PSCreateMemoryPropertyStore .
- Impostare la proprietà MFPKEY_SourceOpenMonitor in una struttura PROPERTYKEY .
- Specificare il valore di dati del tipo VT_UNKNOWN in una struttura PROPVARIANT impostando il puntatore IUnknown sull'implementazione dell'applicazione dell'interfaccia IMFSourceOpenMonitor .
- Impostare la coppia chiave-valore nell'archivio delle proprietà chiamando IPropertyStore::SetValue.
- Passare il puntatore dell'archivio delle proprietà ai metodi resolver di origine usati dall'applicazione per creare l'origine di rete, ad esempio IMFSourceResolver::CreateObjectFromURL e altri.
Esempio
Nell'esempio seguente viene illustrato come implementare l'interfaccia IMFSourceOpenMonitor per ottenere eventi dall'origine di rete.
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;
};
Nell'esempio seguente viene illustrato come impostare la proprietà MFPKEY_SourceOpenMonitor nell'origine di rete quando si apre l'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;
}
Argomenti correlati