Fixed some deadlocks.
[wine] / dlls / quartz / asyncsrc.h
1 /*
2  * Implements Asynchronous File/URL Source.
3  *
4  * hidenori@a2.ctktv.ne.jp
5  */
6
7 #ifndef WINE_DSHOW_ASYNCSRC_H
8 #define WINE_DSHOW_ASYNCSRC_H
9
10 #include "iunk.h"
11 #include "basefilt.h"
12
13 typedef struct CAsyncSourceImpl CAsyncSourceImpl;
14 typedef struct CAsyncSourcePinImpl      CAsyncSourcePinImpl;
15 typedef struct AsyncSourceRequest       AsyncSourceRequest;
16 typedef struct AsyncSourceHandlers      AsyncSourceHandlers;
17
18 typedef struct CAsyncReaderImpl
19 {
20         ICOM_VFIELD(IAsyncReader);
21
22         /* IUnknown fields */
23         IUnknown*       punkControl;
24         /* IAsyncReader fields */
25         CAsyncSourceImpl*       pSource;
26
27         CRITICAL_SECTION        m_csReader;
28         BOOL    m_bInFlushing;
29         BOOL    m_bAbortThread;
30         HANDLE  m_hEventInit;
31         HANDLE  m_hEventCancel;
32         HANDLE  m_hEventReqQueued;
33         HANDLE  m_hEventSampQueued;
34         HANDLE  m_hThread;
35         CRITICAL_SECTION        m_csRequest;
36         AsyncSourceRequest*     m_pRequestFirst;
37         CRITICAL_SECTION        m_csReply;
38         AsyncSourceRequest*     m_pReplyFirst;
39         CRITICAL_SECTION        m_csFree;
40         AsyncSourceRequest*     m_pFreeFirst;
41 } CAsyncReaderImpl;
42
43 typedef struct CFileSourceFilterImpl
44 {
45         ICOM_VFIELD(IFileSourceFilter);
46
47         /* IUnknown fields */
48         IUnknown*       punkControl;
49         /* IFileSourceFilter fields */
50         CAsyncSourceImpl*       pSource;
51
52         CRITICAL_SECTION*       pcsFileSource;
53         WCHAR*  m_pwszFileName;
54         DWORD   m_cbFileName;
55         AM_MEDIA_TYPE   m_mt;
56 } CFileSourceFilterImpl;
57
58 struct CAsyncSourceImpl
59 {
60         QUARTZ_IUnkImpl unk;
61         CBaseFilterImpl basefilter;
62         CFileSourceFilterImpl   filesrc;
63
64         CRITICAL_SECTION        csFilter;
65         CAsyncSourcePinImpl*    pPin;
66         const AsyncSourceHandlers*      m_pHandler;
67         void*   m_pUserData;
68 };
69
70 struct CAsyncSourcePinImpl
71 {
72         QUARTZ_IUnkImpl unk;
73         CPinBaseImpl    pin;
74         CAsyncReaderImpl        async;
75         QUARTZ_IFDelegation     qiext;
76
77         BOOL    bAsyncReaderQueried;
78         CAsyncSourceImpl*       pSource;
79 };
80
81 struct AsyncSourceRequest
82 {
83         AsyncSourceRequest*     pNext;
84
85         LONGLONG        llStart;
86         LONG    lLength;
87         LONG    lActual;
88         BYTE*   pBuf;
89         IMediaSample*   pSample; /* for async req. */
90         DWORD_PTR       dwContext; /* for async req. */
91 };
92
93 struct AsyncSourceHandlers
94 {
95         /* all handlers MUST be implemented. */
96         HRESULT (*pLoad)( CAsyncSourceImpl* pImpl, LPCWSTR lpwszSourceName );
97         HRESULT (*pCleanup)( CAsyncSourceImpl* pImpl );
98         HRESULT (*pGetLength)( CAsyncSourceImpl* pImpl, LONGLONG* pllTotal, LONGLONG* pllAvailable );
99         /* S_OK = OK / S_FALSE = Canceled / other = error */
100         /* hEventCancel may be NULL */
101         HRESULT (*pRead)( CAsyncSourceImpl* pImpl, LONGLONG llOfsStart, LONG lLength, BYTE* pBuf, LONG* plReturned, HANDLE hEventCancel );
102 };
103
104 #define CAsyncSourceImpl_THIS(iface,member)             CAsyncSourceImpl*       This = ((CAsyncSourceImpl*)(((char*)iface)-offsetof(CAsyncSourceImpl,member)))
105 #define CAsyncSourcePinImpl_THIS(iface,member)          CAsyncSourcePinImpl*    This = ((CAsyncSourcePinImpl*)(((char*)iface)-offsetof(CAsyncSourcePinImpl,member)))
106
107
108 HRESULT CAsyncReaderImpl_InitIAsyncReader(
109         CAsyncReaderImpl* This, IUnknown* punkControl,
110         CAsyncSourceImpl* pSource );
111 void CAsyncReaderImpl_UninitIAsyncReader(
112         CAsyncReaderImpl* This );
113 HRESULT CFileSourceFilterImpl_InitIFileSourceFilter(
114         CFileSourceFilterImpl* This, IUnknown* punkControl,
115         CAsyncSourceImpl* pSource,
116         CRITICAL_SECTION* pcsFileSource );
117 void CFileSourceFilterImpl_UninitIFileSourceFilter(
118         CFileSourceFilterImpl* This );
119
120
121 HRESULT QUARTZ_CreateAsyncSource(
122         IUnknown* punkOuter,void** ppobj,
123         const CLSID* pclsidAsyncSource,
124         LPCWSTR pwszAsyncSourceName,
125         LPCWSTR pwszOutPinName,
126         const AsyncSourceHandlers* pHandler );
127 HRESULT QUARTZ_CreateAsyncSourcePin(
128         CAsyncSourceImpl* pFilter,
129         CRITICAL_SECTION* pcsPin,
130         CAsyncSourcePinImpl** ppPin,
131         LPCWSTR pwszPinName );
132
133
134 HRESULT QUARTZ_CreateAsyncReader(IUnknown* punkOuter,void** ppobj);
135 HRESULT QUARTZ_CreateURLReader(IUnknown* punkOuter,void** ppobj);
136
137 #define ASYNCSRC_FILE_BLOCKSIZE 16384
138
139
140 #endif  /* WINE_DSHOW_ASYNCSRC_H */