//------------------------------------------------------------------------------ // File: Bdasampl.cpp // // Desc: Sample code implementing BDA graph building. // // Copyright (c) 2000-2001, Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ #include "bdasampl.h" #include "graph.h" #include "resource.h" #include #include // Globals HWND hwndMain; HWND g_hwndDlg; HINSTANCE hInst; TCHAR szAppName[] = TEXT("BDASampl"); TCHAR szAppTitle[] = TEXT("BDA Sample"); CBDAFilterGraph* g_pfg = NULL; const int MAJOR_CHANNEL_LOWER_LIMIT = -1; const int MAJOR_CHANNEL_UPPER_LIMIT = 126; const int MINOR_CHANNEL_LOWER_LIMIT = -1; const int MINOR_CHANNEL_UPPER_LIMIT = 126; INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, INT nCmdShow) { MSG msg; HWND hwnd; WNDCLASS wndclass; HACCEL hAccel; hInst = hInstance; //initialize COM library HRESULT hr = CoInitializeEx (NULL, COINIT_MULTITHREADED); if (FAILED (hr)) { MessageBox( NULL, TEXT("Failed to load COM library!"), TEXT("Initialization Error"), MB_ICONEXCLAMATION ); return 0; } wndclass.style = 0; //CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInst; wndclass.hIcon = LoadIcon(hInst, TEXT("BDASAMPLICON")); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 2); wndclass.lpszMenuName = szAppName; wndclass.lpszClassName = szAppName; RegisterClass(&wndclass); hwnd = CreateWindow(szAppName, szAppTitle, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, 200, 200, 500, 280, NULL, NULL, hInst, NULL); ASSERT(hwnd); // Create the BDA filter graph and initialize its components g_pfg = new CBDAFilterGraph(); ASSERT(g_pfg); // If the graph failed to build, don't go any further. if (!g_pfg) { MessageBox(hwnd, TEXT("Failed to create the filter graph!"), TEXT("Initialization Error"), MB_ICONEXCLAMATION); return 0; } ShowWindow(hwnd, nCmdShow); hwndMain = hwnd; hAccel = LoadAccelerators(hInst, MAKEINTRESOURCE(ACC_GRAPH)); while(GetMessage(&msg, NULL, 0, 0) > 0) { if(!TranslateAccelerator(hwnd, hAccel, &msg)) { //if (!IsDialogMessage (hwnd, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } // Release the BDA components and clean up delete g_pfg; CoUninitialize (); return msg.wParam; } // WndProc LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: { DbgInitialise (hInst); break ; } case WM_SIZE: { if(g_pfg->m_fGraphBuilt) g_pfg->SetVideoWindow(hwndMain); break; } case WM_COMMAND: switch(LOWORD(wParam)) { case IDM_BUILD_ATSC: { if(FAILED(g_pfg->BuildGraph(ATSC))) { ErrorMessageBox(TEXT("Could not Build the ATSC BDA FilterGraph.")); } else { g_pfg->SetVideoWindow(hwndMain); } HMENU hMenu = GetSubMenu (GetMenu (hwnd), 1); EnableMenuItem (hMenu, IDM_BUILD_ATSC, MF_GRAYED | MF_BYCOMMAND); EnableMenuItem ( hMenu, IDM_STOP_GRAPH, (g_pfg->m_fGraphRunning) ? (MF_BYCOMMAND|MF_ENABLED) : (MF_BYCOMMAND|MF_GRAYED) ); EnableMenuItem ( hMenu, IDM_SELECT_CHANNEL, (g_pfg->m_fGraphBuilt) ? (MF_BYCOMMAND|MF_ENABLED) : (MF_BYCOMMAND|MF_GRAYED) ); break; } case IDM_RUN_GRAPH: { if(g_pfg->m_fGraphBuilt) { if(!g_pfg->m_fGraphRunning) { if(FAILED(g_pfg->RunGraph())) { ErrorMessageBox(TEXT("Could not play the FilterGraph.")); } } } else { ErrorMessageBox(TEXT("The FilterGraph is not yet built.")); } break; } case IDM_STOP_GRAPH: { if(g_pfg->m_fGraphBuilt) { if(g_pfg->m_fGraphRunning) { if(FAILED(g_pfg->StopGraph())) { ErrorMessageBox(TEXT("Could not stop the FilterGraph,")); } } } else { ErrorMessageBox(TEXT("The FilterGraph is not yet built.")); } HMENU hMenu = GetSubMenu (GetMenu (hwnd), 1); EnableMenuItem ( hMenu, IDM_SELECT_CHANNEL, MF_BYCOMMAND | MF_GRAYED); break; } case IDM_SELECT_CHANNEL: { if(g_pfg->m_fGraphBuilt) { g_hwndDlg = reinterpret_cast ( DialogBox( hInst, MAKEINTRESOURCE(IDD_SELECT_CHANNEL), hwnd, reinterpret_cast(SelectChannelDlgProc) ) ); } else { ErrorMessageBox(TEXT("The FilterGraph is not yet built.")); } break; } case IDM_ABOUT: { DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hwnd, reinterpret_cast(AboutDlgProc)); break; } case IDM_EXIT: { DbgTerminate(); PostQuitMessage(0); break; } default: break; } case WM_INITMENU: if(g_pfg->m_fGraphFailure) { EnableMenuItem((HMENU)wParam, IDM_BUILD_ATSC, MF_BYCOMMAND| MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_RUN_GRAPH, MF_BYCOMMAND| MF_GRAYED); EnableMenuItem((HMENU)wParam, IDM_STOP_GRAPH, MF_BYCOMMAND| MF_GRAYED); } else { EnableMenuItem((HMENU)wParam, IDM_RUN_GRAPH, g_pfg->m_fGraphRunning ? MF_BYCOMMAND|MF_GRAYED : MF_BYCOMMAND|MF_ENABLED); EnableMenuItem((HMENU)wParam, IDM_BUILD_ATSC, g_pfg->m_fGraphBuilt ? MF_BYCOMMAND|MF_GRAYED : MF_BYCOMMAND|MF_ENABLED); // we can stop viewing if it's currently viewing EnableMenuItem((HMENU)wParam, IDM_STOP_GRAPH, (g_pfg->m_fGraphRunning) ? MF_BYCOMMAND|MF_ENABLED : MF_BYCOMMAND|MF_GRAYED); } EnableMenuItem( (HMENU)wParam, IDM_SELECT_CHANNEL, g_pfg->m_fGraphBuilt ? MF_BYCOMMAND|MF_ENABLED : MF_BYCOMMAND|MF_GRAYED); break; case WM_CLOSE: case WM_DESTROY: DbgTerminate(); PostQuitMessage(0); break; default: break; } return DefWindowProc(hwnd, message, wParam, lParam); } // AboutDlgProc // // Dialog Procedure for the "about" dialog box. // BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_COMMAND: EndDialog(hwnd, TRUE); return TRUE; case WM_INITDIALOG: return TRUE; } return FALSE; } // SelectChannelDlgProc // Dialog Procedure for the "Select Channel" dialog box. // BOOL CALLBACK SelectChannelDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { LONG lChannelMaj = g_pfg->GetMajorChannel (); LONG lChannelMin = g_pfg->GetMinorChannel (); BOOL bRet = FALSE; switch(message) { case WM_INITDIALOG: { //refresh the controls SetDlgItemInt (hDlg, IDC_MAJOR_CHANNEL, lChannelMaj, TRUE); SetDlgItemInt (hDlg, IDC_MINOR_CHANNEL, lChannelMin, TRUE); //set the spin controls HWND hWndSpin = GetDlgItem (hDlg, IDC_SPIN_MAJOR); ::SendMessage( hWndSpin, UDM_SETRANGE32, static_cast (MINOR_CHANNEL_LOWER_LIMIT), static_cast (MAJOR_CHANNEL_UPPER_LIMIT) ); hWndSpin = GetDlgItem (hDlg, IDC_SPIN_MINOR); ::SendMessage( hWndSpin, UDM_SETRANGE32, static_cast (MINOR_CHANNEL_LOWER_LIMIT), static_cast (MINOR_CHANNEL_UPPER_LIMIT) ); break; } case WM_DESTROY: { EndDialog (hDlg, 0); return TRUE; } case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_ENTER: { lChannelMaj = (LONG) GetDlgItemInt(hDlg, IDC_MAJOR_CHANNEL, &bRet, TRUE); lChannelMin = (LONG) GetDlgItemInt(hDlg, IDC_MINOR_CHANNEL, &bRet, TRUE); g_pfg->ChangeChannel (lChannelMaj, lChannelMin); break; } case IDOK: { lChannelMaj = (LONG) GetDlgItemInt(hDlg, IDC_MAJOR_CHANNEL, &bRet, TRUE); lChannelMin = (LONG) GetDlgItemInt(hDlg, IDC_MINOR_CHANNEL, &bRet, TRUE); g_pfg->ChangeChannel (lChannelMaj, lChannelMin); } case IDCANCEL: { EndDialog (hDlg, 0); break; } } break; } } return FALSE; } // ErrorMessageBox // // Opens a Message box with a error message in it. The user can // select the OK button to continue. // VOID ErrorMessageBox(LPTSTR sz,...) { static TCHAR ach[2000]; va_list va; va_start(va, sz); wvsprintf(ach, sz, va); va_end(va); MessageBox(hwndMain, ach, NULL, MB_OK|MB_ICONEXCLAMATION|MB_TASKMODAL); }