Aleksoid1978 В добавление к предыдущему:
улучшение работы с интерлейсным выводом (postno=296) дополнение к нему (postno=360) (лучше не нажимать на ссылки, а подводить курсор к знаку вопроса после нее.)
сделал, чтобы AUTO-HDMI срабатывало при каждой смене медиа-контента.
.
Будь-то в плайлисте, или просто при открытии нового файла.
Для этого нужно оформить смену режимов как отдельную процедуру.
В [MineFrame.h]
после
void OpenSetupWindowTitle(CString fn = _T(""));
добавить
------------------------------------------------
void ChangeMonitorMode();
------------------------------------------------
в [MineFrame.cpp] в
Заменяем большой кусок
-----------------------------------------------------
dispmode& dm = AfxGetAppSettings().dmFullscreenRes;
m_dmBeforeFullscreen.fValid = false;
if(dm.fValid && fSwitchScreenResWhenHasTo)
{
....
}
------------------------------------------------------
на проверку с простым вызовом функции
-------------------------------------------------------
if(AfxGetAppSettings().dmFullscreenRes.fValid && fSwitchScreenResWhenHasTo) ChangeMonitorMode();
-------------------------------------------------------
После описание функции CMainFrame::ToggleFullscreen
вставляем описание новой функции (вся структура AppSettings нафиг не нужна, вытаскиваем оттуда только dmFullscreenRes и f_hmonitor)
-------------------------------------------------------------------------
void CMainFrame::ChangeMonitorMode()
{
dispmode& dm = AfxGetAppSettings().dmFullscreenRes;
CStringW mf_hmonitor = AfxGetAppSettings().f_hmonitor;
// Keep current settings of changed monitor Запоминаем текущие настройки изменяемого монитора
GetCurDispMode(m_dmBeforeFullscreen, mf_hmonitor);
m_dmBeforeFullscreen.fValid=false; //
// If not AUTO-HDMI mode
if (dm.freq > 0)
{
SetDispMode(dm, mf_hmonitor);
m_dmBeforeFullscreen.fValid=true; //Setting was changed смена параметров была
}
// If AUTO-HDMI mode
else
{
LONGLONG m_rtTimePerFrame = 1;
// if ExtractAvgTimePerFrame isn't executed then MediaFPS=10000000.0,
// dm1.freq=10000000 and SetDispMode isn't executed too.
BeginEnumFilters(pGB, pEF, pBF)
{
BeginEnumPins(pBF, pEP, pPin)
{
CMediaTypeEx mt;
PIN_DIRECTION dir;
if(FAILED(pPin->QueryDirection(&dir)) || dir != PINDIR_OUTPUT
|| FAILED(pPin->ConnectionMediaType(&mt))) continue;
ExtractAvgTimePerFrame (&mt, m_rtTimePerFrame);
if (m_rtTimePerFrame == 0) m_rtTimePerFrame=1;
}
EndEnumPins
}
EndEnumFilters
double MediaFPS = 10000000.0 / m_rtTimePerFrame;
dispmode dm1=dm;
dm1.freq = (int)(MediaFPS + 0.5);
if (dm.freq == -1)
{
if (dm1.freq == 24 || dm1.freq == 25 || dm1.freq == 30)
{
SetDispMode(dm1, mf_hmonitor);
m_dmBeforeFullscreen.fValid=true; //Setting was changed смена параметров была
}
}
if (dm.freq == -2)
{
if (dm1.freq == 24 || dm1.freq == 25 || dm1.freq == 30)
{
if (dm1.freq == 25) dm1.freq = 50;
if (dm1.freq == 30) dm1.freq = 60;
SetDispMode(dm1, mf_hmonitor);
m_dmBeforeFullscreen.fValid=true; //Setting was changed смена параметров была
}
}
}
}
---------------------------------------------
Это была только присказка, а сказка вот:
В [MineFrame.cpp] в самом конце описания функции CMainFrame::OpenMediaPrivate(CAutoPtr<OpenMediaData> pOMD)
перед PostMessage(WM_KICKIDLE); // calls main thread to update things
Вставляем
---------------------------------------
if (AfxGetAppSettings().dmFullscreenRes.fValid && m_fFullScreen) ChangeMonitorMode();
---------------------------------------
После открытия медиа-файла проверяется задействована ли фича смены параметров монитора и если прога в полноэкранном режиме, то вызывается команда на смену параметров монитора.
Есть только единственный маленький минус - после проигрывания последнего файла выставляются параметры для частоты предпоследнего файла. Чтобы было вообще все шоколадно, можно сделать в настройках смены режимов еще один комбобох с выбором дефолтных настроек, в которые будут сбрасываться настройки при закрытии программы.