/* * DirectSound DirectMediaObject base classes * * Copyright (c) 1999 Microsoft Corporation. All Rights Reserved. */ #include "DsDmoBse.h" #include "debug.h" #include #include #include 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 }