2 * Implements Asynchronous File/URL Source.
4 * Copyright (C) Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #ifndef WINE_DSHOW_ASYNCSRC_H
22 #define WINE_DSHOW_ASYNCSRC_H
27 typedef struct CAsyncSourceImpl CAsyncSourceImpl;
28 typedef struct CAsyncSourcePinImpl CAsyncSourcePinImpl;
29 typedef struct AsyncSourceRequest AsyncSourceRequest;
30 typedef struct AsyncSourceHandlers AsyncSourceHandlers;
32 typedef struct CAsyncReaderImpl
34 ICOM_VFIELD(IAsyncReader);
37 IUnknown* punkControl;
38 /* IAsyncReader fields */
39 CAsyncSourceImpl* pSource;
41 CRITICAL_SECTION m_csReader;
45 HANDLE m_hEventCancel;
46 HANDLE m_hEventReqQueued;
47 HANDLE m_hEventSampQueued;
49 CRITICAL_SECTION m_csRequest;
50 AsyncSourceRequest* m_pRequestFirst;
51 CRITICAL_SECTION m_csReply;
52 AsyncSourceRequest* m_pReplyFirst;
53 CRITICAL_SECTION m_csFree;
54 AsyncSourceRequest* m_pFreeFirst;
57 typedef struct CFileSourceFilterImpl
59 ICOM_VFIELD(IFileSourceFilter);
62 IUnknown* punkControl;
63 /* IFileSourceFilter fields */
64 CAsyncSourceImpl* pSource;
66 CRITICAL_SECTION* pcsFileSource;
67 WCHAR* m_pwszFileName;
70 } CFileSourceFilterImpl;
72 struct CAsyncSourceImpl
75 CBaseFilterImpl basefilter;
76 CFileSourceFilterImpl filesrc;
78 CRITICAL_SECTION csFilter;
79 CAsyncSourcePinImpl* pPin;
80 const AsyncSourceHandlers* m_pHandler;
84 struct CAsyncSourcePinImpl
88 CAsyncReaderImpl async;
89 QUARTZ_IFDelegation qiext;
91 BOOL bAsyncReaderQueried;
92 CAsyncSourceImpl* pSource;
95 struct AsyncSourceRequest
97 AsyncSourceRequest* pNext;
103 IMediaSample* pSample; /* for async req. */
104 DWORD_PTR dwContext; /* for async req. */
107 struct AsyncSourceHandlers
109 /* all handlers MUST be implemented. */
110 HRESULT (*pLoad)( CAsyncSourceImpl* pImpl, LPCWSTR lpwszSourceName );
111 HRESULT (*pCleanup)( CAsyncSourceImpl* pImpl );
112 HRESULT (*pGetLength)( CAsyncSourceImpl* pImpl, LONGLONG* pllTotal, LONGLONG* pllAvailable );
113 /* S_OK = OK / S_FALSE = Canceled / other = error */
114 /* hEventCancel may be NULL */
115 HRESULT (*pRead)( CAsyncSourceImpl* pImpl, LONGLONG llOfsStart, LONG lLength, BYTE* pBuf, LONG* plReturned, HANDLE hEventCancel );
118 #define CAsyncSourceImpl_THIS(iface,member) CAsyncSourceImpl* This = ((CAsyncSourceImpl*)(((char*)iface)-offsetof(CAsyncSourceImpl,member)))
119 #define CAsyncSourcePinImpl_THIS(iface,member) CAsyncSourcePinImpl* This = ((CAsyncSourcePinImpl*)(((char*)iface)-offsetof(CAsyncSourcePinImpl,member)))
122 HRESULT CAsyncReaderImpl_InitIAsyncReader(
123 CAsyncReaderImpl* This, IUnknown* punkControl,
124 CAsyncSourceImpl* pSource );
125 void CAsyncReaderImpl_UninitIAsyncReader(
126 CAsyncReaderImpl* This );
127 HRESULT CFileSourceFilterImpl_InitIFileSourceFilter(
128 CFileSourceFilterImpl* This, IUnknown* punkControl,
129 CAsyncSourceImpl* pSource,
130 CRITICAL_SECTION* pcsFileSource );
131 void CFileSourceFilterImpl_UninitIFileSourceFilter(
132 CFileSourceFilterImpl* This );
135 HRESULT QUARTZ_CreateAsyncSource(
136 IUnknown* punkOuter,void** ppobj,
137 const CLSID* pclsidAsyncSource,
138 LPCWSTR pwszAsyncSourceName,
139 LPCWSTR pwszOutPinName,
140 const AsyncSourceHandlers* pHandler );
141 HRESULT QUARTZ_CreateAsyncSourcePin(
142 CAsyncSourceImpl* pFilter,
143 CRITICAL_SECTION* pcsPin,
144 CAsyncSourcePinImpl** ppPin,
145 LPCWSTR pwszPinName );
148 HRESULT QUARTZ_CreateAsyncReader(IUnknown* punkOuter,void** ppobj);
149 HRESULT QUARTZ_CreateURLReader(IUnknown* punkOuter,void** ppobj);
151 #define ASYNCSRC_FILE_BLOCKSIZE 16384
154 #endif /* WINE_DSHOW_ASYNCSRC_H */