
'************************************************************************
'I have to test new ver of DirecrShow.INC file for PB
'This small example for test.
'If you have problem with DirectShow example, please inform me
'V.Shulakov 
'overloc@uch.net
'========================================================================
' DirectShow Example
'========================================================================

' #INCLUDE "WIN32API.INC"
' #INCLUDE "PBDDRAW.INC"

CONST OATRUE  = -1
CONST OAFALSE =  0

CONST OFN_FILEMUSTEXIST             = &H00001000
CONST OFN_READONLY                  = &H00000001
CONST OFN_PATHMUSTEXIST             = &H00000800
CONST IDR_MENU                      = 101
CONST ID_FILE_OPENCLIP              = 40001
CONST ID_FILE_EXIT                  = 40002
CONST IDI_INWINDOW                  = 100
CONST WM_GRAPHNOTIFY                = WM_USER + 13
CONST DSSetWindowPosition           = 156
CONST DSRenderFile                  = 44     '*
CONST DSput_Owner                   = 116
CONST DSput_WindowStyle             = 36
CONST DSSetNotifyWindow             = 52
CONST DSRun                         = 28
CONST DSStop                        = 36
CONST DSput_Visible                 = 36
CONST DSGetEvent                    = 32
CONST DSFreeEventParams             = 48
CONST EC_COMPLETE                   = &h1
CONST CLSCTX_INPROC_SERVER          = 1
CONST CLSCTX_INPROC_HANDLER         = 2
CONST CLSCTX_LOCAL_SERVER           = 4
CONST CLSCTX_REMOTE_SERVER          = 16
CONST CLSCTX_NO_CODE_DOWNLOAD       = 400
CONST CLSCTX_NO_FAILURE_LOG         = 4000
CONST CLSCTX_SERVER                 = CLSCTX_INPROC_SERVER OR CLSCTX_LOCAL_SERVER OR CLSCTX_REMOTE_SERVER
CONST CLSCTX_ALL                    = CLSCTX_INPROC_HANDLER OR CLSCTX_SERVER
CONST CLSCTX_INPROC                 = CLSCTX_INPROC_SERVER OR CLSCTX_INPROC_HANDLER


DIM hWndX         AS LONG
DIM hr            AS LONG
DIM evCode        AS LONG
DIM DSParam1      AS LONG
DIM DSParam2      AS LONG
DIM grc           AS RECT
  ' Collection of interfaces
DIM pif    AS DWORD ' IBaseFilter
DIM pigb   AS DWORD ' IGraphBuilder
DIM pimc   AS DWORD ' IMediaControl
DIM pimex  AS DWORD ' IMediaEventEx
DIM pivw   AS DWORD ' IVideoWindow
'________________________________________________________________________________
'                                 Procedures
DECLARE FUNCTION GetOpenFileName LIB "COMDLG32.DLL" ALIAS "GetOpenFileNameA" (lpofn AS OPENFILENAME) AS LONG
DECLARE FUNCTION GetClipFileName(szName AS STRING) AS LONG
DECLARE FUNCTION WndProc (BYVAL hwnd AS LONG, BYVAL message AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG
DECLARE FUNCTION RELEASE(BYREF x AS LONG) AS LONG
DECLARE SUB PlayMovieInWindow (szFile AS STRING)
DECLARE SUB RELEASEALL()
'________________________________________________________________________________
'
SUB PlayMovieInWindow (szFile AS STRING)
      DIM wFile AS STRING * MAX_PATH * 2

      CALL MultiByteToWideChar(CP_ACP, 0, BYVAL VARPTR(szFile), -1, BYVAL VARPTR(wFile), MAX_PATH )
      DIM CLSID_FilterGraph AS STRING *16
      DIM IID_IGraphBuilder AS STRING *16
      DIM IID_IMediaControl AS STRING *16
      DIM IID_IMediaEventEx AS STRING *16
      DIM IID_IVideoWindow  AS STRING *16
        CLSID_FilterGraph = GUID$("{e436ebb3-524f-11ce-9f53-0020af0ba770}")
        IID_IGraphBuilder = GUID$("{56a868a9-0ad4-11ce-b03a-0020af0ba770}")
        IID_IMediaControl = GUID$("{56A868B1-0AD4-11CE-B03A-0020AF0BA770}")
        IID_IMediaEventEx = GUID$("{56A868C0-0AD4-11CE-B03A-0020AF0BA770}")
        IID_IVideoWindow  = GUID$("{56A868B4-0AD4-11CE-B03A-0020AF0BA770}")
      hr = CoCreateInstance(BYVAL VARPTR(CLSID_FilterGraph), BYVAL NULL, CLSCTX_INPROC_SERVER,_
                            BYVAL VARPTR(IID_IGraphBuilder), pigb)
      IF hr = 0 THEN
        ' QueryInterface for some basic interfaces
        hr = hr + MCALL(pigb,DDQueryInterface,VARPTR(IID_IMediaControl), VARPTR(pimc))
        hr = hr + MCALL(pigb,DDQueryInterface,VARPTR(IID_IMediaEventEx), VARPTR(pimex))
        hr = hr + MCALL(pigb,DDQueryInterface,VARPTR(IID_IVideoWindow),  VARPTR(pivw))
        hr = hr + MCALL(pimc,DSRenderFile, VARPTR(wFile), NULL)
        hr = hr + MCALL(pivw,DSput_Owner, hWndX, NULL)
        hr = hr + MCALL(pivw,DSput_WindowStyle, WS_CHILD OR WS_CLIPSIBLINGS OR WS_CLIPCHILDREN)
        ' Have the graph signal event via window callbacks for performance
        hr = hr + MCALL(pimex,DSSetNotifyWindow, hWndX, WM_GRAPHNOTIFY, 0)
        GetClientRect hWndX, grc		'get relative size of Client area, top and left = 0
        hr = hr + MCALL(pivw,DSSetWindowPosition, grc.nleft, grc.ntop, grc.nright, grc.nbottom)
        ' Run the graph if RenderFile succeeded
        IF hr = 0 THEN
                CALL MCALL (pimc,DSRun)
        END IF
      END IF
END SUB
'****************************
'  GetClipFileName Procedure
'****************************
FUNCTION GetClipFileName(szName AS STRING) AS STRING
      DIM OpenDialog AS QOPENDIALOG

		OpenDialog.Filer = "Video files (*.mpg; *.mpeg; *.avi; *.mov; *.qt)" & $NUL & "*.mpg; *.mpeg; *.avi; *.mov; *.qt" & $NUL & $NUL
		OpenDialog.FilerIndex =		1
		IF OpenDialog.Execute THEN
			GetClipFileName = OpenDialog.FileName
		ELSE
			GetClipFileName = ""
		END IF			
END FUNCTION
'****************************
'    Windows Procedure
'****************************
FUNCTION WndProc (BYVAL hwnd AS LONG, BYVAL message AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG
      DIM szFilename AS STRING *MAX_PATH
      SELECT CASE message
          CASE WM_SIZE:
            GetClientRect hWndX, grc
            IF pivw <> 0 THEN _
               CALL MCALL(pivw,DSSetWindowPosition, grc.nleft, grc.ntop, grc.nright, grc.nbottom)
          CASE WM_COMMAND:
            SELECT CASE wParam
                CASE ID_FILE_OPENCLIP:
                  IF GetClipFileName(szFilename) <> 0 THEN BEEP
                       CALL PlayMovieInWindow(szFilename)
                CASE ID_FILE_EXIT:
                      IF pimc <> 0 THEN _
                        CALL MCALL (pimc,DSStop)
                      IF pivw <> 0 THEN ' Relinquish ownership  after hiding
                        CALL MCALL (pivw,DSput_Visible,OAFALSE)
                        CALL MCALL (pivw,DSput_Owner,NULL)
                        CALL RELEASE(pivw)
                      END IF
                      ! CALL RELEASEALL
                      CALL PostQuitMessage(0)
                END SELECT
          CASE WM_GRAPHNOTIFY:
            WHILE MCALL(pimex,DSGetEvent,VARPTR(evCode), VARPTR(DSParam1), VARPTR(DSParam2), 0)
               ' Spin through the events
                hr = MCALL(pimex,DSFreeEventParams, evCode, DSParam1, DSParam2)
                IF EC_COMPLETE = evCode THEN
                    ' Finished
                    IF pivw THEN
                           ' Relinquish ownership after hiding
                        CALL MCALL (pivw,DSput_Visible, OAFALSE)
                        CALL MCALL (pivw,DSput_Owner, NULL)
                        CALL RELEASE(pivw)
                    END IF
                       ! CALL RELEASEALL
                  END IF ' Finished
             WEND
          CASE WM_DESTROY:
            ! CALL RELEASEALL
            CALL PostQuitMessage(0)
          CASE ELSE
          FUNCTION = DefWindowProc(hWnd, message, wParam, lParam): EXIT FUNCTION
      END SELECT
      FUNCTION = FALSE: EXIT FUNCTION
END FUNCTION
'****************************
'         WinMain
'****************************
FUNCTION WINMAIN(BYVAL  hInstance   AS LONG, _
                 BYVAL  hPrevInst   AS LONG, _
                 BYVAL  lpszCmdLine AS STRING PTR, _
                 BYVAL  nCmdShow    AS LONG) AS LONG

      DIM msg         AS tagMsg
      DIM wndclassX   AS WNDCLASS
      DIM szAppName   AS STRING *255
      szAppName = "DirectShow"
      ' OLE subsystem requires applications to initialize things first!
      hr = CoInitialize(BYVAL NULL)
      IF ISFALSE(hr) THEN
          CALL MessageBox(BYVAL NULL, "Could not initialize COM","DX Show", MB_ICONERROR OR MB_OK )
          FUNCTION = hr: EXIT FUNCTION
      END IF
      wndclassX.style         = CS_HREDRAW OR CS_VREDRAW
      wndclassX.lpfnWndProc   = CODEPTR(WndProc)
      wndclassX.cbClsExtra    = 0
      wndclassX.cbWndExtra    = 0
      wndclassX.hInstance     = hInstance
      wndclassX.hIcon         = LoadIcon (NULL,BYVAL IDI_APPLICATION)
      wndclassX.hCursor       = LoadCursor (NULL,BYVAL IDC_ARROW)
      wndclassX.hbrBackground = GetStockObject(BLACK_BRUSH)
      wndclassX.lpszMenuName  = MAKDWD(IDR_MENU,0)
      wndclassX.lpszClassName = VARPTR(szAppName)
      RegisterClass wndclassX
      hWndX = CreateWindow(szAppName,_
        "DirectShow example",_
        WS_OVERLAPPEDWINDOW,_
        CW_USEDEFAULT,_
        CW_USEDEFAULT,_
        CW_USEDEFAULT,_
        CW_USEDEFAULT,_
        0,_
        0,_
        hInstance,_
        0)
      ShowWindow   hWndX, SW_NORMAL
      UpdateWindow hWndX
      WHILE GetMessage(msg, NULL,0,0)
           TranslateMessage   msg
           DispatchMessage    msg
      WEND
      ' Finished with OLE subsystem
      CoUninitialize
      FUNCTION =  msg.wParam
END FUNCTION
'****************************
'    RELEASE Procedure
'****************************
FUNCTION RELEASE(BYREF x AS LONG) AS LONG
      IF x <> 0 THEN
        CALL MCALL(x,DDRelease)
        ! mov x,0
      END IF
END FUNCTION
'****************************
'    RELEASEALL Procedure
'****************************
SUB RELEASEALL()
     CALL RELEASE(pif)
     CALL RELEASE(pigb)
     CALL RELEASE(pimc)
     CALL RELEASE(pimex)
END SUB

------------------
 
