Files
Client/Library/dxx8/samples/Multimedia/VBSamples/DirectShow/Editing/DexterVB/modDexter.bas
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

1155 lines
58 KiB
QBasic

Attribute VB_Name = "modDexter"
'*******************************************************************************
'* This is a part of the Microsoft DXSDK Code Samples.
'* Copyright (C) 1999-2001 Microsoft Corporation.
'* All rights reserved.
'* This source code is only intended as a supplement to
'* Microsoft Development Tools and/or SDK documentation.
'* See these sources for detailed information regarding the
'* Microsoft samples programs.
'*******************************************************************************
Option Explicit
Option Base 0
Option Compare Text
'user for async rendering procedures
Private m_objMediaEvent As IMediaEvent
Private m_objFilterGraph As IGraphBuilder
Private m_objRenderEngine As RenderEngine
Private m_objFilterGraphManager As New FilgraphManager
' **************************************************************************************************************************************
' * GLOBAL INTERFACE- ENUMERATIONS
' *
' *
'supported export formats
Public Enum DEXExportFormatEnum
DEXExportXTL = 0
DEXExportGRF = 1
End Enum
'supported import formats
Public Enum DEXImportFormatEnum
DEXImportXTL = 0
End Enum
'supported media groups
Public Enum DEXMediaTypeEnum
DEXMediaTypeAudio = 1
DEXMediaTypeVideo = 0
End Enum
' **************************************************************************************************************************************
' * GLOBAL INTERFACE- PROCEDURES
' *
' *
' ******************************************************************************************************************************
' * procedure name: ClearTimeline
' * procedure description: purges the given timeline of all groups
' * NOTE: YOU MUST CALL THIS ON ANY AMTIMELINES YOU HAVE BEFORE RELEASING
' * THEM (e.g. BEFORE YOUR APP SHUTS DOWN) OR SO AS TO FREE MEMORY RESOURCES
' ******************************************************************************************************************************
Public Sub ClearTimeline(objTimeline As AMTimeline)
On Local Error GoTo ErrLine
If Not objTimeline Is Nothing Then
Call objTimeline.ClearAllGroups
End If
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: SaveTimeline
' * procedure description: Persists a timeline to a file given the specified format
' *
' ******************************************************************************************************************************
Public Sub SaveTimeline(objTimeline As AMTimeline, bstrFileName As String, Optional Format As DEXExportFormatEnum = DEXExportXTL)
Dim objXml2Dex As Xml2Dex
Dim objFilterGraph As IGraphBuilder
Dim objRenderEngine As RenderEngine
On Local Error GoTo ErrLine
If Not objTimeline Is Nothing Then
Select Case LCase(Format)
Case DEXExportFormatEnum.DEXExportXTL
'Persist the timeline using the dexter XTL File Format
Set objXml2Dex = New Xml2Dex
objXml2Dex.WriteXMLFile objTimeline, bstrFileName
Case DEXExportFormatEnum.DEXExportGRF
'Persist the timeline to a DShow Filter Graph Format
Set objXml2Dex = New Xml2Dex
Set objRenderEngine = New RenderEngine
Call objRenderEngine.SetTimelineObject(objTimeline)
Call objRenderEngine.ConnectFrontEnd
Call objRenderEngine.RenderOutputPins
Call objRenderEngine.GetFilterGraph(objFilterGraph)
objXml2Dex.WriteGrfFile objFilterGraph, bstrFileName
End Select
End If
'clean-up & dereference
If Not objXml2Dex Is Nothing Then Set objXml2Dex = Nothing
If Not objFilterGraph Is Nothing Then Set objFilterGraph = Nothing
If Not objRenderEngine Is Nothing Then Set objRenderEngine = Nothing
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: RestoreTimeline
' * procedure description: Restores a timeline from a file given the specified format
' *
' ******************************************************************************************************************************
Public Sub RestoreTimeline(objTimeline As AMTimeline, bstrFileName As String, Optional Format As DEXImportFormatEnum = DEXImportXTL)
Dim objXml2Dex As Xml2Dex
On Local Error GoTo ErrLine
If Not objTimeline Is Nothing Then
Select Case LCase(Format)
Case DEXImportFormatEnum.DEXImportXTL
'restore the timeline from a dexter XTL File Format
Set objXml2Dex = New Xml2Dex
Call objXml2Dex.ReadXMLFile(objTimeline, bstrFileName)
End Select
End If
'clean-up & dereference
If Not objXml2Dex Is Nothing Then Set objXml2Dex = Nothing
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: CreateTimeline
' * procedure description: creates a AMTimeline object
' *
' ******************************************************************************************************************************
Public Function CreateTimeline() As AMTimeline
On Local Error GoTo ErrLine
'instantiate return value direct
Set CreateTimeline = New AMTimeline
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: CreateGroup
' * procedure description: creates a group object given the passed properties (group name & mediatype) on the given timeline
' * groups can only be inserted into a timeline; so you could use this function with 'InsertGroup' typically
' ******************************************************************************************************************************
Public Function CreateGroup(objTimeline As AMTimeline, bstrGroupName As String, MediaType As DEXMediaTypeEnum, Optional OutputFPS As Double, Optional PreviewMode As Long, Optional OutputBuffer As Long) As AMTimelineGroup
Dim objGroup As AMTimelineGroup
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
'create an empty node on the timeline
objTimeline.CreateEmptyNode objTimelineObject, TIMELINE_MAJOR_TYPE_GROUP
'derive the group interface
Set objGroup = objTimelineObject
'set the name of the group
Call objGroup.SetGroupName(bstrGroupName)
'set the media type for the group
Call objGroup.SetMediaTypeForVB(MediaType)
'set the output buffer for the group
Call objGroup.SetOutputBuffering(OutputBuffer)
'set the preview mode for the group
Call objGroup.SetPreviewMode(PreviewMode)
'set the output fps for the group
Call objGroup.SetOutputFPS(OutputFPS)
'return the group to the client
Set CreateGroup = objGroup
'clean-up & dereference
If Not objGroup Is Nothing Then Set objGroup = Nothing
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: CreateComposite
' * procedure description: Creates a Composite object on the given timeline
' *
' ******************************************************************************************************************************
Public Function CreateComposite(objTimeline As AMTimeline) As AMTimelineComp
Dim objComp As AMTimelineComp
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
'create an empty node on the timeline
objTimeline.CreateEmptyNode objTimelineObject, TIMELINE_MAJOR_TYPE_COMPOSITE
'derive the composite interface
Set objComp = objTimelineObject
'return the group to the client
Set CreateComposite = objComp
'clean-up & dereference
If Not objComp Is Nothing Then Set objComp = Nothing
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: CreateTrack
' * procedure description: Create a track object on the given timeline
' *
' ******************************************************************************************************************************
Public Function CreateTrack(objTimeline As AMTimeline) As AMTimelineTrack
Dim objTrack As AMTimelineTrack
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
'create an empty node on the timeline
objTimeline.CreateEmptyNode objTimelineObject, TIMELINE_MAJOR_TYPE_TRACK
'derive the track interface
Set objTrack = objTimelineObject
'return the track to the client
Set CreateTrack = objTrack
'clean-up & dereference
If Not objTrack Is Nothing Then Set objTrack = Nothing
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: CreateEffect
' * procedure description: creates an effect object on the given timeline
' *
' ******************************************************************************************************************************
Public Function CreateEffect(objTimeline As AMTimeline) As AMTimelineEffect
Dim objEffect As AMTimelineEffect
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
'create an empty node on the timeline
objTimeline.CreateEmptyNode objTimelineObject, TIMELINE_MAJOR_TYPE_EFFECT
'derive the effect interface
Set objEffect = objTimelineObject
'return the group to the client
Set CreateEffect = objEffect
'clean-up & dereference
If Not objEffect Is Nothing Then Set objEffect = Nothing
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: CreateTransition
' * procedure description: creates a transition object on the given timeline
' *
' ******************************************************************************************************************************
Public Function CreateTransition(objTimeline As AMTimeline) As AMTimelineTrans
Dim objTrans As AMTimelineTrans
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
'create an empty node on the timeline
objTimeline.CreateEmptyNode objTimelineObject, TIMELINE_MAJOR_TYPE_TRANSITION
'derive the effect interface
Set objTrans = objTimelineObject
'return the group to the client
Set CreateTransition = objTrans
'clean-up & dereference
If Not objTrans Is Nothing Then Set objTrans = Nothing
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: CreateSource
' * procedure description: creates a clip/source object on the given timeline
' *
' ******************************************************************************************************************************
Public Function CreateSource(objTimeline As AMTimeline) As AMTimelineSrc
Dim objSrc As AMTimelineSrc
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
'create an empty node on the timeline
objTimeline.CreateEmptyNode objTimelineObject, TIMELINE_MAJOR_TYPE_SOURCE
'derive the source interface
Set objSrc = objTimelineObject
'return the source to the client
Set CreateSource = objSrc
'clean-up & dereference
If Not objSrc Is Nothing Then Set objSrc = Nothing
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: GroupFromTimeline
' * procedure description: creates a group object given the passed properties (group name & mediatype)
' * groups can only be inserted into a timeline; use this function with 'InsertGroup'
' ******************************************************************************************************************************
Public Function GroupFromTimeline(objTimeline As AMTimeline, Optional Group As Long = 0) As AMTimelineGroup
Dim objGroup As AMTimelineGroup
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
'obtain a Timeline Object from the timeline
Call objTimeline.GetGroup(objTimelineObject, Group)
'derive the group interface from the timeline object
Set objGroup = objTimelineObject
'returnt the reference to the client
Set GroupFromTimeline = objGroup
'clean-up & dereference
If Not objGroup Is Nothing Then Set objGroup = Nothing
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: InsertGroup
' * procedure description: appends a group to a timeline object; you can only append groups to a timeline
' *
' ******************************************************************************************************************************
Public Sub InsertGroup(objDestTimeline As AMTimeline, objSourceGroup As AMTimelineGroup)
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
If Not objSourceGroup Is Nothing Then
If Not objDestTimeline Is Nothing Then
'query for the Timelineobj interface
Set objTimelineObject = objSourceGroup
'append the source group to the destination timeline
objDestTimeline.AddGroup objTimelineObject
'clean-up & dereference
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
End If
End If
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: InsertComposite
' * procedure description: Inserts Composite into a group or into another composite,
' * The second argument, objInsetDestination evaluates to either a group or a composite object
' ******************************************************************************************************************************
Public Sub InsertComposite(objSourceComposite As AMTimelineComp, objInsetDestination As AMTimelineObj, Optional Priority As Long = -1)
Dim objComp As AMTimelineComp
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
If Not objSourceComposite Is Nothing Then
If Not objInsetDestination Is Nothing Then
'query for the composite interface
Set objComp = objInsetDestination
'query for the timelineobj object
Set objTimelineObject = objSourceComposite
'insert the comp into the group; or comp & set the priority
Call objComp.VTrackInsBefore(objTimelineObject, Priority)
'clean-up & dereference
If Not objComp Is Nothing Then Set objComp = Nothing
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
End If
End If
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: InsertTrack
' * procedure description: Inserts a track into a group or a composite,
' * The second argument, objInsetDestination evaluates to either a group or a composite
' ******************************************************************************************************************************
Public Sub InsertTrack(objTrack As AMTimelineTrack, objInsetDestination As AMTimelineObj, Optional Priority As Long = -1)
Dim objComp As AMTimelineComp
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
If Not objTrack Is Nothing Then
If Not objInsetDestination Is Nothing Then
'query for the composite interface
Set objComp = objInsetDestination
'query for the timelineobj object
Set objTimelineObject = objTrack
'insert the comp into the group; or comp & set the priority
Call objComp.VTrackInsBefore(objTimelineObject, Priority)
'clean-up & dereference
If Not objComp Is Nothing Then Set objComp = Nothing
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
End If
End If
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: InsertEffect
' * procedure description: appends an effect to a timeline object
' *
' ******************************************************************************************************************************
Public Sub InsertEffect(objSourceEffect As AMTimelineEffect, objInsetDestination As AMTimelineObj, bstrEffectCLSID As String, dblTStart As Double, dblTStop As Double, Optional Priority As Long = -1)
Dim objTimelineObject As AMTimelineObj
Dim objTimelineEffectable As IAMTimelineEffectable
On Local Error GoTo ErrLine
If Not objSourceEffect Is Nothing Then
If Not objInsetDestination Is Nothing Then
'query for the timelineobj object
Set objTimelineObject = objSourceEffect
Call objTimelineObject.SetSubObjectGUIDB(bstrEffectCLSID)
Call objTimelineObject.SetStartStop2(dblTStart, dblTStop)
'insert the effect into the destination
Set objTimelineEffectable = objInsetDestination
Call objTimelineEffectable.EffectInsBefore(objTimelineObject, Priority)
'clean-up & dereference
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
If Not objTimelineEffectable Is Nothing Then Set objTimelineEffectable = Nothing
End If
End If
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: InsertSource
' * procedure description: inserts a source clip to a timeline object; you can only append source to a track
' *
' ******************************************************************************************************************************
Public Sub InsertSource(objDestTrack As AMTimelineTrack, objSourceClip As AMTimelineSrc, bstrMediaName As String, dblTStart As Double, dblTStop As Double, Optional dblMStart As Double, Optional dblMStop As Double)
Dim objTimelineObject As AMTimelineObj
On Local Error GoTo ErrLine
If Not objDestTrack Is Nothing Then
If Not objSourceClip Is Nothing Then
'query for the Timelineobj interface
Set objTimelineObject = objSourceClip
'set start/stop times
Call objTimelineObject.SetStartStop2(dblTStart, dblTStop)
If dblMStart >= 0 And dblMStop <> 0 Then
'set the media times
Call objSourceClip.SetMediaTimes2(dblMStart, dblMStop)
End If
'set the media name
Call objSourceClip.SetMediaName(bstrMediaName)
'append the source clip to the destination track
objDestTrack.SrcAdd objTimelineObject
'clean-up & dereference
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
End If
End If
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: InsertTransition
' * procedure description: appends a transition to a timeline object
' *
' ******************************************************************************************************************************
Public Sub InsertTransition(objSourceTransition As AMTimelineTrans, objInsetDestination As AMTimelineObj, bstrEffectCLSID As String, dblTStart As Double, dblTStop As Double, Optional Priority As Long = -1)
Dim objTimelineObject As AMTimelineObj
Dim objTimelineTransable As IAMTimelineTransable
On Local Error GoTo ErrLine
If Not objSourceTransition Is Nothing Then
If Not objInsetDestination Is Nothing Then
'query for the timelineobj object
Set objTimelineObject = objSourceTransition
Call objTimelineObject.SetSubObjectGUIDB(bstrEffectCLSID)
Call objTimelineObject.SetStartStop2(dblTStart, dblTStop)
'insert the transition into the destination
Set objTimelineTransable = objInsetDestination
Call objTimelineTransable.TransAdd(objTimelineObject)
'clean-up & dereference
If Not objTimelineObject Is Nothing Then Set objTimelineObject = Nothing
If Not objTimelineTransable Is Nothing Then Set objTimelineTransable = Nothing
End If
End If
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: EngineFromTimeline
' * procedure description: renders the timeline for the client
' *
' ******************************************************************************************************************************
Public Function EngineFromTimeline(objTimeline As AMTimeline) As RenderEngine
Dim objRenderEngine As RenderEngine
On Local Error GoTo ErrLine
'instantiate new render engine
Set objRenderEngine = New RenderEngine
'connect everything up..
Call objRenderEngine.SetTimelineObject(objTimeline)
objRenderEngine.ConnectFrontEnd
objRenderEngine.RenderOutputPins
'return the render engine to the client
Set EngineFromTimeline = objRenderEngine
'dereference & clean-up
If Not objRenderEngine Is Nothing Then Set objRenderEngine = Nothing
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: GraphFromTimeline
' * procedure description: returns a graph from the given timeline
' *
' ******************************************************************************************************************************
Public Function GraphFromTimeline(objTimeline As AMTimeline) As IGraphBuilder
Dim objGraphBuilder As IGraphBuilder
Dim objRenderEngine As RenderEngine
On Local Error GoTo ErrLine
'instantiate new render engine
Set objRenderEngine = New RenderEngine
'connect everything up..
Call objRenderEngine.SetTimelineObject(objTimeline)
objRenderEngine.ConnectFrontEnd
objRenderEngine.RenderOutputPins
'return the graph builder to the client
Call objRenderEngine.GetFilterGraph(objGraphBuilder)
If Not objGraphBuilder Is Nothing Then Set GraphFromTimeline = objGraphBuilder
'dereference & clean-up
If Not objGraphBuilder Is Nothing Then Set objGraphBuilder = Nothing
If Not objRenderEngine Is Nothing Then Set objRenderEngine = Nothing
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: RenderTimelineSync
' * procedure description: Renders the timeline for the client, and waits for completion
' * until the media completes or until the specified timeout is reached..
' *
' ******************************************************************************************************************************
Public Sub RenderTimelineSync(objTimeline As AMTimeline, Optional Timeout As Long = -1)
Dim nExitCode As Long
Dim objMediaEvent As IMediaEvent
Dim objMediaControl As IMediaControl
Dim objFilterGraph As IGraphBuilder
Dim objRenderEngine As RenderEngine
On Local Error GoTo ErrLine
'instantiate new render engine
Set objRenderEngine = New RenderEngine
'connect everything up..
Call objRenderEngine.SetTimelineObject(objTimeline)
objRenderEngine.ConnectFrontEnd
objRenderEngine.RenderOutputPins
'obtain the filtergraph
Call objRenderEngine.GetFilterGraph(objFilterGraph)
Set objMediaEvent = objFilterGraph
Set objMediaControl = objFilterGraph
'render the graph
objMediaControl.Run
'wait for the graph to complete..
objMediaEvent.WaitForCompletion Timeout, nExitCode
'clean-up & dereference
If Not objFilterGraph Is Nothing Then Set objFilterGraph = Nothing
If Not objMediaEvent Is Nothing Then Set objMediaEvent = Nothing
If Not objMediaControl Is Nothing Then Set objMediaControl = Nothing
If Not objRenderEngine Is Nothing Then Set objRenderEngine = Nothing
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: RenderTimelineAsync
' * procedure description: renders the timeline for the client and returns an instance of the filter graph manager
' * NOTE: THIS PROCEDURE USES MODULE-LEVEL VARIABLES BECAUSE
' * IT WORKS ASYNCRONOUSLY. IF YOU MOVE THEM OVER LOCALLY
' * YOUR APPLICATION WILL TAKE A READ FAULT BECAUSE QEDIT WILL
' * NOT BE ABLE TO READ YOUR FILTERGRAPH WHEN THE PROCEDURE EXITS.
' ******************************************************************************************************************************
Public Function RenderTimeline(objTimeline As AMTimeline, Optional UseDynamicConnections As Boolean, Optional UseSmartRecompression As Boolean) As FilgraphManager
On Local Error GoTo ErrLine
'instantiate new render engine
Set m_objRenderEngine = New RenderEngine
'setup dynamic connections
If UseDynamicConnections = True Then
Call m_objRenderEngine.SetDynamicReconnectLevel(1)
Else: Call m_objRenderEngine.SetDynamicReconnectLevel(0)
End If
'setup smart recompression
If UseSmartRecompression = True Then
'smart recompression is not currently supported in vb
End If
'connect everything up..
Call m_objRenderEngine.SetTimelineObject(objTimeline)
m_objRenderEngine.ConnectFrontEnd
m_objRenderEngine.RenderOutputPins
'render the audio/video
Call m_objRenderEngine.GetFilterGraph(m_objFilterGraph)
Set m_objFilterGraphManager = New FilgraphManager
Set m_objFilterGraphManager = m_objFilterGraph
'return an instance of the filgraph manager to the client
Set RenderTimeline = m_objFilterGraphManager
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: RenderTimelineAsync
' * procedure description: renders the timeline for the client in true async fashion
' * NOTE: THIS PROCEDURE USES MODULE-LEVEL VARIABLES BECAUSE
' * IT WORKS ASYNCRONOUSLY. IF YOU MOVE THEM OVER LOCALLY
' * YOUR APPLICATION WILL TAKE A READ FAULT BECAUSE QEDIT WILL
' * NOT BE ABLE TO READ YOUR FILTERGRAPH WHEN THE PROCEDURE EXITS.
' ******************************************************************************************************************************
Public Sub RenderTimelineAsync(objTimeline As AMTimeline)
On Local Error GoTo ErrLine
'instantiate new render engine
Set gbl_objRenderEngine = New RenderEngine
'connect everything up..
Call gbl_objRenderEngine.SetTimelineObject(objTimeline)
gbl_objRenderEngine.ConnectFrontEnd
gbl_objRenderEngine.RenderOutputPins
'render the audio/video
Call gbl_objRenderEngine.GetFilterGraph(m_objFilterGraph)
Set m_objFilterGraphManager = New FilgraphManager
Set m_objFilterGraphManager = m_objFilterGraph
m_objFilterGraphManager.Run
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: RenderTimelineQuasiAsync
' * procedure description: Renders the timeline for the client, and waits for completion by using
' * a structured loop which constantly checks the current position of the media.
' * By using the VB 'WithEvents' Keyword normal form events are uninhibited.
' * as VB will basically handle the multi-threading for you.
' ******************************************************************************************************************************
Public Sub RenderTimelineQuasiAsync(objTimeline As AMTimeline)
Dim objPosition As IMediaPosition
Dim objFilterGraph As IGraphBuilder
Dim objRenderEngine As RenderEngine
Dim objFilterGraphManager As New FilgraphManager
On Local Error GoTo ErrLine
'instantiate new render engine
Set objRenderEngine = New RenderEngine
'connect everything up..
Call objRenderEngine.SetTimelineObject(objTimeline)
objRenderEngine.ConnectFrontEnd
objRenderEngine.RenderOutputPins
'render the audio/video
Call objRenderEngine.GetFilterGraph(objFilterGraph)
Set objFilterGraphManager = New FilgraphManager
Set objFilterGraphManager = objFilterGraph
objFilterGraphManager.Run
'obtain the position of audio/video
Set objPosition = objFilterGraphManager
'loop with events
Do: DoEvents
If objPosition.CurrentPosition = objPosition.StopTime Then
Call objFilterGraphManager.Stop
Exit Do
End If
Loop
'clean-up & dereference
If Not objPosition Is Nothing Then Set objPosition = Nothing
If Not objFilterGraph Is Nothing Then Set objFilterGraph = Nothing
If Not objRenderEngine Is Nothing Then Set objRenderEngine = Nothing
If Not objFilterGraphManager Is Nothing Then Set objFilterGraphManager = Nothing
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: RunFilterGraphSync
' * procedure description: playsback the filtergraph for the client synchronously, and returns.
' *
' ******************************************************************************************************************************
Public Sub RunFilterGraphSync(objGraph As IFilterGraph)
Dim nExitCode As Long
Dim objMediaEvent As IMediaEvent
Dim objMediaControl As IMediaControl
On Local Error GoTo ErrLine
'obtain the media control, event
Set objMediaEvent = objGraph
Set objMediaControl = objGraph
'render the graph
objMediaControl.Run
'wait for play to complete..
objMediaEvent.WaitForCompletion -1, nExitCode
'clean-up & dereference
If Not objMediaEvent Is Nothing Then Set objMediaEvent = Nothing
If Not objMediaControl Is Nothing Then Set objMediaControl = Nothing
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub
' ******************************************************************************************************************************
' * procedure name: TransitionCLSIDToFriendlyName
' * procedure description: returns the localized friendly name of a transition given it's CLSID
' *
' ******************************************************************************************************************************
Public Function TransitionCLSIDToFriendlyName(bstrTransitionCLSID As String, Optional bstrLanguage As String = "EN-US") As String
Dim bstrReturn As String
On Local Error GoTo ErrLine
If UCase(bstrLanguage) = "EN-US" Then
Select Case bstrTransitionCLSID
Case "{C3BDF740-0B58-11d2-A484-00C04F8EFB69}"
bstrReturn = "Barn"
Case "{00C429C0-0BA9-11d2-A484-00C04F8EFB69}"
bstrReturn = "Blinds"
Case "{107045D1-06E0-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "BurnFilm"
Case "{AA0D4D0C-06A3-11D2-8F98-00C04FB92EB7}"
bstrReturn = "CenterCurls"
Case "{2A54C908-07AA-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "ColorFade"
Case "{9A43A844-0831-11D1-817F-0000F87557DB}"
bstrReturn = "Compositor"
Case "{AA0D4D0E-06A3-11D2-8F98-00C04FB92EB7}"
bstrReturn = "Curls"
Case "{AA0D4D12-06A3-11D2-8F98-00C04FB92EB7}"
bstrReturn = "Curtains"
Case "{16B280C5-EE70-11D1-9066-00C04FD9189D}"
bstrReturn = "Fade"
Case "{107045CC-06E0-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "FadeWhite"
Case "{2A54C90B-07AA-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "FlowMotion"
Case "{2A54C913-07AA-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "GlassBlock"
Case "{2A54C911-07AA-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "Grid"
Case "{93073C40-0BA5-11d2-A484-00C04F8EFB69}"
bstrReturn = "Inset"
Case "{3F69F351-0379-11D2-A484-00C04F8EFB69}"
bstrReturn = "Iris"
Case "{2A54C904-07AA-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "Jaws"
Case "{107045CA-06E0-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "Lens"
Case "{107045C8-06E0-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "LightWipe"
Case "{AA0D4D0A-06A3-11D2-8F98-00C04FB92EB7}"
bstrReturn = "Liquid"
Case "{AA0D4D08-06A3-11D2-8F98-00C04FB92EB7}"
bstrReturn = "PageCurl"
Case "{AA0D4D10-06A3-11D2-8F98-00C04FB92EB7}"
bstrReturn = "PeelABCD"
Case "{4CCEA634-FBE0-11d1-906A-00C04FD9189D}"
bstrReturn = "Pixelate"
Case "{424B71AF-0695-11D2-A484-00C04F8EFB69}"
bstrReturn = "RadialWipe"
Case "{AA0D4D03-06A3-11D2-8F98-00C04FB92EB7}"
bstrReturn = "Ripple"
Case "{9C61F46E-0530-11D2-8F98-00C04FB92EB7}"
bstrReturn = "RollDown"
Case "{810E402F-056B-11D2-A484-00C04F8EFB69}"
bstrReturn = "Slide"
Case "{dE75D012-7A65-11D2-8CEA-00A0C9441E20}"
bstrReturn = "SMPTE Wipe"
Case "{ACA97E00-0C7D-11d2-A484-00C04F8EFB69}"
bstrReturn = "Spiral"
Case "{7658F2A2-0A83-11d2-A484-00C04F8EFB69}"
bstrReturn = "Stretch"
Case "{2A54C915-07AA-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "Threshold"
Case "{107045CF-06E0-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "Twister"
Case "{2A54C90D-07AA-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "Vacuum"
Case "{107045C5-06E0-11D2-8D6D-00C04F8EF8E0}"
bstrReturn = "Water"
Case "{5AE1DAE0-1461-11d2-A484-00C04F8EFB69}"
bstrReturn = "Wheel"
Case "{AF279B30-86EB-11D1-81BF-0000F87557DB}"
bstrReturn = "Wipe"
Case "{0E6AE022-0C83-11D2-8CD4-00104BC75D9A}"
bstrReturn = "WormHole"
Case "{E6E73D20-0C8A-11d2-A484-00C04F8EFB69}"
bstrReturn = "Zigzag"
Case Else: bstrReturn = vbNullString
End Select
End If
'return friendly name to the client
TransitionCLSIDToFriendlyName = bstrReturn
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: TransitionFriendlyNameToCLSID
' * procedure description: returns the CLSID of a transition given it's localized friendly name
' *
' ******************************************************************************************************************************
Public Function TransitionFriendlyNameToCLSID(bstrFriendlyName As String, Optional bstrLanguage As String = "EN-US") As String
Dim bstrReturn As String
On Local Error GoTo ErrLine
If UCase(bstrLanguage) = "EN-US" Then
Select Case bstrFriendlyName
Case "Barn"
bstrReturn = "{C3BDF740-0B58-11d2-A484-00C04F8EFB69}"
Case "Blinds"
bstrReturn = "{00C429C0-0BA9-11d2-A484-00C04F8EFB69}"
Case "BurnFilm"
bstrReturn = "{107045D1-06E0-11D2-8D6D-00C04F8EF8E0}"
Case "CenterCurls"
bstrReturn = "{AA0D4D0C-06A3-11D2-8F98-00C04FB92EB7}"
Case "ColorFade"
bstrReturn = "{2A54C908-07AA-11D2-8D6D-00C04F8EF8E0}"
Case "Compositor"
bstrReturn = "{9A43A844-0831-11D1-817F-0000F87557DB}"
Case "Curls"
bstrReturn = "{AA0D4D0E-06A3-11D2-8F98-00C04FB92EB7}"
Case "Curtains"
bstrReturn = "{AA0D4D12-06A3-11D2-8F98-00C04FB92EB7}"
Case "Fade"
bstrReturn = "{16B280C5-EE70-11D1-9066-00C04FD9189D}"
Case "FadeWhite"
bstrReturn = "{107045CC-06E0-11D2-8D6D-00C04F8EF8E0}"
Case "FlowMotion"
bstrReturn = "{2A54C90B-07AA-11D2-8D6D-00C04F8EF8E0}"
Case "GlassBlock"
bstrReturn = "{2A54C913-07AA-11D2-8D6D-00C04F8EF8E0}"
Case "Grid"
bstrReturn = "{2A54C911-07AA-11D2-8D6D-00C04F8EF8E0}"
Case "Inset"
bstrReturn = "{93073C40-0BA5-11d2-A484-00C04F8EFB69}"
Case "Iris"
bstrReturn = "{3F69F351-0379-11D2-A484-00C04F8EFB69}"
Case "Jaws"
bstrReturn = "{2A54C904-07AA-11D2-8D6D-00C04F8EF8E0}"
Case "Lens"
bstrReturn = "{107045CA-06E0-11D2-8D6D-00C04F8EF8E0}"
Case "LightWipe"
bstrReturn = "{107045C8-06E0-11D2-8D6D-00C04F8EF8E0}"
Case "Liquid"
bstrReturn = "{AA0D4D0A-06A3-11D2-8F98-00C04FB92EB7}"
Case "PageCurl"
bstrReturn = "{AA0D4D08-06A3-11D2-8F98-00C04FB92EB7}"
Case "PeelABCD"
bstrReturn = "{AA0D4D10-06A3-11D2-8F98-00C04FB92EB7}"
Case "Pixelate"
bstrReturn = "{4CCEA634-FBE0-11d1-906A-00C04FD9189D}"
Case "RadialWipe"
bstrReturn = "{424B71AF-0695-11D2-A484-00C04F8EFB69}"
Case "Ripple"
bstrReturn = "{AA0D4D03-06A3-11D2-8F98-00C04FB92EB7}"
Case "RollDown"
bstrReturn = "{9C61F46E-0530-11D2-8F98-00C04FB92EB7}"
Case "Slide"
bstrReturn = "{810E402F-056B-11D2-A484-00C04F8EFB69}"
Case "SMPTE Wipe"
bstrReturn = "{dE75D012-7A65-11D2-8CEA-00A0C9441E20}"
Case "Spiral"
bstrReturn = "{ACA97E00-0C7D-11d2-A484-00C04F8EFB69}"
Case "Stretch"
bstrReturn = "{7658F2A2-0A83-11d2-A484-00C04F8EFB69}"
Case "Threshold"
bstrReturn = "{2A54C915-07AA-11D2-8D6D-00C04F8EF8E0}"
Case "Twister"
bstrReturn = "{107045CF-06E0-11D2-8D6D-00C04F8EF8E0}"
Case "Vacuum"
bstrReturn = "{2A54C90D-07AA-11D2-8D6D-00C04F8EF8E0}"
Case "Water"
bstrReturn = "{107045C5-06E0-11D2-8D6D-00C04F8EF8E0}"
Case "Wheel"
bstrReturn = "{5AE1DAE0-1461-11d2-A484-00C04F8EFB69}"
Case "Wipe"
bstrReturn = "{AF279B30-86EB-11D1-81BF-0000F87557DB}"
Case "WormHole"
bstrReturn = "{0E6AE022-0C83-11D2-8CD4-00104BC75D9A}"
Case "Zigzag"
bstrReturn = "{E6E73D20-0C8A-11d2-A484-00C04F8EFB69}"
Case Else: bstrReturn = vbNullString
End Select
End If
'return friendly name to the client
TransitionFriendlyNameToCLSID = bstrReturn
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: EffectCLSIDToFriendlyName
' * procedure description: returns the localized friendly name of an effect given it's CLSID
' *
' ******************************************************************************************************************************
Public Function EffectCLSIDToFriendlyName(bstrTransitionCLSID As String, Optional bstrLanguage As String = "EN-US") As String
Dim bstrReturn As String
On Local Error GoTo ErrLine
If UCase(bstrLanguage) = "EN-US" Then
Select Case bstrTransitionCLSID
Case "{16B280C8-EE70-11D1-9066-00C04FD9189D}"
bstrReturn = "BasicImage"
Case "{7312498D-E87A-11d1-81E0-0000F87557DB}"
bstrReturn = "Blur"
Case "{421516C1-3CF8-11D2-952A-00C04FA34F05}"
bstrReturn = "Chroma"
Case "{ADC6CB86-424C-11D2-952A-00C04FA34F05}"
bstrReturn = "DropShadow"
Case "{F515306D-0156-11d2-81EA-0000F87557DB}"
bstrReturn = "Emboss"
Case "{F515306E-0156-11d2-81EA-0000F87557DB}"
bstrReturn = "Engrave"
Case "{16B280C5-EE70-11D1-9066-00C04FD9189D}"
bstrReturn = "Fade"
Case "{4CCEA634-FBE0-11d1-906A-00C04FD9189D}"
bstrReturn = "Pixelate"
Case Else: bstrReturn = vbNullString
End Select
End If
'return friendly name to the client
EffectCLSIDToFriendlyName = bstrReturn
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: EffectFriendlyNameToCLSID
' * procedure description: returns the CLSID of an effect given it's localized friendly name
' *
' ******************************************************************************************************************************
Public Function EffectFriendlyNameToCLSID(bstrFriendlyName As String, Optional bstrLanguage As String = "EN-US") As String
Dim bstrReturn As String
On Local Error GoTo ErrLine
If UCase(bstrLanguage) = "EN-US" Then
Select Case bstrFriendlyName
Case "BasicImage"
bstrReturn = "{16B280C8-EE70-11D1-9066-00C04FD9189D}"
Case "Blur"
bstrReturn = "{7312498D-E87A-11d1-81E0-0000F87557DB}"
Case "Chroma"
bstrReturn = "{421516C1-3CF8-11D2-952A-00C04FA34F05}"
Case "DropShadow"
bstrReturn = "{ADC6CB86-424C-11D2-952A-00C04FA34F05}"
Case "Emboss"
bstrReturn = "{F515306D-0156-11d2-81EA-0000F87557DB}"
Case "Engrave"
bstrReturn = "{F515306E-0156-11d2-81EA-0000F87557DB}"
Case "Fade"
bstrReturn = "{16B280C5-EE70-11D1-9066-00C04FD9189D}"
Case "Pixelate"
bstrReturn = "{4CCEA634-FBE0-11d1-906A-00C04FD9189D}"
Case Else: bstrReturn = vbNullString
End Select
End If
'return friendly name to the client
EffectFriendlyNameToCLSID = bstrReturn
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: GetGroupCount
' * procedure description: returns the number of groups encapsulated within the given timeline
' *
' ******************************************************************************************************************************
Public Function GetGroupCount(objTimeline As AMTimeline) As Long
Dim nCount As Long
On Local Error GoTo ErrLine
'obtain the number of groups
Call objTimeline.GetGroupCount(nCount)
'return the group count
GetGroupCount = nCount
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function
' ******************************************************************************************************************************
' * procedure name: HasGroups
' * procedure description: returns a boolean indicating wether or not the specified timeline has any any groups inserted
' *
' ******************************************************************************************************************************
Public Function HasGroups(objTimeline As AMTimeline) As Boolean
Dim nCount As Long
On Local Error GoTo ErrLine
'obtain the number of groups
Call objTimeline.GetGroupCount(nCount)
'return the group count
If nCount > 0 Then HasGroups = True
Exit Function
ErrLine:
Err.Clear
Exit Function
End Function