2025-11-28 00:35:46 +09:00

167 lines
4.8 KiB
C++

//*****************************************************************************
//
// Microsoft Windows Media
// Copyright ( C) Microsoft Corporation. All rights reserved.
//
// FileName: NetWrite.cpp
//
// Abstract: CNetWrite class declaration
//
//
//*****************************************************************************
#pragma once
#include "wmsdk.h"
#ifndef SAFE_RELEASE
#define SAFE_RELEASE( x ) \
if( NULL != x ) \
{ \
x->Release( ); \
x = NULL; \
}
#endif
#ifndef SAFE_DELETE
#define SAFE_DELETE( x ) \
if( NULL != x ) \
{ \
delete x; \
x = NULL; \
}
#endif
#ifndef SAFE_ARRAYDELETE
#define SAFE_ARRAYDELETE( x ) \
if( NULL != x ) \
{ \
delete[] x; \
x = NULL; \
}
#endif
#define NETWRITE_ASYNC_EVENT _T( "6d12fe9b-d029-4d08-b2eb-92c8cab323c7" )
class CNetWrite :public IWMReaderCallback, public IWMReaderCallbackAdvanced
{
public:
CNetWrite();
~CNetWrite();
HRESULT Configure( DWORD dwPortNum, const WCHAR *pwszFile, UINT nMaxClient, const WCHAR *pwszServerURL );
HRESULT WritetoNet();
HRESULT Init();
//
//Methods of IWMReaderCallback
//
HRESULT STDMETHODCALLTYPE OnSample( /* [in] */ DWORD dwOutputNum,
/* [in] */ QWORD cnsSampleTime,
/* [in] */ QWORD cnsSampleDuration,
/* [in] */ DWORD dwFlags,
/* [in] */ INSSBuffer __RPC_FAR *pSample,
/* [in] */ void __RPC_FAR *pvContext);
HRESULT STDMETHODCALLTYPE OnStatus( /* [in] */ WMT_STATUS Status,
/* [in] */ HRESULT hr,
/* [in] */ WMT_ATTR_DATATYPE dwType,
/* [in] */ BYTE __RPC_FAR *pValue,
/* [in] */ void __RPC_FAR *pvContext);
//
//Methods of IWMReaderCallbackAdvanced
//
HRESULT STDMETHODCALLTYPE OnStreamSample( /* [in] */ WORD wStreamNum,
/* [in] */ QWORD cnsSampleTime,
/* [in] */ QWORD cnsSampleDuration,
/* [in] */ DWORD dwFlags,
/* [in] */ INSSBuffer __RPC_FAR *pSample,
/* [in] */ void __RPC_FAR *pvContext);
HRESULT STDMETHODCALLTYPE OnTime( /* [in] */ QWORD cnsCurrentTime,
/* [in] */ void __RPC_FAR *pvContext);
HRESULT STDMETHODCALLTYPE OnStreamSelection( /* [in] */ WORD wStreamCount,
/* [in] */ WORD __RPC_FAR *pStreamNumbers,
/* [in] */ WMT_STREAM_SELECTION __RPC_FAR *pSelections,
/* [in] */ void __RPC_FAR *pvContext)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE OnOutputPropsChanged( /* [in] */ DWORD dwOutputNum,
/* [in] */ WM_MEDIA_TYPE __RPC_FAR *pMediaType,
/* [in] */ void __RPC_FAR *pvContext)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE AllocateForStream( /* [in] */ WORD wStreamNum,
/* [in] */ DWORD cbBuffer,
/* [out] */ INSSBuffer __RPC_FAR *__RPC_FAR *ppBuffer,
/* [in] */ void __RPC_FAR *pvContext)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE AllocateForOutput( /* [in] */ DWORD dwOutputNum,
/* [in] */ DWORD cbBuffer,
/* [out] */ INSSBuffer __RPC_FAR *__RPC_FAR *ppBuffer,
/* [in] */ void __RPC_FAR *pvContext)
{
return E_NOTIMPL;
}
//
//Methods of IUnknown
//
HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid,
void __RPC_FAR *__RPC_FAR *ppvObject)
{
if( riid == IID_IWMReaderCallback )
{
*ppvObject = ( IWMReaderCallback* )this;
}
else if( riid == IID_IWMReaderCallbackAdvanced )
{
*ppvObject = ( IWMReaderCallbackAdvanced* )this;
}
else if( riid == IID_IWMStatusCallback )
{
*ppvObject = ( IWMStatusCallback* )this;
}
else
{
*ppvObject = NULL;
return E_NOINTERFACE;
}
return S_OK;
}
ULONG STDMETHODCALLTYPE AddRef( void ) { return 1; }
ULONG STDMETHODCALLTYPE Release( void ) { return 1; }
private:
HRESULT WriteHeader( const WCHAR * pwszName );
HRESULT WriteScript();
private:
HANDLE m_hEvent; // Event for handling asynchronous calls
HRESULT m_hrAsync; // Receives error or success codes for asynchronous operations.
QWORD m_qwTime; // Specifies the time interval for the next batch of samples.
// Miscellaneous interfaces that we need.
IWMWriterAdvanced* m_pWriterAdvanced;
IWMReaderAdvanced* m_pReaderAdvanced;
IWMReader* m_pReader;
IWMWriter* m_pWriter;
IWMWriterNetworkSink* m_pNetSink;
IWMWriterPushSink* m_pPushSink;
IWMRegisterCallback* m_pPushSinkCallbackCtrl;
bool m_bEOF;
IWMHeaderInfo* m_pReaderHeaderInfo;
IWMHeaderInfo* m_pWriterHeaderInfo;
};