xref: /haiku/src/add-ons/kernel/drivers/audio/echo/generic/CMtcSync.h (revision 626bc4bee107897c38c596c3440cf0a74b4b9c40)
1 // ****************************************************************************
2 //
3 //		CMtcSync.h
4 //
5 //		Include file for interfacing with the CMtcSync class.
6 //
7 //		This class manages syncing to MIDI time code.
8 //
9 //		Set editor tabs to 3 for your viewing pleasure.
10 //
11 // ----------------------------------------------------------------------------
12 //
13 // This file is part of Echo Digital Audio's generic driver library.
14 // Copyright Echo Digital Audio Corporation (c) 1998 - 2005
15 // All rights reserved
16 // www.echoaudio.com
17 //
18 // This library is free software; you can redistribute it and/or
19 // modify it under the terms of the GNU Lesser General Public
20 // License as published by the Free Software Foundation; either
21 // version 2.1 of the License, or (at your option) any later version.
22 //
23 // This library is distributed in the hope that it will be useful,
24 // but WITHOUT ANY WARRANTY; without even the implied warranty of
25 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
26 // Lesser General Public License for more details.
27 //
28 // You should have received a copy of the GNU Lesser General Public
29 // License along with this library; if not, write to the Free Software
30 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
31 //
32 // ****************************************************************************
33 
34 //	Prevent problems with multiple includes
35 #ifndef _MTCQUEUEOBJECT_
36 #define _MTCQUEUEOBJECT_
37 
38 typedef struct tMTC_DATA
39 {
40 	DWORD	dwData;			// DWORD here wastes memory, but is easier to debug...
41 	DWORD dwTimestamp;	// Timestamp in terms of the DSP sample count
42 } MTC_DATA;
43 
44 
45 //
46 //	CMtcSync
47 //
48 class CMtcSync
49 {
50 public:
51 	//
52 	//	Construction/destruction
53 	//
54 	CMtcSync( CEchoGals *pEG );
55 	~CMtcSync();
56 
57 	//
58 	// Methods used to store MTC data & timestamps
59 	//
60 	void StoreTimestampHigh(DWORD dwData);
61 	void StoreTimestampLow(DWORD dwData);
62 	void StoreMtcData(DWORD dwData);
63 
64 	//
65 	// Call this to process the MTC data and adjust the sample rate
66 	//
67 	void Sync();
68 
69 	//
70 	//	Reset the state of things
71 	//
72 	void Reset();
73 
74 	//
75 	//  Overload new & delete so memory for this object is allocated from non-paged memory.
76 	//
77 	PVOID operator new( size_t Size );
78 	VOID  operator delete( PVOID pVoid );
79 
80 protected:
81 
82 	enum	// Quarter-frame message types
83 	{
84 		MTC_QF_FRAME_LSN = 0,
85 		MTC_QF_FRAME_MSN,
86 		MTC_QF_SECOND_LSN,
87 		MTC_QF_SECOND_MSN,
88 		MTC_QF_MINUTE_LSN,
89 		MTC_QF_MINUTE_MSN,
90 		MTC_QF_HOUR_LSN,
91 		MTC_QF_HOUR_MSN,
92 
93 		MTC_TOLERANCE		= 64,
94 		MTC_DAMPING			= 98 * 0x1000 / 100,	// 95% in 12 bit fixed point
95 
96 		MAX_DFRAME_SYNC_COUNT	= 4096,
97 
98 		DAMPING_RATIO_LIMIT_LOW	 = 4096 - 16,
99 		DAMPING_RATIO_LIMIT_HIGH = 4096 + 16
100 	};
101 
102 	//
103 	//	Midi buffer management
104 	//
105 	MTC_DATA 	m_Buffer[ ECHO_MTC_QUEUE_SZ ];
106 	DWORD			m_dwFill;
107 	DWORD			m_dwDrain;
108 
109 	//
110 	// State information
111 	//
112 	DWORD			m_dwBaseSampleRate;
113 
114 	DWORD			m_dwLastDframeTimestamp;	// Timestamp of last double frame
115 														// in units of samples
116 
117 	DWORD			m_iSamplesPerDframe;
118 	DWORD			m_dwFramesPerSec;
119 
120 	DWORD			m_dwLastDframe;				// Last doubleframe number
121 	DWORD			m_dwCurrentDframe;			// Doubleframe number currently being assembled
122 														// from MTC data bytes
123 
124 	DWORD			m_iNumDframesSynced;			// How many frames have elapsed since the
125 														// last sample rate adjustment
126 
127 	INT32			m_iNumSamplesSynced;			// Sum of all actual timestamp deltas since
128 														// last sample rate adjustment
129 	DWORD			m_dwNextQfType;
130 
131 	DWORD			m_dwTemp;
132 
133 	//
134 	// Other stuff
135 	//
136 	CEchoGals 	*m_pEG;
137 
138 	friend class CMidiInQ;
139 
140 };		// class CMtcSync
141 
142 typedef CMtcSync * PCMtcSync;
143 
144 #endif
145 
146 // *** CMtcSync.H ***
147