00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #pragma once
00032
00033 #include "dsfNativeFLACSource.h"
00034 #include "NativeFLACSourcePin.h"
00035
00036
00037 #include "FLAC++/decoder.h"
00038 #include <libilliCore/StringHelper.h>
00039 #include <libilliCore/iBE_Math.h>
00040 using namespace FLAC::Decoder;
00041
00042
00043 #include <string>
00044 using namespace std;
00045
00046
00047 class NativeFLACSourcePin;
00048
00049 class NativeFLACSourceFilter
00050
00051 : public CBaseFilter
00052 , public IFileSourceFilter
00053 , public IAMFilterMiscFlags
00054 , public IMediaSeeking
00055 , public CAMThread
00056 , protected FLAC::Decoder::SeekableStream
00057 {
00058 public:
00059
00060 friend class NativeFLACSourcePin;
00061
00062
00063 enum eThreadCommands {
00064 THREAD_EXIT = 0,
00065 THREAD_PAUSE = 1,
00066 THREAD_RUN = 2
00067 };
00068
00069
00070 DECLARE_IUNKNOWN
00071 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
00072 static CUnknown* WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr);
00073
00074
00075 NativeFLACSourceFilter(void);
00076 virtual ~NativeFLACSourceFilter(void);
00077
00078
00079 virtual int GetPinCount();
00080 virtual CBasePin* GetPin(int inPinNo);
00081
00082
00083 ULONG STDMETHODCALLTYPE GetMiscFlags(void);
00084
00085
00086 virtual STDMETHODIMP GetCurFile(LPOLESTR* outFileName, AM_MEDIA_TYPE* outMediaType);
00087 virtual STDMETHODIMP Load(LPCOLESTR inFileName, const AM_MEDIA_TYPE* inMediaType);
00088
00089
00090 STDMETHODIMP Run(REFERENCE_TIME tStart);
00091 STDMETHODIMP Pause(void);
00092 STDMETHODIMP Stop(void);
00093
00094
00095 virtual DWORD ThreadProc(void);
00096
00097
00098 virtual ::FLAC__SeekableStreamDecoderReadStatus read_callback(FLAC__byte outBuffer[], unsigned int* outNumBytes);
00099 virtual ::FLAC__SeekableStreamDecoderSeekStatus seek_callback(FLAC__uint64 inSeekPos);
00100 virtual ::FLAC__SeekableStreamDecoderTellStatus tell_callback(FLAC__uint64* outTellPos);
00101 virtual ::FLAC__SeekableStreamDecoderLengthStatus length_callback(FLAC__uint64* outLength);
00102 virtual ::FLAC__StreamDecoderWriteStatus write_callback(const FLAC__Frame* outFrame,const FLAC__int32 *const outBuffer[]);
00103 virtual void metadata_callback(const FLAC__StreamMetadata* inMetaData);
00104 virtual void error_callback(FLAC__StreamDecoderErrorStatus inStatus);
00105 virtual bool eof_callback(void);
00106
00107
00108 virtual STDMETHODIMP GetCapabilities(DWORD *pCapabilities);
00109 virtual STDMETHODIMP CheckCapabilities(DWORD *pCapabilities);
00110 virtual STDMETHODIMP IsFormatSupported(const GUID *pFormat);
00111 virtual STDMETHODIMP QueryPreferredFormat(GUID *pFormat);
00112 virtual STDMETHODIMP SetTimeFormat(const GUID *pFormat);
00113 virtual STDMETHODIMP GetTimeFormat( GUID *pFormat);
00114 virtual STDMETHODIMP GetDuration(LONGLONG *pDuration);
00115 virtual STDMETHODIMP GetStopPosition(LONGLONG *pStop);
00116 virtual STDMETHODIMP GetCurrentPosition(LONGLONG *pCurrent);
00117 virtual STDMETHODIMP ConvertTimeFormat(LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat);
00118 virtual STDMETHODIMP SetPositions(LONGLONG *pCurrent,DWORD dwCurrentFlags,LONGLONG *pStop,DWORD dwStopFlags);
00119 virtual STDMETHODIMP GetPositions(LONGLONG *pCurrent, LONGLONG *pStop);
00120 virtual STDMETHODIMP GetAvailable(LONGLONG *pEarliest, LONGLONG *pLatest);
00121 virtual STDMETHODIMP SetRate(double dRate);
00122 virtual STDMETHODIMP GetRate(double *dRate);
00123 virtual STDMETHODIMP GetPreroll(LONGLONG *pllPreroll);
00124 virtual STDMETHODIMP IsUsingTimeFormat(const GUID *pFormat);
00125
00126 protected:
00127
00128 HRESULT DataProcessLoop();
00129
00130
00131 NativeFLACSourcePin* mFLACSourcePin;
00132
00133
00134 wstring mFileName;
00135 fstream mInputFile;
00136 unsigned long mFileSize;
00137
00138
00139 bool mBegun;
00140 bool mJustSeeked;
00141 __int64 mSeekRequest;
00142 bool mWasEOF;
00143 unsigned long mUpto;
00144
00145
00146 unsigned long mNumChannels;
00147 unsigned long mFrameSize;
00148 unsigned long mSampleRate;
00149 unsigned long mBitsPerSample;
00150 __int64 mTotalNumSamples;
00151
00152
00153 CCritSec* mCodecLock;
00154
00155 };