/********************************************************************** Copyright (c) Microsoft Corporation 1994-1996. All Rights Reserved LtcDecode, Ken Greenebaum, November 1996 **********************************************************************/ #ifndef _H_LTCDECODER #define _H_LTCDECODER #include #include "timecode.h" typedef struct bitData { int value; LONGLONG sample; } foo; typedef struct LTCuserBits { int user1:4; int user2:4; int user3:4; int user4:4; int user5:4; int user6:4; int user7:4; int user8:4; } bar; class LTCdecoder { public: LTCdecoder(); // XXX really should spec format, rate... int decodeBuffer(short **buffer, int *bufferSize); int getTimeCode(TimeCode *tc); // convert LTC bits to SMPTE timecode int getUserBits(LTCuserBits *bits); int getStartStopSample(LONGLONG *start, LONGLONG *end); private: int _addBuffer(int bit, LONGLONG sample); // store the bit and detect sync int _bitWidth; // dynamicaly adjusted bit width int _sampleWidth; // length of the state we are sampling int _verticalEpsilon; // how close we have to be to the rail int _waveState; // high or low int _lastBit; // width of last bit (0-long, 1-short, 2-2nd short) // ring buffer bitData _ringBuffer[80];// this is where we keep our bits! int _bufferIndex; int _bitsRecorded; // total number of bits intered (morbid, eh?) LONGLONG _samplesProcessed; // number of audio samples processed int _validTimeCode; // set if the ringBuffer contains a timecode // sync detector int _onesCount; // track number of consequiative ones! (12==sync) LONGLONG _syncSample; // the sample corresponding to the LTC sync LONGLONG _endSample; // the sample corresponding to end of LTC }; #endif /* _H_LTCDECODER */