HRESULT CParamsManager::FlushEnvelope( DWORD dwParamIndex, REFERENCE_TIME refTimeStart, REFERENCE_TIME refTimeEnd) { if (dwParamIndex >= m_cParams) return E_INVALIDARG; if (!m_pParamInfos) return DMUS_E_NOT_INIT; if (refTimeStart >= refTimeEnd) return E_INVALIDARG; EnterCriticalSection(&m_ParamsCriticalSection); m_fDirty = TRUE; CCurveList *pList = &m_pCurveLists[dwParamIndex]; CCurveList TempList; CCurveItem *pCurve; while ((pCurve = pList->RemoveHead()) != 0) { if ((pCurve->m_Envelope.rtStart >= refTimeStart) && (pCurve->m_Envelope.rtEnd <= refTimeEnd)) { delete pCurve; } else { TempList.AddHead(pCurve); } } while ((pCurve = TempList.RemoveHead()) != 0) { pList->AddHead(pCurve); } LeaveCriticalSection(&m_ParamsCriticalSection); return S_OK; }
HRESULT CParamsManager::AddEnvelope( DWORD dwParamIndex, DWORD cPoints, MP_ENVELOPE_SEGMENT *ppEnvelope) { V_INAME(CParams::AddEnvelope); V_PTR_READ(ppEnvelope, *ppEnvelope); if (dwParamIndex >= m_cParams) return E_INVALIDARG; if (!m_pParamInfos) return DMUS_E_NOT_INIT; HRESULT hr = S_OK; EnterCriticalSection(&m_ParamsCriticalSection); m_fDirty = TRUE; CCurveList *pList = &m_pCurveLists[dwParamIndex]; ParamInfo *pInfo = &m_pParamInfos[dwParamIndex]; DWORD dwCount; for (dwCount = 0; dwCount < cPoints; dwCount++) { CCurveItem *pCurve = new CCurveItem; if (!pCurve) { hr = E_OUTOFMEMORY; break; } pCurve->m_Envelope = ppEnvelope[dwCount]; pCurve->m_Envelope.valEnd = ValRange(pCurve->m_Envelope.valEnd, pInfo->MParamInfo.mpdMinValue, pInfo->MParamInfo.mpdMaxValue); pCurve->m_Envelope.valStart = ValRange(pCurve->m_Envelope.valStart, pInfo->MParamInfo.mpdMinValue, pInfo->MParamInfo.mpdMaxValue); pList->AddHead(pCurve); // next call to UpdateActiveParams will ensure the parameter's value is recalculated m_dwActiveBits |= 1 << dwParamIndex; //TraceI(6, "DMO envelope: time %I64d-%I64d, param #%d, value %hf-%hf\n", // pCurve->m_Envelope.rtStart, pCurve->m_Envelope.rtEnd, // dwParamIndex, pCurve->m_Envelope.valStart, pCurve->m_Envelope.valEnd); } LeaveCriticalSection(&m_ParamsCriticalSection); return hr; }
HRESULT CParamsManager::SetParam(DWORD dwParamIndex,MP_DATA value) { V_INAME(CParams::SetParam); if (dwParamIndex >= m_cParams) return E_INVALIDARG; EnterCriticalSection(&m_ParamsCriticalSection); m_fDirty = TRUE; CCurveList *pList = &m_pCurveLists[dwParamIndex]; // ParamInfo *pInfo = &m_pParamInfos[dwParamIndex]; // If we've already got a list, just force the most recent curve item to this value. // Otherwise, create a node and add it. CCurveItem *pCurve = pList->GetHead(); if (!pCurve) { pCurve = new CCurveItem; if (pCurve) { pCurve->m_Envelope.rtStart = 0x8000000000000000; // Max negative. pCurve->m_Envelope.rtEnd = 0x7FFFFFFFFFFFFFFF; // Max positive. pCurve->m_Envelope.flags = 0; pList->AddHead(pCurve); } else { LeaveCriticalSection(&m_ParamsCriticalSection); return E_OUTOFMEMORY; } } pCurve->m_Envelope.valStart = value; pCurve->m_Envelope.valEnd = value; pCurve->m_Envelope.iCurve = MP_CURVE_JUMP; LeaveCriticalSection(&m_ParamsCriticalSection); return S_OK; }