Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
1188 lines (934 sloc) 41.3 KB
//------------------------------------------------------------------------------
// 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<LPARAM>(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<CAboutDlg *>(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<LPARAM>(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<CSPLangDlg *>(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<WPARAM>(0), static_cast<LPARAM>(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<WPARAM>(0),
static_cast<LPARAM>(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<WPARAM>(0),
reinterpret_cast<LPARAM>(static_cast<PVOID>(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<WPARAM>(m_ulSPStream), static_cast<LPARAM>(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<LPARAM>(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<CAudioLangDlg *>(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<WPARAM>(0), static_cast<LPARAM>(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<WPARAM>(0),
static_cast<LPARAM>(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<WPARAM>(0),
reinterpret_cast<LPARAM>(static_cast<PVOID>(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<WPARAM>(m_ulAudioStream), static_cast<LPARAM>(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<LANGINFO *>(&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<LPARAM>(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<CAngleDlg *>(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<WPARAM>(0), static_cast<LPARAM>(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<WPARAM>(0),
static_cast<LPARAM>(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<WPARAM>(0),
reinterpret_cast<LPARAM>(static_cast<PVOID>(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<WPARAM>(m_ulAngle - 1), static_cast<LPARAM>(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<LPARAM>(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<CChapterDlg *>(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<LPARAM>(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<CTitleDlg *>(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<LPARAM>(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<CTimeDlg *>(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<LPARAM>(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<CKaraokeDlg *>(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;
}