| /* DirectSoundCapture |
| * |
| * Copyright 1998 Marcus Meissner |
| * Copyright 1998 Rob Riggs |
| * Copyright 2000-2001 TransGaming Technologies, Inc. |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| /* |
| * TODO: |
| * Implement DirectSoundCapture API |
| */ |
| |
| #include "config.h" |
| #include <assert.h> |
| #include <stdio.h> |
| #include <sys/types.h> |
| #include <sys/fcntl.h> |
| #ifdef HAVE_UNISTD_H |
| # include <unistd.h> |
| #endif |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "windef.h" |
| #include "winbase.h" |
| #include "wingdi.h" |
| #include "winuser.h" |
| #include "winerror.h" |
| #include "mmsystem.h" |
| #include "wine/debug.h" |
| #include "dsound.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(dsound); |
| |
| /***************************************************************************** |
| * Predeclare the interface implementation structures |
| */ |
| typedef struct IDirectSoundCaptureImpl IDirectSoundCaptureImpl; |
| typedef struct IDirectSoundCaptureBufferImpl IDirectSoundCaptureBufferImpl; |
| |
| |
| /***************************************************************************** |
| * IDirectSoundCapture implementation structure |
| */ |
| struct IDirectSoundCaptureImpl |
| { |
| /* IUnknown fields */ |
| ICOM_VFIELD(IDirectSoundCapture); |
| DWORD ref; |
| |
| /* IDirectSoundCaptureImpl fields */ |
| CRITICAL_SECTION lock; |
| }; |
| |
| /***************************************************************************** |
| * IDirectSoundCapture implementation structure |
| */ |
| struct IDirectSoundCaptureBufferImpl |
| { |
| /* IUnknown fields */ |
| ICOM_VFIELD(IDirectSoundCaptureBuffer8); |
| DWORD ref; |
| |
| /* IDirectSoundCaptureBufferImpl fields */ |
| CRITICAL_SECTION lock; |
| }; |
| |
| |
| static HRESULT DSOUND_CreateDirectSoundCapture( LPVOID* ppobj ); |
| static HRESULT DSOUND_CreateDirectSoundCaptureBuffer( LPCDSCBUFFERDESC lpcDSCBufferDesc, LPVOID* ppobj ); |
| |
| static ICOM_VTABLE(IDirectSoundCapture) dscvt; |
| static ICOM_VTABLE(IDirectSoundCaptureBuffer8) dscbvt; |
| |
| |
| /*************************************************************************** |
| * DirectSoundCaptureCreate [DSOUND.6] |
| * |
| * Create and initialize a DirectSoundCapture interface |
| * |
| * RETURNS |
| * Success: DS_OK |
| * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM, |
| * DSERR_OUTOFMEMORY |
| */ |
| HRESULT WINAPI DirectSoundCaptureCreate8( |
| LPCGUID lpcGUID, |
| LPDIRECTSOUNDCAPTURE* lplpDSC, |
| LPUNKNOWN pUnkOuter ) |
| { |
| TRACE("(%s,%p,%p)\n", debugstr_guid(lpcGUID), lplpDSC, pUnkOuter); |
| |
| if( pUnkOuter ) { |
| return DSERR_NOAGGREGATION; |
| } |
| |
| /* Default device? */ |
| if ( !lpcGUID || |
| IsEqualGUID(lpcGUID, &DSDEVID_DefaultCapture) || |
| IsEqualGUID(lpcGUID, &DSDEVID_DefaultVoiceCapture) ) { |
| return DSOUND_CreateDirectSoundCapture( (LPVOID*)lplpDSC ); |
| } |
| |
| FIXME( "Unknown GUID %s\n", debugstr_guid(lpcGUID) ); |
| *lplpDSC = NULL; |
| |
| return DSERR_OUTOFMEMORY; |
| } |
| |
| /*************************************************************************** |
| * DirectSoundCaptureEnumerateA [DSOUND.7] |
| * |
| * Enumerate all DirectSound drivers installed in the system |
| * |
| * RETURNS |
| * Success: DS_OK |
| * Failure: DSERR_INVALIDPARAM |
| */ |
| HRESULT WINAPI DirectSoundCaptureEnumerateA( |
| LPDSENUMCALLBACKA lpDSEnumCallback, |
| LPVOID lpContext) |
| { |
| TRACE("(%p,%p)\n", lpDSEnumCallback, lpContext ); |
| |
| if ( lpDSEnumCallback ) |
| lpDSEnumCallback(NULL,"WINE Primary Sound Capture Driver", |
| "SoundCap",lpContext); |
| |
| |
| return DS_OK; |
| } |
| |
| /*************************************************************************** |
| * DirectSoundCaptureEnumerateW [DSOUND.8] |
| * |
| * Enumerate all DirectSound drivers installed in the system |
| * |
| * RETURNS |
| * Success: DS_OK |
| * Failure: DSERR_INVALIDPARAM |
| */ |
| HRESULT WINAPI DirectSoundCaptureEnumerateW( |
| LPDSENUMCALLBACKW lpDSEnumCallback, |
| LPVOID lpContext) |
| { |
| FIXME("(%p,%p):stub\n", lpDSEnumCallback, lpContext ); |
| return DS_OK; |
| } |
| |
| static HRESULT |
| DSOUND_CreateDirectSoundCapture( LPVOID* ppobj ) |
| { |
| *ppobj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( IDirectSoundCaptureImpl ) ); |
| |
| if ( *ppobj == NULL ) { |
| return DSERR_OUTOFMEMORY; |
| } |
| |
| { |
| ICOM_THIS(IDirectSoundCaptureImpl,*ppobj); |
| |
| This->ref = 1; |
| ICOM_VTBL(This) = &dscvt; |
| |
| InitializeCriticalSection( &This->lock ); |
| } |
| |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureImpl_QueryInterface( |
| LPDIRECTSOUNDCAPTURE iface, |
| REFIID riid, |
| LPVOID* ppobj ) |
| { |
| ICOM_THIS(IDirectSoundCaptureImpl,iface); |
| |
| FIXME( "(%p)->(%s,%p): stub\n", This, debugstr_guid(riid), ppobj ); |
| |
| return E_FAIL; |
| } |
| |
| static ULONG WINAPI |
| IDirectSoundCaptureImpl_AddRef( LPDIRECTSOUNDCAPTURE iface ) |
| { |
| ULONG uRef; |
| ICOM_THIS(IDirectSoundCaptureImpl,iface); |
| |
| EnterCriticalSection( &This->lock ); |
| |
| TRACE( "(%p) was 0x%08lx\n", This, This->ref ); |
| uRef = ++(This->ref); |
| |
| LeaveCriticalSection( &This->lock ); |
| |
| return uRef; |
| } |
| |
| static ULONG WINAPI |
| IDirectSoundCaptureImpl_Release( LPDIRECTSOUNDCAPTURE iface ) |
| { |
| ULONG uRef; |
| ICOM_THIS(IDirectSoundCaptureImpl,iface); |
| |
| EnterCriticalSection( &This->lock ); |
| |
| TRACE( "(%p) was 0x%08lx\n", This, This->ref ); |
| uRef = --(This->ref); |
| |
| LeaveCriticalSection( &This->lock ); |
| |
| if ( uRef == 0 ) { |
| DeleteCriticalSection( &This->lock ); |
| HeapFree( GetProcessHeap(), 0, This ); |
| } |
| |
| return uRef; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureImpl_CreateCaptureBuffer( |
| LPDIRECTSOUNDCAPTURE iface, |
| LPCDSCBUFFERDESC lpcDSCBufferDesc, |
| LPDIRECTSOUNDCAPTUREBUFFER* lplpDSCaptureBuffer, |
| LPUNKNOWN pUnk ) |
| { |
| HRESULT hr; |
| ICOM_THIS(IDirectSoundCaptureImpl,iface); |
| |
| TRACE( "(%p)->(%p,%p,%p)\n", This, lpcDSCBufferDesc, lplpDSCaptureBuffer, pUnk ); |
| |
| if ( pUnk ) { |
| return DSERR_INVALIDPARAM; |
| } |
| |
| hr = DSOUND_CreateDirectSoundCaptureBuffer( lpcDSCBufferDesc, (LPVOID*)lplpDSCaptureBuffer ); |
| |
| return hr; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureImpl_GetCaps( |
| LPDIRECTSOUNDCAPTURE iface, |
| LPDSCCAPS lpDSCCaps ) |
| { |
| ICOM_THIS(IDirectSoundCaptureImpl,iface); |
| |
| FIXME( "(%p)->(%p): stub\n", This, lpDSCCaps ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureImpl_Initialize( |
| LPDIRECTSOUNDCAPTURE iface, |
| LPCGUID lpcGUID ) |
| { |
| ICOM_THIS(IDirectSoundCaptureImpl,iface); |
| |
| FIXME( "(%p)->(%p): stub\n", This, lpcGUID ); |
| |
| return DS_OK; |
| } |
| |
| |
| static ICOM_VTABLE(IDirectSoundCapture) dscvt = |
| { |
| ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE |
| /* IUnknown methods */ |
| IDirectSoundCaptureImpl_QueryInterface, |
| IDirectSoundCaptureImpl_AddRef, |
| IDirectSoundCaptureImpl_Release, |
| |
| /* IDirectSoundCapture methods */ |
| IDirectSoundCaptureImpl_CreateCaptureBuffer, |
| IDirectSoundCaptureImpl_GetCaps, |
| IDirectSoundCaptureImpl_Initialize |
| }; |
| |
| static HRESULT |
| DSOUND_CreateDirectSoundCaptureBuffer( LPCDSCBUFFERDESC lpcDSCBufferDesc, LPVOID* ppobj ) |
| { |
| |
| FIXME( "(%p,%p): ignoring lpcDSCBufferDesc\n", lpcDSCBufferDesc, ppobj ); |
| |
| *ppobj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( IDirectSoundCaptureBufferImpl ) ); |
| |
| if ( *ppobj == NULL ) { |
| return DSERR_OUTOFMEMORY; |
| } |
| |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,*ppobj); |
| |
| This->ref = 1; |
| ICOM_VTBL(This) = &dscbvt; |
| |
| InitializeCriticalSection( &This->lock ); |
| } |
| |
| return S_OK; |
| } |
| |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_QueryInterface( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| REFIID riid, |
| LPVOID* ppobj ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(%s,%p): stub\n", This, debugstr_guid(riid), ppobj ); |
| |
| return E_FAIL; |
| } |
| |
| static ULONG WINAPI |
| IDirectSoundCaptureBufferImpl_AddRef( LPDIRECTSOUNDCAPTUREBUFFER8 iface ) |
| { |
| ULONG uRef; |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| EnterCriticalSection( &This->lock ); |
| |
| TRACE( "(%p) was 0x%08lx\n", This, This->ref ); |
| uRef = ++(This->ref); |
| |
| LeaveCriticalSection( &This->lock ); |
| |
| return uRef; |
| } |
| |
| static ULONG WINAPI |
| IDirectSoundCaptureBufferImpl_Release( LPDIRECTSOUNDCAPTUREBUFFER8 iface ) |
| { |
| ULONG uRef; |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| EnterCriticalSection( &This->lock ); |
| |
| TRACE( "(%p) was 0x%08lx\n", This, This->ref ); |
| uRef = --(This->ref); |
| |
| LeaveCriticalSection( &This->lock ); |
| |
| if ( uRef == 0 ) { |
| DeleteCriticalSection( &This->lock ); |
| HeapFree( GetProcessHeap(), 0, This ); |
| } |
| |
| return uRef; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_GetCaps( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| LPDSCBCAPS lpDSCBCaps ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(%p): stub\n", This, lpDSCBCaps ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_GetCurrentPosition( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| LPDWORD lpdwCapturePosition, |
| LPDWORD lpdwReadPosition ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(%p,%p): stub\n", This, lpdwCapturePosition, lpdwReadPosition ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_GetFormat( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| LPWAVEFORMATEX lpwfxFormat, |
| DWORD dwSizeAllocated, |
| LPDWORD lpdwSizeWritten ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(%p,0x%08lx,%p): stub\n", This, lpwfxFormat, dwSizeAllocated, lpdwSizeWritten ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_GetStatus( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| LPDWORD lpdwStatus ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(%p): stub\n", This, lpdwStatus ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_Initialize( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| LPDIRECTSOUNDCAPTURE lpDSC, |
| LPCDSCBUFFERDESC lpcDSCBDesc ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(%p,%p): stub\n", This, lpDSC, lpcDSCBDesc ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_Lock( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| DWORD dwReadCusor, |
| DWORD dwReadBytes, |
| LPVOID* lplpvAudioPtr1, |
| LPDWORD lpdwAudioBytes1, |
| LPVOID* lplpvAudioPtr2, |
| LPDWORD lpdwAudioBytes2, |
| DWORD dwFlags ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(%08lu,%08lu,%p,%p,%p,%p,0x%08lx): stub\n", This, dwReadCusor, dwReadBytes, lplpvAudioPtr1, lpdwAudioBytes1, lplpvAudioPtr2, lpdwAudioBytes2, dwFlags ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_Start( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| DWORD dwFlags ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(0x%08lx): stub\n", This, dwFlags ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_Stop( LPDIRECTSOUNDCAPTUREBUFFER8 iface ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p): stub\n", This ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_Unlock( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| LPVOID lpvAudioPtr1, |
| DWORD dwAudioBytes1, |
| LPVOID lpvAudioPtr2, |
| DWORD dwAudioBytes2 ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(%p,%08lu,%p,%08lu): stub\n", This, lpvAudioPtr1, dwAudioBytes1, lpvAudioPtr2, dwAudioBytes2 ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_GetObjectInPath( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| REFGUID rguidObject, |
| DWORD dwIndex, |
| REFGUID rguidInterface, |
| LPVOID* ppObject ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(%s,%lu,%s,%p): stub\n", This, debugstr_guid(rguidObject), dwIndex, debugstr_guid(rguidInterface), ppObject ); |
| |
| return DS_OK; |
| } |
| |
| static HRESULT WINAPI |
| IDirectSoundCaptureBufferImpl_GetFXStatus( |
| LPDIRECTSOUNDCAPTUREBUFFER8 iface, |
| DWORD dwFXCount, |
| LPDWORD pdwFXStatus ) |
| { |
| ICOM_THIS(IDirectSoundCaptureBufferImpl,iface); |
| |
| FIXME( "(%p)->(%lu,%p): stub\n", This, dwFXCount, pdwFXStatus ); |
| |
| return DS_OK; |
| } |
| |
| |
| static ICOM_VTABLE(IDirectSoundCaptureBuffer8) dscbvt = |
| { |
| ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE |
| /* IUnknown methods */ |
| IDirectSoundCaptureBufferImpl_QueryInterface, |
| IDirectSoundCaptureBufferImpl_AddRef, |
| IDirectSoundCaptureBufferImpl_Release, |
| |
| /* IDirectSoundCaptureBuffer methods */ |
| IDirectSoundCaptureBufferImpl_GetCaps, |
| IDirectSoundCaptureBufferImpl_GetCurrentPosition, |
| IDirectSoundCaptureBufferImpl_GetFormat, |
| IDirectSoundCaptureBufferImpl_GetStatus, |
| IDirectSoundCaptureBufferImpl_Initialize, |
| IDirectSoundCaptureBufferImpl_Lock, |
| IDirectSoundCaptureBufferImpl_Start, |
| IDirectSoundCaptureBufferImpl_Stop, |
| IDirectSoundCaptureBufferImpl_Unlock, |
| |
| /* IDirectSoundCaptureBuffer methods */ |
| IDirectSoundCaptureBufferImpl_GetObjectInPath, |
| IDirectSoundCaptureBufferImpl_GetFXStatus |
| }; |