Added WSASendDisconnect.
[wine] / dlls / dsound / capture.c
1 /*                      DirectSoundCapture
2  *
3  * Copyright 1998 Marcus Meissner
4  * Copyright 1998 Rob Riggs
5  * Copyright 2000-2001 TransGaming Technologies, Inc.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21 /*
22  * TODO:
23  *      Implement DirectSoundCapture API
24  */
25
26 #include "config.h"
27 #include <assert.h>
28 #include <stdio.h>
29 #include <sys/types.h>
30 #include <sys/fcntl.h>
31 #ifdef HAVE_UNISTD_H
32 # include <unistd.h>
33 #endif
34 #include <stdlib.h>
35 #include <string.h>
36
37 #include "windef.h"
38 #include "winbase.h"
39 #include "wingdi.h"
40 #include "winuser.h"
41 #include "winerror.h"
42 #include "mmsystem.h"
43 #include "wine/debug.h"
44 #include "dsound.h"
45
46 WINE_DEFAULT_DEBUG_CHANNEL(dsound);
47
48 /*****************************************************************************
49  * Predeclare the interface implementation structures
50  */
51 typedef struct IDirectSoundCaptureImpl IDirectSoundCaptureImpl;
52 typedef struct IDirectSoundCaptureBufferImpl IDirectSoundCaptureBufferImpl;
53
54
55 /*****************************************************************************
56  * IDirectSoundCapture implementation structure
57  */
58 struct IDirectSoundCaptureImpl
59 {
60     /* IUnknown fields */
61     ICOM_VFIELD(IDirectSoundCapture);
62     DWORD                              ref;
63
64     /* IDirectSoundCaptureImpl fields */
65     CRITICAL_SECTION        lock;
66 };
67
68 /*****************************************************************************
69  * IDirectSoundCapture implementation structure
70  */
71 struct IDirectSoundCaptureBufferImpl
72 {
73     /* IUnknown fields */
74     ICOM_VFIELD(IDirectSoundCaptureBuffer8);
75     DWORD                              ref;
76
77     /* IDirectSoundCaptureBufferImpl fields */
78     CRITICAL_SECTION        lock;
79 };
80
81
82 static HRESULT DSOUND_CreateDirectSoundCapture( LPVOID* ppobj );
83 static HRESULT DSOUND_CreateDirectSoundCaptureBuffer( LPCDSCBUFFERDESC lpcDSCBufferDesc, LPVOID* ppobj );
84
85 static ICOM_VTABLE(IDirectSoundCapture) dscvt;
86 static ICOM_VTABLE(IDirectSoundCaptureBuffer8) dscbvt;
87
88
89 /***************************************************************************
90  * DirectSoundCaptureCreate [DSOUND.6]
91  *
92  * Create and initialize a DirectSoundCapture interface
93  *
94  * RETURNS
95  *    Success: DS_OK
96  *    Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM,
97  *             DSERR_OUTOFMEMORY
98  */
99 HRESULT WINAPI DirectSoundCaptureCreate8(
100         LPCGUID lpcGUID,
101         LPDIRECTSOUNDCAPTURE* lplpDSC,
102         LPUNKNOWN pUnkOuter )
103 {
104         TRACE("(%s,%p,%p)\n", debugstr_guid(lpcGUID), lplpDSC, pUnkOuter);
105
106         if( pUnkOuter ) {
107                 return DSERR_NOAGGREGATION;
108         }
109
110         /* Default device? */
111         if ( !lpcGUID ||
112              IsEqualGUID(lpcGUID, &DSDEVID_DefaultCapture) ||
113              IsEqualGUID(lpcGUID, &DSDEVID_DefaultVoiceCapture) ) {
114                 return DSOUND_CreateDirectSoundCapture( (LPVOID*)lplpDSC );
115         }
116
117         FIXME( "Unknown GUID %s\n", debugstr_guid(lpcGUID) );
118         *lplpDSC = NULL;
119
120         return DSERR_OUTOFMEMORY;
121 }
122
123 /***************************************************************************
124  * DirectSoundCaptureEnumerateA [DSOUND.7]
125  *
126  * Enumerate all DirectSound drivers installed in the system
127  *
128  * RETURNS
129  *    Success: DS_OK
130  *    Failure: DSERR_INVALIDPARAM
131  */
132 HRESULT WINAPI DirectSoundCaptureEnumerateA(
133         LPDSENUMCALLBACKA lpDSEnumCallback,
134         LPVOID lpContext)
135 {
136         TRACE("(%p,%p)\n", lpDSEnumCallback, lpContext );
137
138         if ( lpDSEnumCallback )
139                 lpDSEnumCallback(NULL,"WINE Primary Sound Capture Driver",
140                     "SoundCap",lpContext);
141
142
143         return DS_OK;
144 }
145
146 /***************************************************************************
147  * DirectSoundCaptureEnumerateW [DSOUND.8]
148  *
149  * Enumerate all DirectSound drivers installed in the system
150  *
151  * RETURNS
152  *    Success: DS_OK
153  *    Failure: DSERR_INVALIDPARAM
154  */
155 HRESULT WINAPI DirectSoundCaptureEnumerateW(
156         LPDSENUMCALLBACKW lpDSEnumCallback,
157         LPVOID lpContext)
158 {
159         FIXME("(%p,%p):stub\n", lpDSEnumCallback, lpContext );
160         return DS_OK;
161 }
162
163 static HRESULT
164 DSOUND_CreateDirectSoundCapture( LPVOID* ppobj )
165 {
166         *ppobj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( IDirectSoundCaptureImpl ) );
167
168         if ( *ppobj == NULL ) {
169                 return DSERR_OUTOFMEMORY;
170         }
171
172         {
173                 ICOM_THIS(IDirectSoundCaptureImpl,*ppobj);
174
175                 This->ref = 1;
176                 ICOM_VTBL(This) = &dscvt;
177
178                 InitializeCriticalSection( &This->lock );
179         }
180
181         return S_OK;
182 }
183
184 static HRESULT WINAPI
185 IDirectSoundCaptureImpl_QueryInterface(
186         LPDIRECTSOUNDCAPTURE iface,
187         REFIID riid,
188         LPVOID* ppobj )
189 {
190         ICOM_THIS(IDirectSoundCaptureImpl,iface);
191
192         FIXME( "(%p)->(%s,%p): stub\n", This, debugstr_guid(riid), ppobj );
193
194         return E_FAIL;
195 }
196
197 static ULONG WINAPI
198 IDirectSoundCaptureImpl_AddRef( LPDIRECTSOUNDCAPTURE iface )
199 {
200         ULONG uRef;
201         ICOM_THIS(IDirectSoundCaptureImpl,iface);
202
203         EnterCriticalSection( &This->lock );
204
205         TRACE( "(%p) was 0x%08lx\n", This, This->ref );
206         uRef = ++(This->ref);
207
208         LeaveCriticalSection( &This->lock );
209
210         return uRef;
211 }
212
213 static ULONG WINAPI
214 IDirectSoundCaptureImpl_Release( LPDIRECTSOUNDCAPTURE iface )
215 {
216         ULONG uRef;
217         ICOM_THIS(IDirectSoundCaptureImpl,iface);
218
219         EnterCriticalSection( &This->lock );
220
221         TRACE( "(%p) was 0x%08lx\n", This, This->ref );
222         uRef = --(This->ref);
223
224         LeaveCriticalSection( &This->lock );
225
226         if ( uRef == 0 ) {
227                 DeleteCriticalSection( &This->lock );
228                 HeapFree( GetProcessHeap(), 0, This );
229         }
230
231         return uRef;
232 }
233
234 static HRESULT WINAPI
235 IDirectSoundCaptureImpl_CreateCaptureBuffer(
236         LPDIRECTSOUNDCAPTURE iface,
237         LPCDSCBUFFERDESC lpcDSCBufferDesc,
238         LPDIRECTSOUNDCAPTUREBUFFER* lplpDSCaptureBuffer,
239         LPUNKNOWN pUnk )
240 {
241         HRESULT hr;
242         ICOM_THIS(IDirectSoundCaptureImpl,iface);
243
244         TRACE( "(%p)->(%p,%p,%p)\n", This, lpcDSCBufferDesc, lplpDSCaptureBuffer, pUnk );
245
246         if ( pUnk ) {
247                 return DSERR_INVALIDPARAM;
248         }
249
250         hr = DSOUND_CreateDirectSoundCaptureBuffer( lpcDSCBufferDesc, (LPVOID*)lplpDSCaptureBuffer );
251
252         return hr;
253 }
254
255 static HRESULT WINAPI
256 IDirectSoundCaptureImpl_GetCaps(
257         LPDIRECTSOUNDCAPTURE iface,
258         LPDSCCAPS lpDSCCaps )
259 {
260         ICOM_THIS(IDirectSoundCaptureImpl,iface);
261
262         FIXME( "(%p)->(%p): stub\n", This, lpDSCCaps );
263
264         return DS_OK;
265 }
266
267 static HRESULT WINAPI
268 IDirectSoundCaptureImpl_Initialize(
269         LPDIRECTSOUNDCAPTURE iface,
270         LPCGUID lpcGUID )
271 {
272         ICOM_THIS(IDirectSoundCaptureImpl,iface);
273
274         FIXME( "(%p)->(%p): stub\n", This, lpcGUID );
275
276         return DS_OK;
277 }
278
279
280 static ICOM_VTABLE(IDirectSoundCapture) dscvt =
281 {
282         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
283         /* IUnknown methods */
284         IDirectSoundCaptureImpl_QueryInterface,
285         IDirectSoundCaptureImpl_AddRef,
286         IDirectSoundCaptureImpl_Release,
287
288         /* IDirectSoundCapture methods */
289         IDirectSoundCaptureImpl_CreateCaptureBuffer,
290         IDirectSoundCaptureImpl_GetCaps,
291         IDirectSoundCaptureImpl_Initialize
292 };
293
294 static HRESULT
295 DSOUND_CreateDirectSoundCaptureBuffer( LPCDSCBUFFERDESC lpcDSCBufferDesc, LPVOID* ppobj )
296 {
297
298         FIXME( "(%p,%p): ignoring lpcDSCBufferDesc\n", lpcDSCBufferDesc, ppobj );
299
300         *ppobj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( IDirectSoundCaptureBufferImpl ) );
301
302         if ( *ppobj == NULL ) {
303                 return DSERR_OUTOFMEMORY;
304         }
305
306         {
307                 ICOM_THIS(IDirectSoundCaptureBufferImpl,*ppobj);
308
309                 This->ref = 1;
310                 ICOM_VTBL(This) = &dscbvt;
311
312                 InitializeCriticalSection( &This->lock );
313         }
314
315         return S_OK;
316 }
317
318
319 static HRESULT WINAPI
320 IDirectSoundCaptureBufferImpl_QueryInterface(
321         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
322         REFIID riid,
323         LPVOID* ppobj )
324 {
325         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
326
327         FIXME( "(%p)->(%s,%p): stub\n", This, debugstr_guid(riid), ppobj );
328
329         return E_FAIL;
330 }
331
332 static ULONG WINAPI
333 IDirectSoundCaptureBufferImpl_AddRef( LPDIRECTSOUNDCAPTUREBUFFER8 iface )
334 {
335         ULONG uRef;
336         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
337
338         EnterCriticalSection( &This->lock );
339
340         TRACE( "(%p) was 0x%08lx\n", This, This->ref );
341         uRef = ++(This->ref);
342
343         LeaveCriticalSection( &This->lock );
344
345         return uRef;
346 }
347
348 static ULONG WINAPI
349 IDirectSoundCaptureBufferImpl_Release( LPDIRECTSOUNDCAPTUREBUFFER8 iface )
350 {
351         ULONG uRef;
352         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
353
354         EnterCriticalSection( &This->lock );
355
356         TRACE( "(%p) was 0x%08lx\n", This, This->ref );
357         uRef = --(This->ref);
358
359         LeaveCriticalSection( &This->lock );
360
361         if ( uRef == 0 ) {
362                 DeleteCriticalSection( &This->lock );
363                 HeapFree( GetProcessHeap(), 0, This );
364         }
365
366         return uRef;
367 }
368
369 static HRESULT WINAPI
370 IDirectSoundCaptureBufferImpl_GetCaps(
371         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
372         LPDSCBCAPS lpDSCBCaps )
373 {
374         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
375
376         FIXME( "(%p)->(%p): stub\n", This, lpDSCBCaps );
377
378         return DS_OK;
379 }
380
381 static HRESULT WINAPI
382 IDirectSoundCaptureBufferImpl_GetCurrentPosition(
383         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
384         LPDWORD lpdwCapturePosition,
385         LPDWORD lpdwReadPosition )
386 {
387         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
388
389         FIXME( "(%p)->(%p,%p): stub\n", This, lpdwCapturePosition, lpdwReadPosition );
390
391         return DS_OK;
392 }
393
394 static HRESULT WINAPI
395 IDirectSoundCaptureBufferImpl_GetFormat(
396         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
397         LPWAVEFORMATEX lpwfxFormat,
398         DWORD dwSizeAllocated,
399         LPDWORD lpdwSizeWritten )
400 {
401         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
402
403         FIXME( "(%p)->(%p,0x%08lx,%p): stub\n", This, lpwfxFormat, dwSizeAllocated, lpdwSizeWritten );
404
405         return DS_OK;
406 }
407
408 static HRESULT WINAPI
409 IDirectSoundCaptureBufferImpl_GetStatus(
410         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
411         LPDWORD lpdwStatus )
412 {
413         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
414
415         FIXME( "(%p)->(%p): stub\n", This, lpdwStatus );
416
417         return DS_OK;
418 }
419
420 static HRESULT WINAPI
421 IDirectSoundCaptureBufferImpl_Initialize(
422         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
423         LPDIRECTSOUNDCAPTURE lpDSC,
424         LPCDSCBUFFERDESC lpcDSCBDesc )
425 {
426         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
427
428         FIXME( "(%p)->(%p,%p): stub\n", This, lpDSC, lpcDSCBDesc );
429
430         return DS_OK;
431 }
432
433 static HRESULT WINAPI
434 IDirectSoundCaptureBufferImpl_Lock(
435         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
436         DWORD dwReadCusor,
437         DWORD dwReadBytes,
438         LPVOID* lplpvAudioPtr1,
439         LPDWORD lpdwAudioBytes1,
440         LPVOID* lplpvAudioPtr2,
441         LPDWORD lpdwAudioBytes2,
442         DWORD dwFlags )
443 {
444         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
445
446         FIXME( "(%p)->(%08lu,%08lu,%p,%p,%p,%p,0x%08lx): stub\n", This, dwReadCusor, dwReadBytes, lplpvAudioPtr1, lpdwAudioBytes1, lplpvAudioPtr2, lpdwAudioBytes2, dwFlags );
447
448         return DS_OK;
449 }
450
451 static HRESULT WINAPI
452 IDirectSoundCaptureBufferImpl_Start(
453         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
454         DWORD dwFlags )
455 {
456         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
457
458         FIXME( "(%p)->(0x%08lx): stub\n", This, dwFlags );
459
460         return DS_OK;
461 }
462
463 static HRESULT WINAPI
464 IDirectSoundCaptureBufferImpl_Stop( LPDIRECTSOUNDCAPTUREBUFFER8 iface )
465 {
466         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
467
468         FIXME( "(%p): stub\n", This );
469
470         return DS_OK;
471 }
472
473 static HRESULT WINAPI
474 IDirectSoundCaptureBufferImpl_Unlock(
475         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
476         LPVOID lpvAudioPtr1,
477         DWORD dwAudioBytes1,
478         LPVOID lpvAudioPtr2,
479         DWORD dwAudioBytes2 )
480 {
481         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
482
483         FIXME( "(%p)->(%p,%08lu,%p,%08lu): stub\n", This, lpvAudioPtr1, dwAudioBytes1, lpvAudioPtr2, dwAudioBytes2 );
484
485         return DS_OK;
486 }
487
488 static HRESULT WINAPI
489 IDirectSoundCaptureBufferImpl_GetObjectInPath(
490         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
491         REFGUID rguidObject,
492         DWORD dwIndex,
493         REFGUID rguidInterface,
494         LPVOID* ppObject )
495 {
496         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
497
498         FIXME( "(%p)->(%s,%lu,%s,%p): stub\n", This, debugstr_guid(rguidObject), dwIndex, debugstr_guid(rguidInterface), ppObject );
499
500         return DS_OK;
501 }
502
503 static HRESULT WINAPI
504 IDirectSoundCaptureBufferImpl_GetFXStatus(
505         LPDIRECTSOUNDCAPTUREBUFFER8 iface,
506         DWORD dwFXCount,
507         LPDWORD pdwFXStatus )
508 {
509         ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
510
511         FIXME( "(%p)->(%lu,%p): stub\n", This, dwFXCount, pdwFXStatus );
512
513         return DS_OK;
514 }
515
516
517 static ICOM_VTABLE(IDirectSoundCaptureBuffer8) dscbvt =
518 {
519         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
520         /* IUnknown methods */
521         IDirectSoundCaptureBufferImpl_QueryInterface,
522         IDirectSoundCaptureBufferImpl_AddRef,
523         IDirectSoundCaptureBufferImpl_Release,
524
525         /* IDirectSoundCaptureBuffer methods */
526         IDirectSoundCaptureBufferImpl_GetCaps,
527         IDirectSoundCaptureBufferImpl_GetCurrentPosition,
528         IDirectSoundCaptureBufferImpl_GetFormat,
529         IDirectSoundCaptureBufferImpl_GetStatus,
530         IDirectSoundCaptureBufferImpl_Initialize,
531         IDirectSoundCaptureBufferImpl_Lock,
532         IDirectSoundCaptureBufferImpl_Start,
533         IDirectSoundCaptureBufferImpl_Stop,
534         IDirectSoundCaptureBufferImpl_Unlock,
535
536         /* IDirectSoundCaptureBuffer methods */
537         IDirectSoundCaptureBufferImpl_GetObjectInPath,
538         IDirectSoundCaptureBufferImpl_GetFXStatus
539 };