Maarten Lankhorst : winealsa: Add stubs for IDsCaptureDriverNotify.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Sep 12 07:50:35 CDT 2007


Module: wine
Branch: master
Commit: 30dee3a87a27ddd14ed59a66f400a9cef3376ea7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=30dee3a87a27ddd14ed59a66f400a9cef3376ea7

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Tue Sep 11 17:52:35 2007 +0200

winealsa: Add stubs for IDsCaptureDriverNotify.

---

 dlls/winealsa.drv/dscapture.c |  116 +++++++++++++++++++++++++++++++++++++---
 1 files changed, 107 insertions(+), 9 deletions(-)

diff --git a/dlls/winealsa.drv/dscapture.c b/dlls/winealsa.drv/dscapture.c
index d872e9b..aa57772 100644
--- a/dlls/winealsa.drv/dscapture.c
+++ b/dlls/winealsa.drv/dscapture.c
@@ -58,25 +58,29 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dsalsa);
 
-typedef struct IDsCaptureDriverImpl IDsCaptureDriverImpl;
 typedef struct IDsCaptureDriverBufferImpl IDsCaptureDriverBufferImpl;
 
-struct IDsCaptureDriverImpl
+typedef struct IDsCaptureDriverImpl
 {
-    /* IUnknown fields */
     const IDsCaptureDriverVtbl *lpVtbl;
     LONG ref;
-
-    /* IDsCaptureDriverImpl fields */
     IDsCaptureDriverBufferImpl* capture_buffer;
     UINT wDevID;
-};
+} IDsCaptureDriverImpl;
+
+typedef struct IDsCaptureDriverNotifyImpl
+{
+    const IDsDriverNotifyVtbl *lpVtbl;
+    LONG ref;
+    IDsCaptureDriverBufferImpl *buffer;
+} IDsCaptureDriverNotifyImpl;
 
 struct IDsCaptureDriverBufferImpl
 {
     const IDsCaptureDriverBufferVtbl *lpVtbl;
     LONG ref;
-    IDsCaptureDriverImpl* drv;
+    IDsCaptureDriverImpl *drv;
+    IDsCaptureDriverNotifyImpl *notify;
 
     CRITICAL_SECTION pcm_crst;
     LPBYTE mmap_buffer, presented_buffer;
@@ -91,6 +95,66 @@ struct IDsCaptureDriverBufferImpl
     snd_pcm_uframes_t mmap_buflen_frames, mmap_pos;
 };
 
+static HRESULT WINAPI IDsCaptureDriverNotifyImpl_QueryInterface(PIDSDRIVERNOTIFY iface, REFIID riid, LPVOID *ppobj)
+{
+    IDsCaptureDriverNotifyImpl *This = (IDsCaptureDriverNotifyImpl *)iface;
+    TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
+
+    if ( IsEqualGUID(riid, &IID_IUnknown) ||
+         IsEqualGUID(riid, &IID_IDsDriverNotify) ) {
+        IDsDriverNotify_AddRef(iface);
+        *ppobj = This;
+        return DS_OK;
+    }
+
+    FIXME( "Unknown IID %s\n", debugstr_guid(riid));
+
+    *ppobj = 0;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI IDsCaptureDriverNotifyImpl_AddRef(PIDSDRIVERNOTIFY iface)
+{
+    IDsCaptureDriverNotifyImpl *This = (IDsCaptureDriverNotifyImpl *)iface;
+    ULONG refCount = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref was %d\n", This, refCount - 1);
+
+    return refCount;
+}
+
+static ULONG WINAPI IDsCaptureDriverNotifyImpl_Release(PIDSDRIVERNOTIFY iface)
+{
+    IDsCaptureDriverNotifyImpl *This = (IDsCaptureDriverNotifyImpl *)iface;
+    ULONG refCount = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref was %d\n", This, refCount + 1);
+
+    if (!refCount) {
+        This->buffer->notify = NULL;
+        HeapFree(GetProcessHeap(), 0, This);
+        TRACE("(%p) released\n", This);
+    }
+    return refCount;
+}
+
+static HRESULT WINAPI IDsCaptureDriverNotifyImpl_SetNotificationPositions(PIDSDRIVERNOTIFY iface, DWORD howmuch, LPCDSBPOSITIONNOTIFY notify)
+{
+    IDsCaptureDriverNotifyImpl *This = (IDsCaptureDriverNotifyImpl *)iface;
+    TRACE("(%p,0x%08x,%p)\n",This,howmuch,notify);
+
+    FIXME("stub\n");
+    return DSERR_UNSUPPORTED;
+}
+
+static const IDsDriverNotifyVtbl dscdnvt =
+{
+    IDsCaptureDriverNotifyImpl_QueryInterface,
+    IDsCaptureDriverNotifyImpl_AddRef,
+    IDsCaptureDriverNotifyImpl_Release,
+    IDsCaptureDriverNotifyImpl_SetNotificationPositions,
+};
+
 #if 0
 /** Convert the position an application sees into a position ALSA sees */
 static snd_pcm_uframes_t fakepos_to_realpos(const IDsCaptureDriverBufferImpl* This, DWORD fakepos)
@@ -302,8 +366,37 @@ static int CreateMMAP(IDsCaptureDriverBufferImpl* pdbi)
 
 static HRESULT WINAPI IDsCaptureDriverBufferImpl_QueryInterface(PIDSCDRIVERBUFFER iface, REFIID riid, LPVOID *ppobj)
 {
-    /* IDsCaptureDriverBufferImpl *This = (IDsCaptureDriverBufferImpl *)iface; */
-    FIXME("(): stub!\n");
+    IDsCaptureDriverBufferImpl *This = (IDsCaptureDriverBufferImpl *)iface;
+    if ( IsEqualGUID(riid, &IID_IUnknown) ||
+         IsEqualGUID(riid, &IID_IDsCaptureDriverBuffer) ) {
+        IDsCaptureDriverBuffer_AddRef(iface);
+        *ppobj = (LPVOID)iface;
+        return DS_OK;
+    }
+
+    if ( IsEqualGUID( &IID_IDsDriverNotify, riid ) ) {
+        if (!This->notify)
+        {
+            This->notify = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDsCaptureDriverNotifyImpl));
+            if (!This->notify)
+                return DSERR_OUTOFMEMORY;
+            This->notify->lpVtbl = &dscdnvt;
+            This->notify->buffer = This;
+
+            /* Keep a lock on IDsDriverNotify for ourself, so it is destroyed when the buffer is */
+            IDsDriverNotify_AddRef((PIDSDRIVERNOTIFY)This->notify);
+        }
+        IDsDriverNotify_AddRef((PIDSDRIVERNOTIFY)This->notify);
+        *ppobj = (LPVOID)This->notify;
+        return DS_OK;
+    }
+
+    if ( IsEqualGUID( &IID_IDsDriverPropertySet, riid ) ) {
+        FIXME("Unsupported interface IID_IDsDriverPropertySet\n");
+        return E_FAIL;
+    }
+
+    FIXME("(): Unknown interface %s\n", debugstr_guid(riid));
     return DSERR_UNSUPPORTED;
 }
 
@@ -327,6 +420,9 @@ static ULONG WINAPI IDsCaptureDriverBufferImpl_Release(PIDSCDRIVERBUFFER iface)
     if (refCount)
         return refCount;
 
+    EnterCriticalSection(&This->pcm_crst);
+    if (This->notify)
+        IDsDriverNotify_Release((PIDSDRIVERNOTIFY)This->notify);
     TRACE("mmap buffer %p destroyed\n", This->mmap_buffer);
 
     This->drv->capture_buffer = NULL;
@@ -563,6 +659,7 @@ static HRESULT WINAPI IDsCaptureDriverBufferImpl_Start(PIDSCDRIVERBUFFER iface,
          * what it does right now is fill the buffer once.. ALSA size */
         FIXME("Non-looping buffers are not properly supported!\n");
     CommitAll(This, TRUE);
+
     /* **** */
     LeaveCriticalSection(&This->pcm_crst);
     return DS_OK;
@@ -578,6 +675,7 @@ static HRESULT WINAPI IDsCaptureDriverBufferImpl_Stop(PIDSCDRIVERBUFFER iface)
     This->play_looping = FALSE;
     snd_pcm_drop(This->pcm);
     snd_pcm_prepare(This->pcm);
+
     /* **** */
     LeaveCriticalSection(&This->pcm_crst);
     return DS_OK;




More information about the wine-cvs mailing list