124 lines
3.3 KiB
C++
124 lines
3.3 KiB
C++
/*
|
|
** Command & Conquer Generals(tm)
|
|
** Copyright 2025 Electronic Arts Inc.
|
|
**
|
|
** This program is free software: you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation, either version 3 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
|
|
#ifndef SIMPLEPLAYER_H
|
|
#define SIMPLEPLAYER_H
|
|
|
|
#include "wmsdk.h"
|
|
|
|
//
|
|
// we preserve a list of "ready-to-free" list of wave headers for the
|
|
// caller to unprepare and free
|
|
//
|
|
typedef struct WAVEHDR_LIST {
|
|
LPWAVEHDR pwh;
|
|
struct WAVEHDR_LIST *next;
|
|
} WAVEHDR_LIST;
|
|
|
|
#define SIMPLE_PLAYER_OPEN_EVENT _T( "45ab58e0-382e-4d1c-ac50-88a5f9601851" )
|
|
#define SIMPLE_PLAYER_CLOSE_EVENT _T( "276095fa-a8e0-48e6-ac61-8b0002345607" )
|
|
#define WMAPLAY_EVENT _T( "9e828a72-64f3-48f0-9de8-13dafd0cbd3a" )
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
class CSimplePlayer : public IWMReaderCallback
|
|
{
|
|
public:
|
|
CSimplePlayer( HRESULT* phr );
|
|
~CSimplePlayer();
|
|
|
|
virtual HRESULT Play( LPCWSTR pszUrl, DWORD dwSecDuration, HANDLE hCompletionEvent, HRESULT *phrCompletion );
|
|
|
|
//
|
|
// IUnknown Implemenation
|
|
//
|
|
public:
|
|
virtual HRESULT STDMETHODCALLTYPE QueryInterface(
|
|
REFIID riid,
|
|
void **ppvObject );
|
|
|
|
virtual ULONG STDMETHODCALLTYPE AddRef();
|
|
virtual ULONG STDMETHODCALLTYPE Release();
|
|
|
|
//
|
|
// IWMReaderCallback Implemenation
|
|
//
|
|
public:
|
|
virtual 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);
|
|
|
|
virtual 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);
|
|
|
|
//
|
|
// Helper Methods
|
|
//
|
|
protected:
|
|
|
|
HRESULT Close();
|
|
|
|
void OnWaveOutMsg( UINT uMsg, DWORD dwParam1, DWORD dwParam2 );
|
|
|
|
static void CALLBACK WaveProc(
|
|
HWAVEOUT hwo,
|
|
UINT uMsg,
|
|
DWORD dwInstance,
|
|
DWORD dwParam1,
|
|
DWORD dwParam2 );
|
|
|
|
HRESULT AddWaveHeader( LPWAVEHDR pwh );
|
|
void RemoveWaveHeaders( void );
|
|
|
|
CRITICAL_SECTION m_CriSec;
|
|
WAVEHDR_LIST *m_whdrHead;
|
|
|
|
LONG m_cRef;
|
|
LONG m_cBuffersOutstanding;
|
|
BOOL m_fEof;
|
|
HANDLE m_hCompletionEvent;
|
|
|
|
IWMReader *m_pReader;
|
|
IWMHeaderInfo *m_pHeader;
|
|
HWAVEOUT m_hwo;
|
|
|
|
HRESULT *m_phrCompletion;
|
|
|
|
HRESULT m_hrOpen;
|
|
HANDLE m_hOpenEvent;
|
|
HANDLE m_hCloseEvent;
|
|
|
|
union
|
|
{
|
|
WAVEFORMATEX m_wfx;
|
|
BYTE m_WfxBuf[1024];
|
|
};
|
|
|
|
LPWSTR m_pszUrl;
|
|
|
|
};
|
|
|
|
#endif // SIMPLEPLAYER_H
|