123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- // ParamEnvelope.h: interface for the CParamEnvelope class.
- //
- //////////////////////////////////////////////////////////////////////
- #if !defined(AFX_PARAMENVELOPE_H__F04D0178_4674_45AF_9F7A_5C8206DE4CF6__INCLUDED_)
- #define AFX_PARAMENVELOPE_H__F04D0178_4674_45AF_9F7A_5C8206DE4CF6__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- ////////////////////////////////////////////////////////////////////////////////
- typedef std::vector<MP_ENVELOPE_SEGMENT> EnvelopeSegs;
- ////////////////////////////////////////////////////////////////////////////////
- struct ParamInfo
- {
- MP_PARAMINFO mppi; // external parameter info, as presented to the user
- float fInternalMin; // minimum value used by internal processing code
- float fInternalMax; // maximum value used by internal processing code
- const WCHAR* pwszEnumText; // text for enumerations
- float MapToInternal( float fValue ) const;
- float MapToExternal( float fValue ) const;
- };
- ////////////////////////////////////////////////////////////////////////////////
- class CParamEnvelope : public CCritSec
- {
- public:
- CParamEnvelope();
- virtual ~CParamEnvelope();
- // Attributes
- public:
- unsigned GetCount() const
- {
- return m_envSegs.size();
- }
- const MP_ENVELOPE_SEGMENT& GetAt( unsigned ix ) const
- {
- return m_envSegs[ ix ];
- }
- // Tell the envelope about the parameter being controlled
- void SetParamInfo( const ParamInfo& info );
- // These methods are called by CMediaParams to manipulate segments in an envelope
- HRESULT AddEnvelope( DWORD cSegments, MP_ENVELOPE_SEGMENT* pEnvelopeSegments, double dSamplesPerRefTime );
- HRESULT FlushEnvelope( REFERENCE_TIME refTimeStart, REFERENCE_TIME refTimeEnd, double dSamplesPerRefTime );
- HRESULT GetEnvelope( DWORD* cSegments, MP_ENVELOPE_SEGMENT* pEnvelopeSegments );
- HRESULT SetParam( float fValue );
- HRESULT GetParam( float* pfValue );
- // Manage UI capture and release
- void BeginCapture() { m_bCaptured = TRUE; }
- void EndCapture() { m_bCaptured = FALSE; }
- // Set the current position, updating current envelope value and deltas
- HRESULT UpdateValuesForRefTime( REFERENCE_TIME rt, long lSampleRate );
- // Check if automation envelopes have been overriden with a specific value
- BOOL IsOverrideActive() const { return m_bOverride || m_bCaptured; }
- // Get the current automation data point
- float GetCurrentValue() const
- {
- if (IsOverrideActive())
- return m_fOverrideValue;
- else
- return m_fEnvelopeValue;
- }
- // Get the current automation deltas (for per-sample rendering)
- HRESULT GetCurrentDeltas( double* pdDelta1, double* pdDelta2 ) const
- {
- if (!m_bValidDeltas)
- return E_FAIL;
- *pdDelta1 = m_dEnvelopeDelta1;
- *pdDelta2 = m_dEnvelopeDelta2;
- return S_OK;
- }
- int IndexForRefTime( REFERENCE_TIME rt ) const;
- private:
- // Stop overriding data
- void stopOverride()
- {
- if (IsOverrideActive() && GetCount() > 0)
- m_bOverride = FALSE;
- }
- // Make sure the automation track is in a state suitable for playback
- void cleanup();
- private:
- ParamInfo m_info; // information about this parameter
- EnvelopeSegs m_envSegs; // the list of envelope segments
- float m_fEnvelopeValue; // our evolving dynamic value
- double m_dEnvelopeDelta1; // 1st delta of current envelope (w.r.t. seconds)
- double m_dEnvelopeDelta2; // 2nd delta of current envelope (w.r.t. seconds)
- BOOL m_bValidDeltas; // TRUE when deltas can be used (e.g. except for sin)
- BOOL m_bOverride; // TRUE while automation point value is overridden
- BOOL m_bCaptured; // TRUE while the captured by the UI
- float m_fOverrideValue; // our override value
- REFERENCE_TIME m_rtRendered; // latest time rendered so far
- private:
- CParamEnvelope( const CParamEnvelope& );
- CParamEnvelope& operator=( const CParamEnvelope& );
- };
- ////////////////////////////////////////////////////////////////////////////////
- #endif // !defined(AFX_PARAMENVELOPE_H__F04D0178_4674_45AF_9F7A_5C8206DE4CF6__INCLUDED_)
|