//------------------------------------------------------------------------------ // File: Dialogs.cpp // // Desc: This file contains the implementation for the various dialog wrapper // classes used in DvdSample. // // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ #include "resource.h" #include "DvdCore.h" // so we can directly access the IdvdInfo2 pointers #include "DvdSample.h" #include "Dialogs.h" #include "StringUtil.h" //------------------------------------------------------------------------------ // Name: struct LANGINFO // Desc: An easy way of getting the lang code from the DVD_SubpictureATR data //------------------------------------------------------------------------------ struct LANGINFO { WORD wRes1 ; // don't care, just skip 2 bytes WORD wLang ; // lang code as a WORD value WORD wRes2 ; // don't care, another 2 bytes }; //------------------------------------------------------------------------------ // CAboutDlg //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Name: CAboutDlg::CAboutDlg() // Desc: This is the CAboutDialog constructor. It initializes some variables // that we'll need later. //------------------------------------------------------------------------------ CAboutDlg::CAboutDlg(HINSTANCE hInstance, HWND hWnd): m_hInstance(hInstance), m_hWnd(hWnd) { DbgLog((LOG_TRACE, 5, TEXT("CAboutDlg::CAboutDlg()"))) ; } //------------------------------------------------------------------------------ // Name: CAboutDlg::~CAboutDlg() // Desc: This is the CAboutDialog destructor. //------------------------------------------------------------------------------ CAboutDlg::~CAboutDlg() { DbgLog((LOG_TRACE, 5, TEXT("CAboutDlg::~CAboutDlg()"))) ; } //------------------------------------------------------------------------------ // Name: CAboutDlg::DoModal() // Desc: This method creates the dialog box and handles its return value. //------------------------------------------------------------------------------ bool CAboutDlg::DoModal() { DbgLog((LOG_TRACE, 5, TEXT("CAboutDlg::DoModal()"))) ; int retVal; retVal = (int) DialogBoxParam(m_hInstance, MAKEINTRESOURCE(IDD_ABOUT), m_hWnd, (DLGPROC) CAboutDlg::AboutDlgProc, reinterpret_cast(this)); if (TRUE == retVal) return true; else return false; } //------------------------------------------------------------------------------ // Name: CAboutDlg::AboutDlgProc() // Desc: This method is the MessageProc for the CAboutDlg dialog box. It handles // all windows messages sent to the dialog window. //------------------------------------------------------------------------------ BOOL CALLBACK CAboutDlg::AboutDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static CAboutDlg * pThis; switch (message) { case WM_INITDIALOG: // get a pointer to the calling object pThis = reinterpret_cast(lParam); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; } //------------------------------------------------------------------------------ // CSPLangDlg //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Name: CSPLangDlg::CSPLangDlg() // Desc: This is the CSPLangDlg constructor. It initializes some variables // that we'll need later. //------------------------------------------------------------------------------ CSPLangDlg::CSPLangDlg(HINSTANCE hInstance, HWND hWnd): m_hInstance(hInstance), m_hWnd(hWnd) { DbgLog((LOG_TRACE, 5, TEXT("CSPLangDlg::CSPLangDlg()"))) ; } //------------------------------------------------------------------------------ // Name: CSPLangDlg::~CSPLangDlg() // Desc: This is the CSPLangDlg destructor. //------------------------------------------------------------------------------ CSPLangDlg::~CSPLangDlg() { DbgLog((LOG_TRACE, 5, TEXT("CSPLangDlg::~CSPLangDlg()"))) ; } //------------------------------------------------------------------------------ // Name: CAboutDlg::DoModa() // Desc: This method creates the dialog box and handles its return value. //------------------------------------------------------------------------------ bool CSPLangDlg::DoModal() { DbgLog((LOG_TRACE, 5, TEXT("CSPLangDlg::DoModal()"))) ; int retVal; retVal = (int) DialogBoxParam(m_hInstance, MAKEINTRESOURCE(IDD_SPDLG), m_hWnd, (DLGPROC) CSPLangDlg::SPDlgProc, reinterpret_cast(this)); if (TRUE == retVal) return true; else return false; } //------------------------------------------------------------------------------ // Name: CSPLangDlg::SPDlgProc() // Desc: This is the Dialog MessageProc for the subpicture language selection // dialog. //------------------------------------------------------------------------------ BOOL CALLBACK CSPLangDlg::SPDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static CSPLangDlg * pThis; switch (message) { case WM_INITDIALOG: // get a pointer to the calling object pThis = reinterpret_cast(lParam); if (0 < pThis->MakeSPStreamList(hDlg, IDC_SPLANG)) return TRUE; else { EndDialog(hDlg, FALSE); return FALSE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { HRESULT hr; // Set the SP state specified by the user pThis->m_bSPOn = IsDlgButtonChecked(hDlg, IDC_SHOWSP) ; hr = g_App.m_pDvdCore->m_pIDvdC2->SetSubpictureState(pThis->m_bSPOn, 0, NULL); ASSERT(SUCCEEDED(hr)) ; // Set the SP stream specific by the user LONG lStream; lStream = (LONG) SendDlgItemMessage(hDlg, IDC_SPLANG, CB_GETCURSEL, static_cast(0), static_cast(0)); if (CB_ERR == lStream) DbgLog((LOG_ERROR, 1, TEXT("WARNING: Couldn't get selected SP stream id (Error %d)"), lStream)) ; else { pThis->m_ulSPStream = lStream; hr = g_App.m_pDvdCore->m_pIDvdC2->SelectSubpictureStream(pThis->m_ulSPStream, 0, NULL) ; ASSERT(SUCCEEDED(hr)) ; } EndDialog(hDlg, TRUE); return TRUE; } // end of case brackets case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } //------------------------------------------------------------------------------ // Name: CSPLangDlg::MakeSPStreamList() // Desc: This method will populate our dialog box and return the number of SP // streams on this disc. We do some extra work to get around LCID limitations // on Win9x. //------------------------------------------------------------------------------ int CSPLangDlg::MakeSPStreamList(HWND hDlg, int iListID) { DbgLog((LOG_TRACE, 5, TEXT("CSPLangDlg::MakeSPStreamList(0x%lx, %d)"), hDlg, iListID)) ; if (Uninitialized == g_App.m_pDvdCore->GetState()) { DbgLog((LOG_ERROR, 0, TEXT("WARNING: DvdCore not initialized yet!"))) ; return 0 ; } // First clear the list box of all SP stream names SendDlgItemMessage(hDlg, iListID, CB_RESETCONTENT, static_cast(0), static_cast(0)) ; // Find out how many SP streams are there and what's the current lang. // This is our chance to find out if someone changed the SP lang through // DVD menu so that we can synch up our SP stream value now. HRESULT hr = g_App.m_pDvdCore->m_pIDvdI2->GetCurrentSubpicture(&m_ulNumLang, &m_ulSPStream, &m_bSPOn) ; if (FAILED(hr)) { MessageBox(m_hWnd, TEXT("Not ready to find language information"), TEXT("Warning"), MB_OK) ; return 0 ; } m_bSPOn = !m_bSPOn; // GetCurrentSubpicture returns IsDisabled, not IsOn LCID lcid; TCHAR szLang[50]; // Add all of the streams to the dialog box for (ULONG ulStream = 0; ulStream < m_ulNumLang; ulStream++) { if (FAILED(g_App.m_pDvdCore->m_pIDvdI2->GetSubpictureLanguage(ulStream, &lcid))) { DbgLog((LOG_ERROR, 0, TEXT("WARNING: GetSubpictureLanguage Failed!"))) ; return 0 ; } if (0 == lcid || 0 == GetLocaleInfo(lcid, LOCALE_SLANGUAGE, szLang, sizeof(szLang)/sizeof(szLang[0]))) // 0 is the failure code for GetLocaleInfo { GetSPLang(ulStream, szLang, sizeof(szLang)); } // Add the language to the listbox SendDlgItemMessage(hDlg, iListID, CB_ADDSTRING, static_cast(0), reinterpret_cast(static_cast(szLang))); } // set the current stream as the selected item if (m_ulNumLang > 0) // if there are any streams { int iRes = (int) SendDlgItemMessage(hDlg, iListID, CB_SETCURSEL, static_cast(m_ulSPStream), static_cast(0)) ; if (CB_ERR == iRes) DbgLog((LOG_ERROR, 1, TEXT("WARNING: Couldn't set %ld as selected SP stream id (Error %d)"), m_ulSPStream, iRes)) ; } // set the checkbox to refect the current SP state CheckDlgButton(hDlg, IDC_SHOWSP, m_bSPOn ? BST_CHECKED : BST_UNCHECKED) ; return m_ulNumLang; } //------------------------------------------------------------------------------ // Name: CSPLangDlg::GetSPLang() // Desc: This method gets the LCID language code and looks up the subpicture // language based on that. This is to get around problems with Win95 where // not all LCID's are recognized. //------------------------------------------------------------------------------ bool CSPLangDlg::GetSPLang(ULONG ulStream, TCHAR * buffer, int iBufLen) { DbgLog((LOG_TRACE, 5, TEXT("CSPLangDlg::GetSPLang()"))) ; DVD_SubpictureAttributes SPATR ; HRESULT hr = g_App.m_pDvdCore->m_pIDvdI2->GetSubpictureAttributes(ulStream, &SPATR); ASSERT(SUCCEEDED(hr)) ; return g_App.m_pLangLookup->GetLangString(SPATR.Language, buffer, iBufLen) ; } //------------------------------------------------------------------------------ // CAudioLangDlg //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Name: CAudioLangDlg::CAudioLangDlg() // Desc: This is the CAudioLangDlg Constructor. //------------------------------------------------------------------------------ CAudioLangDlg::CAudioLangDlg(HINSTANCE hInstance, HWND hWnd): m_hInstance(hInstance), m_hWnd(hWnd) { DbgLog((LOG_TRACE, 5, TEXT("CAudioLangDlg::CAudioLangDlg()"))) ; } //------------------------------------------------------------------------------ // Name: CAudioLangDlg::~CAudioLangDlg() // Desc: This is the CAudioLangDlg destructor. //------------------------------------------------------------------------------ CAudioLangDlg::~CAudioLangDlg() { DbgLog((LOG_TRACE, 5, TEXT("CAudioLangDlg::~CAudioLangDlg()"))) ; } //------------------------------------------------------------------------------ // Name: CAudioLangDlg::DoModal() // Desc: This method creates the dialog box and handles its return value. //------------------------------------------------------------------------------ bool CAudioLangDlg::DoModal() { DbgLog((LOG_TRACE, 5, TEXT("CAudioLangDlg::DoModal()"))) ; int retVal; retVal = (int) DialogBoxParam(m_hInstance, MAKEINTRESOURCE(IDD_AUDIODLG), m_hWnd, (DLGPROC) CAudioLangDlg::AudioDlgProc, reinterpret_cast(this)); if (TRUE == retVal) return true; else return false; } //------------------------------------------------------------------------------ // Name: CAudioLangDlg::AudioDlgProc() // Desc: This is the Dialog MessageProc for the audio language selection // dialog. //------------------------------------------------------------------------------ BOOL CALLBACK CAudioLangDlg::AudioDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static CAudioLangDlg * pThis; switch (message) { case WM_INITDIALOG: pThis = reinterpret_cast(lParam); // get a pointer to the calling object if (0 < pThis->MakeAudioStreamList(hDlg, IDC_AUDIOLANG)) return TRUE; else { EndDialog(hDlg, FALSE); return FALSE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { HRESULT hr; // Set the audio stream specific by the user LONG lStream; lStream = (LONG) SendDlgItemMessage(hDlg, IDC_AUDIOLANG, CB_GETCURSEL, static_cast(0), static_cast(0)); if (CB_ERR == lStream) DbgLog((LOG_ERROR, 1, TEXT("WARNING: Couldn't get selected Audio stream ID (Error %d)"), lStream)) ; else { pThis->m_ulAudioStream = lStream; hr = g_App.m_pDvdCore->m_pIDvdC2->SelectAudioStream(pThis->m_ulAudioStream, 0, NULL) ; ASSERT(SUCCEEDED(hr)) ; } EndDialog(hDlg, TRUE); return TRUE; } // end of case brackets case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } //------------------------------------------------------------------------------ // Name: CAudioLangDlg::MakeAudioStreamList() // Desc: This method will populate our dialog box and return the number of audio // streams on this disc. We do some extra work to get around LCID limitations // on Win9x. //------------------------------------------------------------------------------ int CAudioLangDlg::MakeAudioStreamList(HWND hDlg, int iListID) { DbgLog((LOG_TRACE, 5, TEXT("CAudioLangDlg::MakeAudioStreamList(0x%lx, %d)"), (ULONG) hDlg, iListID)) ; if (Uninitialized == g_App.m_pDvdCore->GetState()) { DbgLog((LOG_ERROR, 0, TEXT("WARNING: DvdCore not initialized yet!"))) ; return 0 ; } // First clear the list box of all audio stream names SendDlgItemMessage(hDlg, iListID, CB_RESETCONTENT, static_cast(0), static_cast(0)) ; // Find out how many audio streams are there and what's the current lang. // This is our chance to find out if someone changed the audio lang through // DVD menu so that we can synch up our audio stream value now. HRESULT hr = g_App.m_pDvdCore->m_pIDvdI2->GetCurrentAudio(&m_ulNumLang, &m_ulAudioStream) ; if (FAILED(hr)) { MessageBox(m_hWnd, TEXT("Not ready to find language information"), TEXT("Warning"), MB_OK) ; return 0 ; } LCID lcid; TCHAR szLang[50]; // Add all of the streams to the dialog box for (ULONG ulStream = 0; ulStream < m_ulNumLang; ulStream++) { if (FAILED(g_App.m_pDvdCore->m_pIDvdI2->GetAudioLanguage(ulStream, &lcid))) { DbgLog((LOG_ERROR, 0, TEXT("WARNING: GetAudioLanguage Failed!"))) ; return 0 ; } if (0 == lcid || 0 == GetLocaleInfo(lcid, LOCALE_SLANGUAGE, szLang, sizeof(szLang)/sizeof(szLang[0]))) // 0 is the failure code for GetLocaleInfo { GetAudioLang(ulStream, szLang, sizeof(szLang)); } // Add the language to the listbox SendDlgItemMessage(hDlg, iListID, CB_ADDSTRING, static_cast(0), reinterpret_cast(static_cast(szLang))); } // set the current stream as the selected item if (m_ulNumLang > 0) // if there are any streams { int iRes = (int) SendDlgItemMessage(hDlg, iListID, CB_SETCURSEL, static_cast(m_ulAudioStream), static_cast(0)) ; if (CB_ERR == iRes) DbgLog((LOG_ERROR, 1, TEXT("WARNING: Couldn't set %ld as selected audio stream ID (Error %d)"), m_ulAudioStream, iRes)) ; } return m_ulNumLang; } //------------------------------------------------------------------------------ // Name: CAudioLangDlg::GetAudioLang() // Desc: This method gets the LCID language code and looks up the audio // language based on that. This is to get around problems with Win95 where // not all LCID's are recognized. //------------------------------------------------------------------------------ bool CAudioLangDlg::GetAudioLang(ULONG ulStream, TCHAR * buffer, int iBufLen) { DbgLog((LOG_TRACE, 5, TEXT("CAudioLangDlg::GetAudioLang()"))) ; DVD_AudioAttributes AudATR ; LANGINFO * pSPATR = reinterpret_cast(&AudATR); HRESULT hr = g_App.m_pDvdCore->m_pIDvdI2->GetAudioAttributes(ulStream, &AudATR); ASSERT(SUCCEEDED(hr)) ; return g_App.m_pLangLookup->GetLangString(AudATR.Language, buffer, iBufLen) ; } //------------------------------------------------------------------------------ // CAngleDlg //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Name: CAngleDlg::CAngleDlg() // Desc: This method is the constructor for CAngleDlg //------------------------------------------------------------------------------ CAngleDlg::CAngleDlg(HINSTANCE hInstance, HWND hWnd): m_hInstance(hInstance), m_hWnd(hWnd) { DbgLog((LOG_TRACE, 5, TEXT("CAngleDlg::CAngleDlg()"))) ; } //------------------------------------------------------------------------------ // Name: CAngleDlg::CAngleDlg() // Desc: This method is the destructor for CAngleDlg //------------------------------------------------------------------------------ CAngleDlg::~CAngleDlg() { DbgLog((LOG_TRACE, 5, TEXT("CAngleDlg::~CAngleDlg()"))) ; } //------------------------------------------------------------------------------ // Name: CAngleDlg::DoModal() // Desc: This method creates the dialog and handles its return value. //------------------------------------------------------------------------------ bool CAngleDlg::DoModal() { DbgLog((LOG_TRACE, 5, TEXT("CAngleDlg::DoModal()"))) ; int retVal; retVal = (int) DialogBoxParam(m_hInstance, MAKEINTRESOURCE(IDD_ANGLEDLG), m_hWnd, (DLGPROC) CAngleDlg::AngleDlgProc, reinterpret_cast(this)); if (TRUE == retVal) return true; else return false; } //------------------------------------------------------------------------------ // Name: CAngleDlg::AngleDlgProc() // Desc: This is the Dialog MessageProc for the angle selection dialog //------------------------------------------------------------------------------ BOOL CALLBACK CAngleDlg::AngleDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static CAngleDlg * pThis; switch (message) { case WM_INITDIALOG: // get a pointer to the calling object pThis = reinterpret_cast(lParam); if (0 < pThis->MakeAngleList(hDlg, IDC_ANGLE)) return TRUE; else { EndDialog(hDlg, FALSE); return FALSE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { HRESULT hr; // Set the Angle specific by the user LONG lAngle; lAngle = (LONG) SendDlgItemMessage(hDlg, IDC_ANGLE, CB_GETCURSEL, static_cast(0), static_cast(0)); lAngle += 1; // angles start count at 1 so we have to account for that if (CB_ERR == lAngle) DbgLog((LOG_ERROR, 1, TEXT("WARNING: Couldn't get selected angle ID (Error %d)"), lAngle)) ; else { pThis->m_ulAngle = lAngle; hr = g_App.m_pDvdCore->m_pIDvdC2->SelectAngle(pThis->m_ulAngle, 0, NULL) ; ASSERT(SUCCEEDED(hr)) ; } EndDialog(hDlg, TRUE); return TRUE; } // end of case brackets case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } //------------------------------------------------------------------------------ // Name: CAngleDlg::MakeAngleList() // Desc: This method will populate our dialog box and return the number of angles // on this disc. //------------------------------------------------------------------------------ int CAngleDlg::MakeAngleList(HWND hDlg, int iListID) { DbgLog((LOG_TRACE, 5, TEXT("CAngleDlg::MakeAngleList(0x%lx, %d)"), hDlg, iListID)) ; if (Uninitialized == g_App.m_pDvdCore->GetState()) { DbgLog((LOG_ERROR, 0, TEXT("WARNING: DvdCore not initialized yet!"))) ; return 0 ; } // First clear the list box of all angle names SendDlgItemMessage(hDlg, iListID, CB_RESETCONTENT, static_cast(0), static_cast(0)) ; // Find out how many angles are there and what is the current angle. // This is our chance to find out if someone changed the angle through // DVD menu so that we can synch up our angle value now. HRESULT hr = g_App.m_pDvdCore->m_pIDvdI2->GetCurrentAngle(&m_ulNumAngle, &m_ulAngle) ; if (FAILED(hr)) { MessageBox(m_hWnd, TEXT("Not ready to find angle information"), TEXT("Warning"), MB_OK) ; return 0 ; } TCHAR szAngle[50]; // Add all of the angles to the dialog box for (ULONG ulAngle = 1; ulAngle <= m_ulNumAngle; ulAngle++) // angles start at 1 { hr = StringCchPrintf(szAngle, NUMELMS(szAngle), TEXT("Angle %u\0"), ulAngle); // Add the language to the listbox SendDlgItemMessage(hDlg, iListID, CB_ADDSTRING, static_cast(0), reinterpret_cast(static_cast(szAngle))); } // set the current angle as the selected item if (m_ulNumAngle > 0) // if there are any angles { // angles start at 1 so we have to subtract 1 from the angle number to match the // correct angle int iRes = (int) SendDlgItemMessage(hDlg, iListID, CB_SETCURSEL, static_cast(m_ulAngle - 1), static_cast(0)) ; if (CB_ERR == iRes) DbgLog((LOG_ERROR, 1, TEXT("WARNING: Couldn't set %ld as selected angle ID (Error %d)"), m_ulAngle, iRes)) ; } return m_ulNumAngle; } //------------------------------------------------------------------------------ // CChapterDlg //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Name: CChapterDlg::CChapterDlg() // Desc: This method is the constructor for CChapterDlg //------------------------------------------------------------------------------ CChapterDlg::CChapterDlg(HINSTANCE hInstance, HWND hWnd): m_hInstance(hInstance), m_hWnd(hWnd) { DbgLog((LOG_TRACE, 5, TEXT("CChapterDlg::CChapterDlg()"))) ; m_ulChapter = 1; // default value } //------------------------------------------------------------------------------ // Name: CChapterDlg::CChapterDlg() // Desc: This method is the destructor for CChapterDlg //------------------------------------------------------------------------------ CChapterDlg::~CChapterDlg() { DbgLog((LOG_TRACE, 5, TEXT("CChapterDlg::~CChapterDlg()"))) ; } //------------------------------------------------------------------------------ // Name: CChapterDlg::DoModal() // Desc: This method creates the dialog and handles its return value. //------------------------------------------------------------------------------ bool CChapterDlg::DoModal() { DbgLog((LOG_TRACE, 5, TEXT("CChapterDlg::DoModal()"))) ; int retVal; retVal = (int) DialogBoxParam(m_hInstance, MAKEINTRESOURCE(IDD_CHAPTERDLG), m_hWnd, (DLGPROC) CChapterDlg::ChapterDlgProc, reinterpret_cast(this)); if (TRUE == retVal) return true; else return false; } //------------------------------------------------------------------------------ // Name: CChapterDlg::ChapterDlgProc() // Desc: This is the Dialog MessageProc for the Chapter selection dialog //------------------------------------------------------------------------------ BOOL CALLBACK CChapterDlg::ChapterDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static CChapterDlg * pThis; switch (message) { case WM_INITDIALOG: { pThis = reinterpret_cast(lParam); // get a pointer to the calling object // set default value TCHAR buf[10]; HRESULT hr = StringCchPrintf(buf, NUMELMS(buf), TEXT("%u\0"), pThis->m_ulChapter); SetDlgItemText(hDlg, IDC_PLAYCHAPTER, buf); //set up spin control HWND hEBox = GetDlgItem(hDlg, IDC_PLAYCHAPTER); CreateUpDownControl(WS_CHILD | WS_BORDER | WS_VISIBLE | UDS_SETBUDDYINT | UDS_ALIGNRIGHT, 10, 10, 50, 50, hDlg, ID_SPINCONTROL, pThis->m_hInstance, hEBox, 999, 1, 1); return TRUE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { // Set the Chapter specified by the user TCHAR buf[10]; GetDlgItemText(hDlg, IDC_PLAYCHAPTER, buf, sizeof(buf)/sizeof(TCHAR)); pThis->m_ulChapter = _ttoi(buf); EndDialog(hDlg, TRUE); return TRUE; } case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } //------------------------------------------------------------------------------ // CTitleDlg //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Name: CTitleDlg::CTitleDlg() // Desc: This method is the constructor for CTitleDlg //------------------------------------------------------------------------------ CTitleDlg::CTitleDlg(HINSTANCE hInstance, HWND hWnd): m_hInstance(hInstance), m_hWnd(hWnd) { DbgLog((LOG_TRACE, 5, TEXT("CTitleDlg::CTitleDlg"))) ; m_ulTitle = 1; // default value m_ulChapter = 1; } //------------------------------------------------------------------------------ // Name: CTitleDlg::CTitleDlg() // Desc: This method is the destructor for CTitleDlg //------------------------------------------------------------------------------ CTitleDlg::~CTitleDlg() { DbgLog((LOG_TRACE, 5, TEXT("CTitleDlg::~CTitleDlg"))) ; } //------------------------------------------------------------------------------ // Name: CTitleDlg::DoModal() // Desc: This method creates the dialog and handles its return value. //------------------------------------------------------------------------------ bool CTitleDlg::DoModal() { DbgLog((LOG_TRACE, 5, TEXT("CTitleDlg::DoModal"))) ; int retVal; retVal = (int) DialogBoxParam(m_hInstance, MAKEINTRESOURCE(IDD_TITLEDLG), m_hWnd, (DLGPROC) CTitleDlg::TitleDlgProc, reinterpret_cast(this)); if (TRUE == retVal) return true; else return false; } //------------------------------------------------------------------------------ // Name: CTitleDlg::TitleDlgProc() // Desc: This is the Dialog MessageProc for the Title selection dialog //------------------------------------------------------------------------------ BOOL CALLBACK CTitleDlg::TitleDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static CTitleDlg * pThis; switch (message) { case WM_INITDIALOG: { pThis = reinterpret_cast(lParam); // get a pointer to the calling object // set default values TCHAR buf[10]; HRESULT hr = StringCchPrintf(buf, NUMELMS(buf), TEXT("%u\0"), pThis->m_ulTitle); SetDlgItemText(hDlg, IDC_PLAYCHAPTER, buf); hr = StringCchPrintf(buf, NUMELMS(buf), TEXT("%u\0"), pThis->m_ulChapter); SetDlgItemText(hDlg, IDC_PLAYCHAPTER, buf); //set up spin control HWND hEBox = GetDlgItem(hDlg, IDC_PLAYCHAPTER); CreateUpDownControl(WS_CHILD | WS_BORDER | WS_VISIBLE | UDS_SETBUDDYINT | UDS_ALIGNRIGHT, 10, 10, 50, 50, hDlg, ID_SPINCONTROL, pThis->m_hInstance, hEBox, 999, 1, 1); hEBox = GetDlgItem(hDlg, IDC_PLAYTITLE); CreateUpDownControl(WS_CHILD | WS_BORDER | WS_VISIBLE | UDS_SETBUDDYINT | UDS_ALIGNRIGHT, 10, 10, 50, 50, hDlg, ID_SPINCONTROL, pThis->m_hInstance, hEBox, 99, 1, 1); return TRUE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { // Set the Title specified by the user TCHAR buf[10]; GetDlgItemText(hDlg, IDC_PLAYCHAPTER, buf, sizeof(buf)/sizeof(TCHAR)); pThis->m_ulChapter = _ttoi(buf); GetDlgItemText(hDlg, IDC_PLAYTITLE, buf, sizeof(buf)/sizeof(TCHAR)); pThis->m_ulTitle = _ttoi(buf); EndDialog(hDlg, TRUE); return TRUE; } case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } //------------------------------------------------------------------------------ // CTimeDlg //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Name: CTimeDlg::CTimeDlg() // Desc: This method is the constructor for CTimeDlg //------------------------------------------------------------------------------ CTimeDlg::CTimeDlg(HINSTANCE hInstance, HWND hWnd): m_hInstance(hInstance), m_hWnd(hWnd) { DbgLog((LOG_TRACE, 5, TEXT("CTimeDlg::CTimeDlg"))) ; ZeroMemory(&m_Time, sizeof(m_Time)); } //------------------------------------------------------------------------------ // Name: CTimeDlg::CTimeDlg() // Desc: This method is the destructor for CTimeDlg //------------------------------------------------------------------------------ CTimeDlg::~CTimeDlg() { DbgLog((LOG_TRACE, 5, TEXT("CTimeDlg::~CTimeDlg"))) ; } //------------------------------------------------------------------------------ // Name: CTimeDlg::DoModal() // Desc: This method creates the dialog and handles its return value. //------------------------------------------------------------------------------ bool CTimeDlg::DoModal() { DbgLog((LOG_TRACE, 5, TEXT("CTimeDlg::DoModal"))) ; int retVal; retVal = (int) DialogBoxParam(m_hInstance, MAKEINTRESOURCE(IDD_TIMEDLG), m_hWnd, (DLGPROC) CTimeDlg::TimeDlgProc, reinterpret_cast(this)); if (TRUE == retVal) return true; else return false; } //------------------------------------------------------------------------------ // Name: CTimeDlg::TimeDlgProc() // Desc: This is the Dialog MessageProc for the Time selection dialog //------------------------------------------------------------------------------ BOOL CALLBACK CTimeDlg::TimeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static CTimeDlg * pThis; switch (message) { case WM_INITDIALOG: { // get a pointer to the calling object pThis = reinterpret_cast(lParam); // set default values TCHAR buf[10]; HRESULT hr = StringCchPrintf(buf, NUMELMS(buf), TEXT("%u\0"), pThis->m_Time.bHours); SetDlgItemText(hDlg, IDC_HOURS, buf); hr = StringCchPrintf(buf, NUMELMS(buf), TEXT("%u\0"), pThis->m_Time.bMinutes); SetDlgItemText(hDlg, IDC_MINUTES, buf); hr = StringCchPrintf(buf, NUMELMS(buf), TEXT("%u\0"), pThis->m_Time.bSeconds); SetDlgItemText(hDlg, IDC_SECONDS, buf); //set up spin controls HWND hEBox = GetDlgItem(hDlg, IDC_HOURS); CreateUpDownControl(WS_CHILD | WS_BORDER | WS_VISIBLE | UDS_SETBUDDYINT | UDS_ALIGNRIGHT, 10, 10, 50, 50, hDlg, ID_SPINCONTROL, pThis->m_hInstance, hEBox, 99, 0, pThis->m_Time.bHours); hEBox = GetDlgItem(hDlg, IDC_MINUTES); CreateUpDownControl(WS_CHILD | WS_BORDER | WS_VISIBLE | UDS_SETBUDDYINT | UDS_ALIGNRIGHT, 10, 10, 50, 50, hDlg, ID_SPINCONTROL, pThis->m_hInstance, hEBox, 60, 0, pThis->m_Time.bMinutes); hEBox = GetDlgItem(hDlg, IDC_SECONDS); CreateUpDownControl(WS_CHILD | WS_BORDER | WS_VISIBLE | UDS_SETBUDDYINT | UDS_ALIGNRIGHT, 10, 10, 50, 50, hDlg, ID_SPINCONTROL, pThis->m_hInstance, hEBox, 60, 0, pThis->m_Time.bSeconds); return TRUE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { // Set the Time specified by the user TCHAR buf[10]; GetDlgItemText(hDlg, IDC_HOURS, buf, sizeof(buf)/sizeof(TCHAR)); pThis->m_Time.bHours = (BYTE) _ttoi(buf); GetDlgItemText(hDlg, IDC_MINUTES, buf, sizeof(buf)/sizeof(TCHAR)); pThis->m_Time.bMinutes = (BYTE) _ttoi(buf); GetDlgItemText(hDlg, IDC_SECONDS, buf, sizeof(buf)/sizeof(TCHAR)); pThis->m_Time.bSeconds = (BYTE) _ttoi(buf); EndDialog(hDlg, TRUE); return TRUE; } case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } //------------------------------------------------------------------------------ // CKaraokeDlg //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Name: CKaraokeDlg::CKaraokeDlg() // Desc: This method is the constructor for CKaraokeDlg //------------------------------------------------------------------------------ CKaraokeDlg::CKaraokeDlg(HINSTANCE hInstance, HWND hWnd): m_hInstance(hInstance), m_hWnd(hWnd) { DbgLog((LOG_TRACE, 5, TEXT("CKaraokeDlg::CKaraokeDlg"))) ; //ZeroMemory(&m_Karaoke, sizeof(m_Karaoke)); } //------------------------------------------------------------------------------ // Name: CKaraokeDlg::CKaraokeDlg() // Desc: This method is the destructor for CKaraokeDlg //------------------------------------------------------------------------------ CKaraokeDlg::~CKaraokeDlg() { DbgLog((LOG_TRACE, 5, TEXT("CKaraokeDlg::~CKaraokeDlg"))) ; } //------------------------------------------------------------------------------ // Name: CKaraokeDlg::DoModal() // Desc: This method establishes that there is karaoke data in the current audio // stream. If there is, it populates the dialog box and displays it. It also // handles the mixing. In a real application, it might be better to have a function // in CDvdCore which does the mixing, but we will violate encapsulation here to // make it easier to understand. // // This method mixes a given channel into both speakers. This can be controlled on // a per-speaker basis if so desired. //------------------------------------------------------------------------------ bool CKaraokeDlg::DoModal() { DbgLog((LOG_TRACE, 5, TEXT("CKaraokeDlg::DoModal"))) ; // first we should make sure that there is Karaoke Data available HRESULT hr; DVD_AudioAttributes audioAtr; hr = g_App.m_pDvdCore->m_pIDvdI2->GetAudioAttributes(DVD_STREAM_DATA_CURRENT, &audioAtr); if (FAILED(hr)) { MessageBox(m_hWnd, TEXT("GetAudioAttributes Failed"), TEXT("Error!"), MB_OK); return false; } if( DVD_AudioMode_Karaoke != audioAtr.AppMode ) { MessageBox(m_hWnd, TEXT("There is no Karaoke Data In This Audio Stream"), TEXT("Error!"), MB_OK); return false; } // if we get here, we are in a karaoke section DVD_KaraokeAttributes karaokeAtr; hr = g_App.m_pDvdCore->m_pIDvdI2->GetKaraokeAttributes(DVD_STREAM_DATA_CURRENT, &karaokeAtr ); if (FAILED(hr)) { MessageBox(m_hWnd, TEXT("GetKaraokeAttributes Failed"), TEXT("Error!"), MB_OK); return false; } // assign names to the various channels. Channels 0 and 1 are restricted m_pszChannel2 = KaraokeAsStr(karaokeAtr.wChannelContents[2]); m_pszChannel3 = KaraokeAsStr(karaokeAtr.wChannelContents[3]); m_pszChannel4 = KaraokeAsStr(karaokeAtr.wChannelContents[4]); int retVal; retVal = (int) DialogBoxParam(m_hInstance, MAKEINTRESOURCE(IDD_KARAOKEDLG), m_hWnd, (DLGPROC) CKaraokeDlg::KaraokeDlgProc, reinterpret_cast(this)); if (FALSE == retVal) { return false; } // else the user clicked OK ULONG ulMixFlags = NULL; // Initialize the flags variable to be blank INT chkChannel2, chkChannel3, chkChannel4; chkChannel2 = (INT) SendDlgItemMessage(m_hWnd, IDC_CHANNEL2, BM_GETCHECK, 0, 0); chkChannel3 = (INT) SendDlgItemMessage(m_hWnd, IDC_CHANNEL3, BM_GETCHECK, 0, 0); chkChannel4 = (INT) SendDlgItemMessage(m_hWnd, IDC_CHANNEL4, BM_GETCHECK, 0, 0); if (BST_CHECKED == chkChannel2) { ulMixFlags |= DVD_Mix_3to0; ulMixFlags |= DVD_Mix_3to1; } if (BST_CHECKED == chkChannel3) { ulMixFlags |= DVD_Mix_4to0; ulMixFlags |= DVD_Mix_4to1; } if (BST_CHECKED == chkChannel4) { ulMixFlags |= DVD_Mix_Lto0; ulMixFlags |= DVD_Mix_Lto1; } hr = g_App.m_pDvdCore->m_pIDvdC2->SelectKaraokeAudioPresentationMode(ulMixFlags); if (FAILED(hr)) { MessageBox(m_hWnd, TEXT("SelectKaraokeAudioPresentationMode Failed"), TEXT("Error!"), MB_OK); return false; } else return true; } //------------------------------------------------------------------------------ // Name: CKaraokeDlg::KaraokeDlgProc() // Desc: This is the Dialog MessageProc for the Karaoke selection dialog //------------------------------------------------------------------------------ BOOL CALLBACK CKaraokeDlg::KaraokeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static CKaraokeDlg * pThis; switch (message) { case WM_INITDIALOG: { pThis = reinterpret_cast(lParam); // get a pointer to the calling object SetDlgItemText(hDlg, IDC_CHANNEL2, pThis->m_pszChannel2); SetDlgItemText(hDlg, IDC_CHANNEL3, pThis->m_pszChannel3); SetDlgItemText(hDlg, IDC_CHANNEL4, pThis->m_pszChannel4); return TRUE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; }