Ignore:
Timestamp:
Sep 15, 2001, 11:28:23 AM (24 years ago)
Author:
sandervl
Message:

wine update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/quartz/fgraph.c

    r6649 r6710  
    1 /* $Id: fgraph.c,v 1.3 2001-09-05 13:36:34 bird Exp $ */
    21/*
    32 * Implementation of CLSID_FilterGraph.
    4  *
    5  * FIXME - stub.
    63 *
    74 * hidenori@a2.ctktv.ne.jp
     
    2926static QUARTZ_IFEntry IFEntries[] =
    3027{
     28  { &IID_IPersist, offsetof(CFilterGraph,persist)-offsetof(CFilterGraph,unk) },
     29  { &IID_IDispatch, offsetof(CFilterGraph,disp)-offsetof(CFilterGraph,unk) },
    3130  { &IID_IFilterGraph, offsetof(CFilterGraph,fgraph)-offsetof(CFilterGraph,unk) },
    3231  { &IID_IGraphBuilder, offsetof(CFilterGraph,fgraph)-offsetof(CFilterGraph,unk) },
    3332  { &IID_IFilterGraph2, offsetof(CFilterGraph,fgraph)-offsetof(CFilterGraph,unk) },
     33  { &IID_IGraphVersion, offsetof(CFilterGraph,graphversion)-offsetof(CFilterGraph,unk) },
    3434  { &IID_IMediaControl, offsetof(CFilterGraph,mediacontrol)-offsetof(CFilterGraph,unk) },
     35  { &IID_IMediaFilter, offsetof(CFilterGraph,mediafilter)-offsetof(CFilterGraph,unk) },
    3536  { &IID_IMediaEvent, offsetof(CFilterGraph,mediaevent)-offsetof(CFilterGraph,unk) },
    3637  { &IID_IMediaEventEx, offsetof(CFilterGraph,mediaevent)-offsetof(CFilterGraph,unk) },
     38  { &IID_IMediaEventSink, offsetof(CFilterGraph,mediaeventsink)-offsetof(CFilterGraph,unk) },
    3739  { &IID_IMediaPosition, offsetof(CFilterGraph,mediaposition)-offsetof(CFilterGraph,unk) },
    3840  { &IID_IMediaSeeking, offsetof(CFilterGraph,mediaseeking)-offsetof(CFilterGraph,unk) },
    3941  { &IID_IBasicVideo, offsetof(CFilterGraph,basvid)-offsetof(CFilterGraph,unk) },
     42  { &IID_IBasicVideo2, offsetof(CFilterGraph,basvid)-offsetof(CFilterGraph,unk) },
    4043  { &IID_IBasicAudio, offsetof(CFilterGraph,basaud)-offsetof(CFilterGraph,unk) },
    4144  { &IID_IVideoWindow, offsetof(CFilterGraph,vidwin)-offsetof(CFilterGraph,unk) },
    4245};
    4346
     47
     48struct FGInitEntry
     49{
     50        HRESULT (*pInit)(CFilterGraph*);
     51        void (*pUninit)(CFilterGraph*);
     52};
     53
     54static const struct FGInitEntry FGRAPH_Init[] =
     55{
     56        #define FGENT(a)        {&CFilterGraph_Init##a,&CFilterGraph_Uninit##a},
     57
     58        FGENT(IPersist)
     59        FGENT(IDispatch)
     60        FGENT(IFilterGraph2)
     61        FGENT(IGraphVersion)
     62        FGENT(IMediaControl)
     63        FGENT(IMediaFilter)
     64        FGENT(IMediaEventEx)
     65        FGENT(IMediaEventSink)
     66        FGENT(IMediaPosition)
     67        FGENT(IMediaSeeking)
     68        FGENT(IBasicVideo2)
     69        FGENT(IBasicAudio)
     70        FGENT(IVideoWindow)
     71
     72        #undef  FGENT
     73        { NULL, NULL },
     74};
     75
     76
     77static void QUARTZ_DestroyFilterGraph(IUnknown* punk)
     78{
     79        CFilterGraph_THIS(punk,unk);
     80        int     i;
     81
     82        /* At first, call Stop. */
     83        IMediaControl_Stop( CFilterGraph_IMediaControl(This) );
     84        IMediaFilter_Stop( CFilterGraph_IMediaFilter(This) );
     85
     86        i = 0;
     87        while ( FGRAPH_Init[i].pInit != NULL )
     88        {
     89                FGRAPH_Init[i].pUninit( This );
     90                i++;
     91        }
     92
     93        TRACE( "succeeded.\n" );
     94}
     95
    4496HRESULT QUARTZ_CreateFilterGraph(IUnknown* punkOuter,void** ppobj)
    4597{
    46     CFilterGraph*   pfg;
     98        CFilterGraph*   pfg;
     99        HRESULT hr;
     100        int     i;
    47101
    48     TRACE("(%p,%p)\n",punkOuter,ppobj);
     102        TRACE("(%p,%p)\n",punkOuter,ppobj);
    49103
    50     pfg = (CFilterGraph*)QUARTZ_AllocObj( sizeof(CFilterGraph) );
    51     if ( pfg == NULL )
    52         return E_OUTOFMEMORY;
     104        pfg = (CFilterGraph*)QUARTZ_AllocObj( sizeof(CFilterGraph) );
     105        if ( pfg == NULL )
     106                return E_OUTOFMEMORY;
    53107
    54     QUARTZ_IUnkInit( &pfg->unk, punkOuter );
    55     CFilterGraph_InitIFilterGraph2( pfg );
    56     CFilterGraph_InitIMediaControl( pfg );
    57     CFilterGraph_InitIMediaEventEx( pfg );
    58     CFilterGraph_InitIMediaPosition( pfg );
    59     CFilterGraph_InitIMediaSeeking( pfg );
    60     CFilterGraph_InitIBasicVideo2( pfg );
    61     CFilterGraph_InitIBasicAudio( pfg );
    62     CFilterGraph_InitIVideoWindow( pfg );
     108        QUARTZ_IUnkInit( &pfg->unk, punkOuter );
    63109
    64     pfg->unk.pEntries = IFEntries;
    65     pfg->unk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
     110        i = 0;
     111        hr = NOERROR;
     112        while ( FGRAPH_Init[i].pInit != NULL )
     113        {
     114                hr = FGRAPH_Init[i].pInit( pfg );
     115                if ( FAILED(hr) )
     116                        break;
     117                i++;
     118        }
    66119
    67     *ppobj = (void*)(&pfg->unk);
     120        if ( FAILED(hr) )
     121        {
     122                while ( --i >= 0 )
     123                        FGRAPH_Init[i].pUninit( pfg );
     124                QUARTZ_FreeObj( pfg );
     125                return hr;
     126        }
    68127
    69     return S_OK;
     128        pfg->unk.pEntries = IFEntries;
     129        pfg->unk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
     130        pfg->unk.pOnFinalRelease = QUARTZ_DestroyFilterGraph;
     131
     132        *ppobj = (void*)(&pfg->unk);
     133
     134        return S_OK;
    70135}
     136
     137
Note: See TracChangeset for help on using the changeset viewer.