windows-nt/Source/XPSP1/NT/multimedia/directx/dsound/dsdmo/dsdmobse.cpp
2020-09-26 16:20:57 +08:00

269 lines
6.2 KiB
C++

/*
* DirectSound DirectMediaObject base classes
*
* Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
*/
#include "DsDmoBse.h"
#include "debug.h"
#include <devioctl.h>
#include <ks.h>
#include <ksmedia.h>
struct KSMEDIAPARAM
{
KSNODEPROPERTY ksnp;
ULONG ulIndex; // Instance data is index of parameter
};
static BOOL SyncIoctl(
IN HANDLE handle,
IN ULONG ulIoctl,
IN PVOID pvInBuffer OPTIONAL,
IN ULONG ulInSize,
OUT PVOID pvOutBuffer OPTIONAL,
IN ULONG ulOutSize,
OUT PULONG pulBytesReturned);
// XXX C1in1out calls InitializeCriticalSection in a constructor with
// no handler.
//
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::CDirectSoundDMO
//
CDirectSoundDMO::CDirectSoundDMO()
{
m_mpvCache = NULL;
m_fInHardware = false;
m_pKsPropertySet = NULL;
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::~CDirectSoundDMO
//
CDirectSoundDMO::~CDirectSoundDMO()
{
delete[] m_mpvCache;
m_mpvCache = NULL;
m_fInHardware = false;
RELEASE(m_pKsPropertySet);
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::GetClassID
//
// This should always return E_NOTIMPL
//
STDMETHODIMP CDirectSoundDMO::GetClassID(THIS_ CLSID *pClassID)
{
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::IsDirty
//
// Override if doing something other than just standard save.
//
STDMETHODIMP CDirectSoundDMO::IsDirty(THIS)
{
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::Load
//
// Override if doing something other than just standard load.
//
STDMETHODIMP CDirectSoundDMO::Load(THIS_ IStream *pStm)
{
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::Save
//
// Override if doing something other than just standard save.
//
STDMETHODIMP CDirectSoundDMO::Save(THIS_ IStream *pStm, BOOL fClearDirty)
{
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::GetSizeMax
//
// Override if doing something other than just standard save.
//
STDMETHODIMP CDirectSoundDMO::GetSizeMax(THIS_ ULARGE_INTEGER *pcbSize)
{
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::Process
//
STDMETHODIMP CDirectSoundDMO::Process(THIS_ ULONG ulSize, BYTE *pData, REFERENCE_TIME rtStart, DWORD dwFlags)
{
DMO_MEDIA_TYPE *pmt = InputType();
if (pmt == NULL)
return E_FAIL;
assert(pmt->formattype == FORMAT_WaveFormatEx);
ulSize /= LPWAVEFORMATEX(pmt->pbFormat)->nBlockAlign;
return ProcessInPlace(ulSize, pData, rtStart, dwFlags);
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::GetLatency
//
STDMETHODIMP CDirectSoundDMO::GetLatency(THIS_ REFERENCE_TIME *prt)
{
*prt = 0;
return S_OK;
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::AcquireResources
//
// Override if doing something other than just standard save.
//
STDMETHODIMP CDirectSoundDMO::AcquireResources(THIS_ IKsPropertySet *pKsPropertySet)
{
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::ReleaseResources
//
// Override if doing something other than just standard save.
//
STDMETHODIMP CDirectSoundDMO::ReleaseResources(THIS_)
{
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::InitializeNode
//
// Override if doing something other than just standard save.
//
STDMETHODIMP CDirectSoundDMO::InitializeNode(THIS_ HANDLE hPin, ULONG ulNodeId)
{
m_hPin = hPin;
m_ulNodeId = ulNodeId;
return S_OK;
}
#if 0
// FIXME: no longer in medparam.idl
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::GetParams
//
STDMETHODIMP CDirectSoundDMO::GetParams(THIS_ DWORD dwParamIndexStart, DWORD *pdwNumParams, MP_DATA **ppValues)
{
HRESULT hr;
if (dwParamIndexStart >= ParamCount())
{
// XXX Real error code
//
return E_FAIL;
}
DWORD dw;
DWORD dwParamIndexEnd = dwParamIndexStart + *pdwNumParams;
for (dw = dwParamIndexStart; dw < dwParamIndexEnd; dw++)
{
if (dw >= ParamCount())
{
*pdwNumParams = dw - dwParamIndexStart;
return S_FALSE;
}
hr = GetParam(dw, ppValues[dw]);
if (FAILED(hr))
{
*pdwNumParams = dw - dwParamIndexStart;
return hr;
}
}
return S_OK;
}
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::SetParams
//
STDMETHODIMP CDirectSoundDMO::SetParams(THIS_ DWORD dwParamIndexStart, DWORD *pdwNumParams, MP_DATA __RPC_FAR *pValues)
{
HRESULT hr;
if (dwParamIndexStart >= ParamCount())
{
// XXX Real error code
//
return E_FAIL;
}
DWORD dw;
DWORD dwParamIndexEnd = dwParamIndexStart + *pdwNumParams;
for (dw = dwParamIndexStart; dw < dwParamIndexEnd; dw++)
{
if (dw >= ParamCount())
{
*pdwNumParams = dw - dwParamIndexStart;
return S_FALSE;
}
hr = SetParam(dw, pValues[dw]);
if (FAILED(hr))
{
*pdwNumParams = dw - dwParamIndexStart;
return hr;
}
}
return S_OK;
}
#endif
//////////////////////////////////////////////////////////////////////////////
//
// CDirectSoundDMO::ProxySetParam
//
HRESULT CDirectSoundDMO::ProxySetParam(DWORD dwParamIndex, MP_DATA value)
{
assert(m_pKsPropertySet);
return m_pKsPropertySet->Set(
IID_IMediaParams, 0, // Set, item
&dwParamIndex, sizeof(dwParamIndex), // Instance data
&value, sizeof(value)); // Property data
}