示例#1
0
文件: OBSApi.cpp 项目: Demiguise/OBS
int OBSMessageBox(HWND hwnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT flags)
{
    if (LocaleIsRTL())
        flags |= MB_RTLREADING | MB_RIGHT;

    return MessageBox(hwnd, lpText, lpCaption, flags);
}
示例#2
0
文件: OBSApi.cpp 项目: Demiguise/OBS
HWND OBSCreateDialog(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
{
    if (!LocaleIsRTL())
        return CreateDialogParam(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);

    HRSRC dlg = FindResource(hInstance, lpTemplateName, RT_DIALOG);
    HGLOBAL rsc = LoadResource(hInstance, dlg);
    List<BYTE> tmpl;
    tmpl.InsertArray(0, (BYTE const*)LockResource(rsc), SizeofResource(hInstance, dlg));
    *(DWORD*)&tmpl[sizeof WORD * 2 + sizeof DWORD] |= WS_EX_LAYOUTRTL;
    return CreateDialogIndirectParam(hInstance, (LPCDLGTEMPLATE)&tmpl[0], hWndParent, lpDialogFunc, dwInitParam);
}
示例#3
0
文件: OBSApi.cpp 项目: Demiguise/OBS
void LocalizeMenu(HMENU hMenu, LocaleStringLookup *lookup)
{
    if(!lookup) lookup = locale;

    int itemCount = GetMenuItemCount(hMenu);
    if(itemCount == -1)
        return;

    bool bRTL = LocaleIsRTL(lookup);

    for(int i=0; i<itemCount; i++)
    {
        MENUITEMINFO mii;
        zero(&mii, sizeof(mii));
        mii.cbSize = sizeof(mii);
        mii.fMask = MIIM_SUBMENU|MIIM_STRING|MIIM_FTYPE;
        GetMenuItemInfo(hMenu, i, TRUE, &mii);

        if(mii.fType & MFT_SEPARATOR || mii.cch < 2)
            continue;

        HMENU hSubMenu = mii.hSubMenu;

        String strLookup;
        strLookup.SetLength(mii.cch);

        mii.fMask = MIIM_STRING;
        mii.dwTypeData = strLookup.Array();
        mii.cch = strLookup.Length()+1;
        GetMenuItemInfo(hMenu, i, TRUE, &mii);

        String strName;
        if(strLookup[0] == '.')
            strName = strLookup.Array()+1;
        else if(!lookup->HasLookup(strLookup))
            strName = strLookup;
        else
            strName = lookup->LookupString(strLookup);

        mii.fMask = MIIM_STRING|MIIM_FTYPE;
        mii.dwTypeData = strName.Array();

        SetMenuItemInfo(hMenu, i, TRUE, &mii);

        if(hSubMenu)
            LocalizeMenu(hSubMenu);
    }
}
示例#4
0
文件: OBSApi.cpp 项目: Demiguise/OBS
void LocalizeWindow(HWND hwnd, LocaleStringLookup *lookup)
{
    if(!lookup) lookup = locale;

    bool bRTL = LocaleIsRTL(lookup);

    int textLen = (int)SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
    String strText;
    strText.SetLength(textLen);
    GetWindowText(hwnd, strText, textLen+1);

    if(strText.IsValid() && lookup->HasLookup(strText))
        SetWindowText(hwnd, lookup->LookupString(strText));

    //-------------------------------

	RECT rect = { 0 };
	GetClientRect(hwnd, &rect);

    HWND hwndChild = GetWindow(hwnd, GW_CHILD);
    while(hwndChild)
    {
        int textLen = (int)SendMessage(hwndChild, WM_GETTEXTLENGTH, 0, 0);
        strText.SetLength(textLen);
        GetWindowText(hwndChild, strText, textLen+1);

        if(strText.IsValid())
        {
            if(strText[0] == '.')
                SetWindowText(hwndChild, strText.Array()+1);
            else
            {
                if(strText.IsValid() && lookup->HasLookup(strText))
                    SetWindowText(hwndChild, lookup->LookupString(strText));
            }
        }

        hwndChild = GetNextWindow(hwndChild, GW_HWNDNEXT);
    }
};
INT_PTR SettingsEncoding::ProcMessage(UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_INITDIALOG:
    {
        HWND hwndTemp;
        LocalizeWindow(hwnd);

        //--------------------------------------------

        bool showQSVConfigurationWarning = false;

        hasQSV = CheckQSVHardwareSupport(false, &showQSVConfigurationWarning);
        hasNVENC = CheckNVENCHardwareSupport(false);

        String vcodec = AppConfig->GetString(L"Video Encoding", L"Encoder");

        bool useQSV   = !!(vcodec == L"QSV");
        bool useNVENC = !!(vcodec == L"NVENC");
        bool usex264  = !useQSV && !useNVENC;

        SendMessage(GetDlgItem(hwnd, IDC_ENCODERX264),  BM_SETCHECK, usex264,  0);
        SendMessage(GetDlgItem(hwnd, IDC_ENCODERQSV),   BM_SETCHECK, useQSV,   0);
        SendMessage(GetDlgItem(hwnd, IDC_ENCODERNVENC), BM_SETCHECK, useNVENC, 0);

        EnableWindow(GetDlgItem(hwnd, IDC_ENCODERQSV), hasQSV || useQSV);
        EnableWindow(GetDlgItem(hwnd, IDC_ENCODERNVENC), hasNVENC || useNVENC);

        bool QSVOnUnsupportedWinVer = OSGetVersion() < 7 && IsKnownQSVCPUPlatform() && !hasQSV;
        ShowWindow(GetDlgItem(hwnd, IDC_QSV_WINVER_WARNING), QSVOnUnsupportedWinVer ? SW_SHOW : SW_HIDE);
        ShowWindow(GetDlgItem(hwnd, IDC_QSV_CONFIG_WARNING), !QSVOnUnsupportedWinVer && showQSVConfigurationWarning ? SW_SHOW : SW_HIDE);

        //--------------------------------------------

        HWND hwndToolTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL, WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP,
                                          CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                                          hwnd, NULL, hinstMain, NULL);

        TOOLINFO ti;
        zero(&ti, sizeof(ti));
        ti.cbSize = sizeof(ti);
        ti.uFlags = TTF_SUBCLASS|TTF_IDISHWND;
        ti.hwnd = hwnd;

        if (LocaleIsRTL())
            ti.uFlags |= TTF_RTLREADING;

        SendMessage(hwndToolTip, TTM_SETMAXTIPWIDTH, 0, 500);
        SendMessage(hwndToolTip, TTM_SETDELAYTIME, TTDT_AUTOPOP, 8000);

        //--------------------------------------------

        hwndTemp = GetDlgItem(hwnd, IDC_QUALITY);
        for(int i=0; i<=10; i++)
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)IntString(i).Array());

        LoadSettingComboString(hwndTemp, TEXT("Video Encoding"), TEXT("Quality"), TEXT("8"));

        ti.lpszText = (LPWSTR)Str("Settings.Encoding.Video.QualityTooltip");
        ti.uId = (UINT_PTR)hwndTemp;
        SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);

        //--------------------------------------------

        bool bUseCBR = AppConfig->GetInt(TEXT("Video Encoding"), TEXT("UseCBR"), 1) != 0;
        bool bPadCBR = AppConfig->GetInt(TEXT("Video Encoding"), TEXT("PadCBR"), 1) != 0;
        SendMessage(GetDlgItem(hwnd, IDC_USECBR), BM_SETCHECK, bUseCBR ? BST_CHECKED : BST_UNCHECKED, 0);
        SendMessage(GetDlgItem(hwnd, IDC_PADCBR), BM_SETCHECK, bPadCBR ? BST_CHECKED : BST_UNCHECKED, 0);
        EnableWindow(GetDlgItem(hwnd, IDC_QUALITY), !bUseCBR && (usex264 || useNVENC));
        EnableWindow(GetDlgItem(hwnd, IDC_PADCBR), bUseCBR && (usex264 || useNVENC));

        ti.lpszText = (LPWSTR)Str("Settings.Advanced.PadCBRToolTip");
        ti.uId = (UINT_PTR)GetDlgItem(hwnd, IDC_PADCBR);
        SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);

        //--------------------------------------------

        int bitrate    = LoadSettingEditInt(GetDlgItem(hwnd, IDC_MAXBITRATE), TEXT("Video Encoding"), TEXT("MaxBitrate"), 1000);
        int buffersize = LoadSettingEditInt(GetDlgItem(hwnd, IDC_BUFFERSIZE), TEXT("Video Encoding"), TEXT("BufferSize"), 1000);

        ti.lpszText = (LPWSTR)Str("Settings.Encoding.Video.MaxBitRateTooltip");
        ti.uId = (UINT_PTR)GetDlgItem(hwnd, IDC_MAXBITRATE);
        SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);

        ti.lpszText = (LPWSTR)Str("Settings.Encoding.Video.BufferSizeTooltip");
        ti.uId = (UINT_PTR)GetDlgItem(hwnd, IDC_BUFFERSIZE);
        SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);

        //--------------------------------------------

        bool bUseBufferSize = AppConfig->GetInt(TEXT("Video Encoding"), TEXT("UseBufferSize"), 0) != 0;

        SendMessage(GetDlgItem(hwnd, IDC_CUSTOMBUFFER), BM_SETCHECK, bUseBufferSize ? BST_CHECKED : BST_UNCHECKED, 0);
        EnableWindow(GetDlgItem(hwnd, IDC_BUFFERSIZE), bUseBufferSize);

        //--------------------------------------------

        hwndTemp = GetDlgItem(hwnd, IDC_AUDIOCODEC);

        SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("MP3"));
#ifdef USE_AAC
        if(1)//OSGetVersion() >= 7)
        {
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("AAC"));
            LoadSettingComboString(hwndTemp, TEXT("Audio Encoding"), TEXT("Codec"), TEXT("AAC"));
        }
        else
            LoadSettingComboString(hwndTemp, TEXT("Audio Encoding"), TEXT("Codec"), TEXT("MP3"));
#else
        LoadSettingComboString(hwndTemp, TEXT("Audio Encoding"), TEXT("Codec"), TEXT("MP3"));
#endif

        //--------------------------------------------

        hwndTemp = GetDlgItem(hwnd, IDC_AUDIOFORMAT);

        BOOL isAAC = SendMessage(GetDlgItem(hwnd, IDC_AUDIOCODEC), CB_GETCURSEL, 0, 0) == 1;

        if (isAAC)
        {
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("44.1kHz"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("48kHz"));
        } else {
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("44.1kHz"));
        }

        LoadSettingComboInt(hwndTemp, TEXT("Audio Encoding"), TEXT("Format"), 1, isAAC ? 1 : 0);

        //--------------------------------------------

        hwndTemp = GetDlgItem(hwnd, IDC_AUDIOCHANNEL);

        SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("mono"));
        SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("stereo"));

        LoadSettingComboInt(hwndTemp, TEXT("Audio Encoding"), TEXT("isStereo"), 1, 1);

        //--------------------------------------------

        hwndTemp = GetDlgItem(hwnd, IDC_AUDIOBITRATE);

        BOOL isStereo = SendMessage(GetDlgItem(hwnd, IDC_AUDIOCHANNEL), CB_GETCURSEL, 0, 0) == 1;

        if (isStereo)
        {
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("48"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("64"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("80"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("96"));//default
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("112"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("128"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("160"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("192"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("256"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("320"));
        } else {
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("32"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("40"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("48"));//default
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("56"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("64"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("80"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("96"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("128"));
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("160"));
        }

        LoadSettingComboString(hwndTemp, TEXT("Audio Encoding"), TEXT("Bitrate"), isStereo ? TEXT("96") : TEXT("48"));

        //--------------------------------------------

        ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_HIDE);
        SetChangedSettings(false);
        return TRUE;
    }

    case WM_COMMAND:
    {
        bool bDataChanged = false;

        bool useQSV = SendMessage(GetDlgItem(hwnd, IDC_ENCODERQSV), BM_GETCHECK, 0, 0) == BST_CHECKED;
        bool useNVENC = SendMessage(GetDlgItem(hwnd, IDC_ENCODERNVENC), BM_GETCHECK, 0, 0) == BST_CHECKED;
        bool usex264 = !useQSV && !useNVENC;

        bool useCBR = SendMessage(GetDlgItem(hwnd, IDC_USECBR), BM_GETCHECK, 0, 0) == BST_CHECKED;

        switch(LOWORD(wParam))
        {
        case IDC_QUALITY:
        case IDC_AUDIOBITRATE:
            if(HIWORD(wParam) == CBN_SELCHANGE)
            {
                bDataChanged = true;
            }
            break;

        case IDC_AUDIOFORMAT:
            if(HIWORD(wParam) == CBN_SELCHANGE)
            {
                bDataChanged = true;
            }
            break;

        case IDC_AUDIOCHANNEL:
            if(HIWORD(wParam) == CBN_SELCHANGE)
            {
                HWND hwndAudioBitrate = GetDlgItem(hwnd, IDC_AUDIOBITRATE);
                SendMessage(hwndAudioBitrate, CB_RESETCONTENT, 0, 0);

                BOOL isStereo = SendMessage(GetDlgItem(hwnd, IDC_AUDIOCHANNEL), CB_GETCURSEL, 0, 0) == 1;

                if (isStereo)
                {
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("48"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("64"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("80"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("96"));//default
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("112"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("128"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("160"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("192"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("256"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("320"));
                } else {
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("32"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("40"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("48"));//default
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("56"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("64"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("80"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("96"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("128"));
                    SendMessage(hwndAudioBitrate, CB_ADDSTRING, 0, (LPARAM)TEXT("160"));
                }

                SendMessage(hwndAudioBitrate, CB_SETCURSEL, isStereo ? 3 : 2, 0);

                bDataChanged = true;
            }
            break;

        case IDC_AUDIOCODEC:
            if(HIWORD(wParam) == CBN_SELCHANGE)
            {
                HWND hwndAudioFormat = GetDlgItem(hwnd, IDC_AUDIOFORMAT);
                SendMessage(hwndAudioFormat, CB_RESETCONTENT, 0, 0);

                BOOL isAAC = SendMessage(GetDlgItem(hwnd, IDC_AUDIOCODEC), CB_GETCURSEL, 0, 0) == 1;

                if (isAAC) {
                    SendMessage(hwndAudioFormat, CB_ADDSTRING, 0, (LPARAM)TEXT("44.1kHz"));
                    SendMessage(hwndAudioFormat, CB_ADDSTRING, 0, (LPARAM)TEXT("48kHz"));
                } else {
                    SendMessage(hwndAudioFormat, CB_ADDSTRING, 0, (LPARAM)TEXT("44.1kHz"));
                }

                SendMessage(hwndAudioFormat, CB_SETCURSEL, isAAC ? 1 : 0, 0);

                bDataChanged = true;
            }
            break;

        case IDC_MAXBITRATE:
            if(HIWORD(wParam) == EN_CHANGE)
            {
                bool bCustomBuffer = SendMessage(GetDlgItem(hwnd, IDC_CUSTOMBUFFER), BM_GETCHECK, 0, 0) == BST_CHECKED;
                if (!bCustomBuffer)
                {
                    String strText = GetEditText((HWND)lParam);
                    SetWindowText(GetDlgItem(hwnd, IDC_BUFFERSIZE), strText);
                }

                if (App->GetVideoEncoder() && App->GetVideoEncoder()->DynamicBitrateSupported())
                    SetChangedSettings(true);
                else
                    bDataChanged = true;
            }
            break;

        case IDC_BUFFERSIZE:
            if (HIWORD(wParam) == EN_CHANGE)
            {
                if (App->GetVideoEncoder() && App->GetVideoEncoder()->DynamicBitrateSupported())
                    SetChangedSettings(true);
                else
                    bDataChanged = true;
            }
            break;

        case IDC_ENCODERX264:
        case IDC_ENCODERQSV:
        case IDC_ENCODERNVENC:
            if (HIWORD(wParam) == BN_CLICKED)
                bDataChanged = true;

            EnableWindow(GetDlgItem(hwnd, IDC_QUALITY), !useCBR && (usex264 || useNVENC));
            EnableWindow(GetDlgItem(hwnd, IDC_PADCBR), useCBR && (usex264 || useNVENC));
            break;

        case IDC_CUSTOMBUFFER:
        case IDC_USECBR:
        case IDC_PADCBR:
            if (HIWORD(wParam) == BN_CLICKED)
            {
                bool bChecked = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED;
                if(LOWORD(wParam) == IDC_CUSTOMBUFFER)
                    EnableWindow(GetDlgItem(hwnd, IDC_BUFFERSIZE), bChecked);
                else if(LOWORD(wParam) == IDC_USECBR)
                {
                    EnableWindow(GetDlgItem(hwnd, IDC_QUALITY), !bChecked && (usex264 || useNVENC));
                    EnableWindow(GetDlgItem(hwnd, IDC_PADCBR), bChecked && (usex264 || useNVENC));
                }

                bDataChanged = true;
            }
            break;
        }

        if(bDataChanged)
        {
            if (App->GetVideoEncoder())
                ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW);
            SetChangedSettings(true);
        }
        break;
    }
    }
    return FALSE;
}
示例#6
0
INT_PTR SettingsVideo::ProcMessage(UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND hwndTemp;
    switch(message)
    {
        case WM_INITDIALOG:
            {
                LocalizeWindow(hwnd);

                if (LocaleIsRTL())
                {
                    RECT xRect, yRect;
                    GetWindowRect(GetDlgItem(hwnd, IDC_SIZEX), &xRect);
                    MapWindowPoints(HWND_DESKTOP, hwnd, (LPPOINT)&xRect.left, 2);
                    GetWindowRect(GetDlgItem(hwnd, IDC_SIZEY), &yRect);
                    MapWindowPoints(HWND_DESKTOP, hwnd, (LPPOINT)&yRect.left, 2);

                    SetWindowPos(GetDlgItem(hwnd, IDC_SIZEX), nullptr, yRect.left, yRect.top, 0, 0, SWP_NOSIZE);
                    SetWindowPos(GetDlgItem(hwnd, IDC_SIZEY), nullptr, xRect.left, xRect.top, 0, 0, SWP_NOSIZE);
                }

                //--------------------------------------------

                HWND hwndToolTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL, WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP,
                    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                    hwnd, NULL, hinstMain, NULL);

                TOOLINFO ti;
                zero(&ti, sizeof(ti));
                ti.cbSize = sizeof(ti);
                ti.uFlags = TTF_SUBCLASS|TTF_IDISHWND;
                ti.hwnd = hwnd;

                if (LocaleIsRTL())
                    ti.uFlags |= TTF_RTLREADING;

                SendMessage(hwndToolTip, TTM_SETMAXTIPWIDTH, 0, 500);
                SendMessage(hwndToolTip, TTM_SETDELAYTIME, TTDT_AUTOPOP, 8000);

                //--------------------------------------------

                DeviceOutputs outputs;
                GetDisplayDevices(outputs);

                hwndTemp = GetDlgItem(hwnd, IDC_DEVICE);
                for (UINT i=0; i<outputs.devices.Num(); i++) {
                    SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)outputs.devices[i].strDevice.Array());
                }

                UINT adapterID = GlobalConfig->GetInt(TEXT("Video"), TEXT("Adapter"), 0);
                if (adapterID >= outputs.devices.Num())
                    adapterID = 0;
                SendMessage(hwndTemp, CB_SETCURSEL, adapterID, 0);

                //--------------------------------------------

                hwndTemp = GetDlgItem(hwnd, IDC_MONITOR);

                App->monitors.Clear();
                EnumDisplayMonitors(NULL, NULL, (MONITORENUMPROC)MonitorInfoEnumProc, (LPARAM)&App->monitors);

                for(UINT i=0; i<App->monitors.Num(); i++)
                    SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)IntString(i+1).Array());

                int monitorID = LoadSettingComboInt(hwndTemp, TEXT("Video"), TEXT("Monitor"), 0, App->monitors.Num()-1);
                if(monitorID > (int)App->monitors.Num())
                    monitorID = 0;

                //--------------------------------------------

                SendMessage(GetDlgItem(hwnd, IDC_USECUSTOM), BM_SETCHECK, BST_CHECKED, 0);
                EnableWindow(GetDlgItem(hwnd, IDC_MONITOR), FALSE);

                //--------------------------------------------

                int cx, cy;
                if(!AppConfig->HasKey(TEXT("Video"), TEXT("BaseWidth")) || !AppConfig->HasKey(TEXT("Video"), TEXT("BaseHeight")))
                {
                    cx = App->monitors[monitorID].rect.right  - App->monitors[monitorID].rect.left;
                    cy = App->monitors[monitorID].rect.bottom - App->monitors[monitorID].rect.top;
                    AppConfig->SetInt(TEXT("Video"), TEXT("BaseWidth"),  cx);
                    AppConfig->SetInt(TEXT("Video"), TEXT("BaseHeight"), cy);
                }
                else
                {
                    cx = AppConfig->GetInt(TEXT("Video"), TEXT("BaseWidth"));
                    cy = AppConfig->GetInt(TEXT("Video"), TEXT("BaseHeight"));

                    if(cx < 128)        cx = 128;
                    else if(cx > 4096)  cx = 4096;

                    if(cy < 128)        cy = 128;
                    else if(cy > 4096)  cy = 4096;
                }

                RefreshAspect(hwnd, cx, cy);


                hwndTemp = GetDlgItem(hwnd, IDC_SIZEX);
                editProc = (FARPROC)GetWindowLongPtr(hwndTemp, GWLP_WNDPROC);
                SetWindowLongPtr(hwndTemp, GWLP_WNDPROC, (LONG_PTR)ResolutionEditSubclassProc);
                SetWindowText(hwndTemp, IntString(cx).Array());

                hwndTemp = GetDlgItem(hwnd, IDC_SIZEY);
                SetWindowLongPtr(hwndTemp, GWLP_WNDPROC, (LONG_PTR)ResolutionEditSubclassProc);
                SetWindowText(hwndTemp, IntString(cy).Array());

                //--------------------------------------------

                hwndTemp = GetDlgItem(hwnd, IDC_DISABLEAERO);

                if(OSGetVersion() == 8)
                    EnableWindow(hwndTemp, FALSE);

                BOOL bDisableAero = AppConfig->GetInt(TEXT("Video"), TEXT("DisableAero"), 0);
                SendMessage(hwndTemp, BM_SETCHECK, bDisableAero ? BST_CHECKED : 0, 0);

                ti.lpszText = (LPWSTR)Str("Settings.Video.DisableAeroTooltip");
                ti.uId = (UINT_PTR)hwndTemp;
                SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);

                //--------------------------------------------

                BOOL bUnlockFPS = AppConfig->GetInt(TEXT("Video"), TEXT("UnlockFPS"));
                int topFPS = bUnlockFPS ? 120 : 60;

                hwndTemp = GetDlgItem(hwnd, IDC_FPS);
                SendMessage(hwndTemp, UDM_SETRANGE32, 1, topFPS);

                int fps = AppConfig->GetInt(TEXT("Video"), TEXT("FPS"), 30);
                if(!AppConfig->HasKey(TEXT("Video"), TEXT("FPS")))
                {
                    AppConfig->SetInt(TEXT("Video"), TEXT("FPS"), 30);
                    fps = 30;
                }
                else if(fps < 1)
                {
                    AppConfig->SetInt(TEXT("Video"), TEXT("FPS"), 1);
                    fps = 1;
                }
                else if(fps > topFPS)
                {
                    AppConfig->SetInt(TEXT("Video"), TEXT("FPS"), topFPS);
                    fps = topFPS;
                }

                SendMessage(hwndTemp, UDM_SETPOS32, 0, fps);

                //--------------------------------------------

                hwndTemp = GetDlgItem(hwnd, IDC_DOWNSCALE);
                RefreshDownscales(hwndTemp, cx, cy);

                ti.lpszText = (LPWSTR)Str("Settings.Video.DownscaleTooltip");
                ti.uId = (UINT_PTR)hwndTemp;
                SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);

                //--------------------------------------------

                RefreshFilters(hwnd, true);

                //--------------------------------------------

                ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_HIDE);
                SetChangedSettings(false);

                return TRUE;
            }

        case WM_COMMAND:
            {
                bool bDataChanged = false;

                switch(LOWORD(wParam))
                {
                    case IDC_MONITOR:
                        {
                            if(HIWORD(wParam) != CBN_SELCHANGE)
                                break;

                            int sel = (int)SendMessage(GetDlgItem(hwnd, IDC_MONITOR), CB_GETCURSEL, 0, 0);
                            if(sel != CB_ERR)
                            {
                                if(sel >= (int)App->monitors.Num())
                                    sel = 0;

                                MonitorInfo &monitor = App->monitors[sel];

                                int cx, cy;
                                cx = monitor.rect.right  - monitor.rect.left;
                                cy = monitor.rect.bottom - monitor.rect.top;

                                SetWindowText(GetDlgItem(hwnd, IDC_SIZEX), IntString(cx).Array());
                                SetWindowText(GetDlgItem(hwnd, IDC_SIZEY), IntString(cy).Array());

                                RefreshAspect(hwnd, cx, cy);
                            }
                            break;
                        }

                    case IDC_USECUSTOM:
                        SendMessage(GetDlgItem(hwnd, IDC_SIZEX), EM_SETREADONLY, FALSE, 0);
                        SendMessage(GetDlgItem(hwnd, IDC_SIZEY), EM_SETREADONLY, FALSE, 0);
                        EnableWindow(GetDlgItem(hwnd, IDC_MONITOR), FALSE);
                        break;

                    case IDC_USEMONITOR:
                        {
                            SendMessage(GetDlgItem(hwnd, IDC_SIZEX), EM_SETREADONLY, TRUE, 0);
                            SendMessage(GetDlgItem(hwnd, IDC_SIZEY), EM_SETREADONLY, TRUE, 0);
                            EnableWindow(GetDlgItem(hwnd, IDC_MONITOR), TRUE);

                            int sel = (int)SendMessage(GetDlgItem(hwnd, IDC_MONITOR), CB_GETCURSEL, 0, 0);
                            if(sel != CB_ERR)
                            {
                                if(sel >= (int)App->monitors.Num())
                                    sel = 0;

                                MonitorInfo &monitor = App->monitors[sel];

                                int cx, cy;
                                cx = monitor.rect.right  - monitor.rect.left;
                                cy = monitor.rect.bottom - monitor.rect.top;

                                SetWindowText(GetDlgItem(hwnd, IDC_SIZEX), IntString(cx).Array());
                                SetWindowText(GetDlgItem(hwnd, IDC_SIZEY), IntString(cy).Array());

                                RefreshAspect(hwnd, cx, cy);
                            }
                            break;
                        }

                    case IDC_SIZEX:
                    case IDC_SIZEY:
                        {
                            if(HIWORD(wParam) != EN_CHANGE)
                                break;

                            int cx = GetEditText(GetDlgItem(hwnd, IDC_SIZEX)).ToInt();
                            int cy = GetEditText(GetDlgItem(hwnd, IDC_SIZEY)).ToInt();

                            if(cx < 128)        cx = 128;
                            else if(cx > 4096)  cx = 4096;

                            if(cy < 128)        cy = 128;
                            else if(cy > 4096)  cy = 4096;

                            RefreshDownscales(GetDlgItem(hwnd, IDC_DOWNSCALE), cx, cy);

                            RefreshAspect(hwnd, cx, cy);

                            bDataChanged = true;
                            break;
                        }

                    case IDC_DISABLEAERO:
                        if(HIWORD(wParam) == BN_CLICKED)
                            bDataChanged = true;
                        break;

                    case IDC_FPS_EDIT:
                        if(HIWORD(wParam) == EN_CHANGE)
                            bDataChanged = true;
                        break;

                    case IDC_DEVICE:
                    case IDC_FILTER:
                        if(HIWORD(wParam) == CBN_SELCHANGE)
                            bDataChanged = true;
                        break;

                    case IDC_DOWNSCALE:
                        if(HIWORD(wParam) == CBN_SELCHANGE)
                        {
                            bDataChanged = true;
                            RefreshFilters(hwnd, false);
                        }
                        break;
                }

                if(bDataChanged)
                {
                    if (App->GetVideoEncoder())
                        ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW);
                    SetChangedSettings(true);
                }
                break;
            }
    }
    return FALSE;
}
示例#7
0
INT_PTR SettingsAdvanced::ProcMessage(UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_INITDIALOG:
    {
        LocalizeWindow(hwnd);

        bool invalidSettings = false;

        //--------------------------------------------

        HWND hwndToolTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL, WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP,
                                          CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                                          hwnd, NULL, hinstMain, NULL);

        TOOLINFO ti;
        zero(&ti, sizeof(ti));
        ti.cbSize = sizeof(ti);
        ti.uFlags = TTF_SUBCLASS|TTF_IDISHWND;
        ti.hwnd = hwnd;

        if (LocaleIsRTL())
            ti.uFlags |= TTF_RTLREADING;

        SendMessage(hwndToolTip, TTM_SETMAXTIPWIDTH, 0, 500);
        SendMessage(hwndToolTip, TTM_SETDELAYTIME, TTDT_AUTOPOP, 14000);

        //------------------------------------

        UINT sceneBufferingTime = GlobalConfig->GetInt(TEXT("General"), TEXT("SceneBufferingTime"), 700);
        SendMessage(GetDlgItem(hwnd, IDC_SCENEBUFFERTIME), UDM_SETRANGE32, 60, 20000);
        SendMessage(GetDlgItem(hwnd, IDC_SCENEBUFFERTIME), UDM_SETPOS32, 0, sceneBufferingTime);

        //------------------------------------

        bool bUseMTOptimizations = AppConfig->GetInt(TEXT("General"), TEXT("UseMultithreadedOptimizations"), TRUE) != 0;
        SendMessage(GetDlgItem(hwnd, IDC_USEMULTITHREADEDOPTIMIZATIONS), BM_SETCHECK, bUseMTOptimizations ? BST_CHECKED : BST_UNCHECKED, 0);

        HWND hwndTemp = GetDlgItem(hwnd, IDC_PRIORITY);
        SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)Str("Settings.Advanced.Priority.High"));
        SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)Str("Settings.Advanced.Priority.AboveNormal"));
        SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)Str("Settings.Advanced.Priority.Normal"));
        SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)Str("Settings.Advanced.Priority.Idle"));

        CTSTR pStr = AppConfig->GetStringPtr(TEXT("General"), TEXT("Priority"), TEXT("Normal"));
        if (scmpi(pStr, TEXT("Idle")) == 0)
            SendMessage(hwndTemp, CB_SETCURSEL, 3, 0);
        else if (scmpi(pStr, TEXT("Above Normal")) == 0)
            SendMessage(hwndTemp, CB_SETCURSEL, 1, 0);
        else if (scmpi(pStr, TEXT("High")) == 0)
            SendMessage(hwndTemp, CB_SETCURSEL, 0, 0);
        else //Normal
            SendMessage(hwndTemp, CB_SETCURSEL, 2, 0);

        //------------------------------------

        bool bDisablePreviewEncoding = GlobalConfig->GetInt(TEXT("General"), TEXT("DisablePreviewEncoding"), false) != 0;
        SendMessage(GetDlgItem(hwnd, IDC_DISABLEPREVIEWENCODING), BM_SETCHECK, bDisablePreviewEncoding ? BST_CHECKED : BST_UNCHECKED, 0);

        //------------------------------------

        bool bAllowOtherHotkeyModifiers = GlobalConfig->GetInt(TEXT("General"), TEXT("AllowOtherHotkeyModifiers"), true) != 0;
        SendMessage(GetDlgItem(hwnd, IDC_ALLOWOTHERHOTKEYMODIFIERS), BM_SETCHECK, bAllowOtherHotkeyModifiers ? BST_CHECKED : BST_UNCHECKED, 0);

        //--------------------------------------------

        hwndTemp = GetDlgItem(hwnd, IDC_X264PROFILE);
        static const CTSTR profile_names[3] = {TEXT("main"), TEXT("high")};
        for(int i=0; i<2; i++)
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)profile_names[i]);

        LoadSettingComboString(hwndTemp, TEXT("Video Encoding"), TEXT("X264Profile"), TEXT("high"));

        //--------------------------------------------

        hwndTemp = GetDlgItem(hwnd, IDC_PRESET);
        static const CTSTR preset_names[8] = {TEXT("ultrafast"), TEXT("superfast"), TEXT("veryfast"), TEXT("faster"), TEXT("fast"), TEXT("medium"), TEXT("slow"), TEXT("slower")};
        for(int i=0; i<8; i++)
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)preset_names[i]);

        LoadSettingComboString(hwndTemp, TEXT("Video Encoding"), TEXT("Preset"), TEXT("veryfast"));

        ti.lpszText = (LPWSTR)Str("Settings.Advanced.VideoEncoderCPUTradeoffTooltip");
        ti.uId = (UINT_PTR)hwndTemp;
        SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);

        //------------------------------------

        bool bUseCFR = AppConfig->GetInt(TEXT("Video Encoding"), TEXT("UseCFR"), 1) != 0;
        SendMessage(GetDlgItem(hwnd, IDC_USECFR), BM_SETCHECK, bUseCFR ? BST_CHECKED : BST_UNCHECKED, 0);

        //------------------------------------

        bool bUseCustomX264Settings = AppConfig->GetInt(TEXT("Video Encoding"), TEXT("UseCustomSettings")) != 0;
        String strX264Settings = AppConfig->GetString(TEXT("Video Encoding"), TEXT("CustomSettings"));

        SendMessage(GetDlgItem(hwnd, IDC_USEVIDEOENCODERSETTINGS), BM_SETCHECK, bUseCustomX264Settings ? BST_CHECKED : BST_UNCHECKED, 0);
        SetWindowText(GetDlgItem(hwnd, IDC_VIDEOENCODERSETTINGS), strX264Settings);

        ti.lpszText = (LPWSTR)Str("Settings.Advanced.VideoEncoderSettingsTooltip");
        ti.uId = (UINT_PTR)GetDlgItem(hwnd, IDC_VIDEOENCODERSETTINGS);
        SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);

        ti.uId = (UINT_PTR)GetDlgItem(hwnd, IDC_USEVIDEOENCODERSETTINGS);
        SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);

        EnableWindow(GetDlgItem(hwnd, IDC_VIDEOENCODERSETTINGS), bUseCustomX264Settings);

        //--------------------------------------------

        UINT keyframeInt = AppConfig->GetInt(TEXT("Video Encoding"), TEXT("KeyframeInterval"), 0);
        SendMessage(GetDlgItem(hwnd, IDC_KEYFRAMEINTERVAL), UDM_SETRANGE32, 0, 20);
        SendMessage(GetDlgItem(hwnd, IDC_KEYFRAMEINTERVAL), UDM_SETPOS32, 0, keyframeInt);

        //--------------------------------------------

        bool bUnlockFPS = AppConfig->GetInt(TEXT("Video"), TEXT("UnlockFPS")) != 0;
        SendMessage(GetDlgItem(hwnd, IDC_UNLOCKHIGHFPS), BM_SETCHECK, bUnlockFPS ? BST_CHECKED : BST_UNCHECKED, 0);

        //------------------------------------

        String vencoder = AppConfig->GetString(L"Video Encoding", L"Encoder");

        bool bUseQSV = !!(vencoder == L"QSV");

        bool bUseNVENC = !!(vencoder == L"NVENC");

        SelectPresetDialog(bUseQSV, bUseNVENC);

        bool bQSVUseVideoEncoderSettings = AppConfig->GetInt(TEXT("Video Encoding"), TEXT("QSVUseVideoEncoderSettings")) != 0;
        SendMessage(GetDlgItem(hwnd, IDC_QSVUSEVIDEOENCODERSETTINGS), BM_SETCHECK, bQSVUseVideoEncoderSettings ? BST_CHECKED : BST_UNCHECKED, 0);

        String qsvSettings = AppConfig->GetString(TEXT("Video Encoding"), TEXT("CustomQSVSettings"));
        SetWindowText(GetDlgItem(hwnd, IDC_QSVVIDEOENCODERSETTINGS), qsvSettings);
        EnableWindow(GetDlgItem(hwnd, IDC_QSVVIDEOENCODERSETTINGS), bQSVUseVideoEncoderSettings);

        ti.lpszText = (LPWSTR)Str("Settings.Advanced.QSVUseVideoEncoderSettingsTooltip");
        ti.uId = (UINT_PTR)GetDlgItem(hwnd, IDC_QSVUSEVIDEOENCODERSETTINGS);
        SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);
        ti.uId = (UINT_PTR)GetDlgItem(hwnd, IDC_QSVVIDEOENCODERSETTINGS);
        SendMessage(hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);

        hwndTemp = GetDlgItem(hwnd, IDC_NVENCPRESET);
        static const CTSTR nv_preset_names[16] = {
            TEXT("Automatic"),
            TEXT("Streaming"),
            TEXT("Streaming (2pass)"),
            TEXT("High Quality"),
            TEXT("High Performance"),
            TEXT("Bluray Disk"),
            TEXT("Low Latency"),
            TEXT("High Performance Low Latency"),
            TEXT("High Quality Low Latency"),
            TEXT("Low Latency (2pass)"),
            TEXT("High Performance Low Latency (2pass)"),
            TEXT("High Quality Low Latency (2pass)"),
            TEXT("Lossless"),
            TEXT("High Performance Lossless"),
            TEXT("NVDefault"),
            NULL
        };
        for (int i = 0; nv_preset_names[i]; i++)
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)nv_preset_names[i]);

        LoadSettingComboString(hwndTemp, TEXT("Video Encoding"), TEXT("NVENCPreset"), nv_preset_names[0]);

        hwndTemp = GetDlgItem(hwnd, IDC_QSVPRESET);
        static const struct {
            CTSTR name;
            int id;
        } qsv_presets[] = {
            { L"1 (Best Quality)", 1 },
            { L"2", 2 },
            { L"3", 3 },
            { L"4 (Balanced)", 4 },
            { L"5", 5 },
            { L"6", 6 },
            { L"7 (Best Speed)", 7 }
        };
        for (int i = 0; i < _countof(qsv_presets); i++)
        {
            SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)qsv_presets[i].name);
            SendMessage(hwndTemp, CB_SETITEMDATA, i, qsv_presets[i].id);
        }
        int qsvPreset = AppConfig->GetInt(L"Video Encoding", L"QSVPreset", 1);
        if (qsvPreset < 1 || qsvPreset > 7) qsvPreset = 1;
        SendMessage(hwndTemp, CB_SETCURSEL, qsvPreset - 1, 0);

        //------------------------------------

        bool bSyncToVideoTime = AppConfig->GetInt(TEXT("Audio"), TEXT("SyncToVideoTime")) != 0;
        SendMessage(GetDlgItem(hwnd, IDC_SYNCTOVIDEOTIME), BM_SETCHECK, bSyncToVideoTime ? BST_CHECKED : BST_UNCHECKED, 0);

        //------------------------------------

        bool bUseMicQPC = GlobalConfig->GetInt(TEXT("Audio"), TEXT("UseMicQPC")) != 0;
        SendMessage(GetDlgItem(hwnd, IDC_USEMICQPC), BM_SETCHECK, bUseMicQPC ? BST_CHECKED : BST_UNCHECKED, 0);

        //------------------------------------

        BOOL bMicSyncFixHack = GlobalConfig->GetInt(TEXT("Audio"), TEXT("UseMicSyncFixHack"));
        SendMessage(GetDlgItem(hwnd, IDC_MICSYNCFIX), BM_SETCHECK, bMicSyncFixHack ? BST_CHECKED : BST_UNCHECKED, 0);

        //------------------------------------

        int bufferTime = GlobalConfig->GetInt(TEXT("General"), TEXT("SceneBufferingTime"), 700);

        int globalAudioTimeAdjust = GlobalConfig->GetInt(TEXT("Audio"), TEXT("GlobalAudioTimeAdjust"));
        SendMessage(GetDlgItem(hwnd, IDC_AUDIOTIMEADJUST), UDM_SETRANGE32, -bufferTime, 5000);
        SendMessage(GetDlgItem(hwnd, IDC_AUDIOTIMEADJUST), UDM_SETPOS32, 0, globalAudioTimeAdjust);

        //------------------------------------

        int lowLatencyFactor = AppConfig->GetInt(TEXT("Publish"), TEXT("LatencyFactor"), 20);
        SetDlgItemInt(hwnd, IDC_LATENCYTUNE, lowLatencyFactor, TRUE);

        int bLowLatencyAutoMethod = AppConfig->GetInt(TEXT("Publish"), TEXT("LowLatencyMethod"), 0);
        SendMessage(GetDlgItem(hwnd, IDC_LATENCYMETHOD), BM_SETCHECK, bLowLatencyAutoMethod ? BST_CHECKED : BST_UNCHECKED, 0);

        //------------------------------------

        MIB_IPADDRTABLE tempTable;
        DWORD dwSize = 0;
        if (GetIpAddrTable (&tempTable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER)
        {
            PMIB_IPADDRTABLE ipTable;

            ipTable = (PMIB_IPADDRTABLE)Allocate(dwSize);

            if (GetIpAddrTable (ipTable, &dwSize, TRUE) == NO_ERROR)
            {
                DWORD i;

                hwndTemp = GetDlgItem(hwnd, IDC_BINDIP);
                SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("Default"));

                for (i=0; i < ipTable->dwNumEntries; i++)
                {
                    String strAddress;
                    DWORD strLength = 32;

                    // don't allow binding to localhost
                    if ((ipTable->table[i].dwAddr & 0xFF) == 127)
                        continue;

                    strAddress.SetLength(strLength);

                    SOCKADDR_IN IP;

                    IP.sin_addr.S_un.S_addr = ipTable->table[i].dwAddr;
                    IP.sin_family = AF_INET;
                    IP.sin_port = 0;
                    zero(&IP.sin_zero, sizeof(IP.sin_zero));

                    WSAAddressToString ((LPSOCKADDR)&IP, sizeof(IP), NULL, strAddress.Array(), &strLength);
                    SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)strAddress.Array());
                }

                LoadSettingComboString(hwndTemp, TEXT("Publish"), TEXT("BindToIP"), TEXT("Default"));
            }

            Free(ipTable);
        }

        //need this as some of the dialog item sets above trigger the notifications
        ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_HIDE);
        SetChangedSettings(invalidSettings);
        return TRUE;
    }

    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDC_USEVIDEOENCODERSETTINGS:
            if(HIWORD(wParam) == BN_CLICKED)
            {
                BOOL bUseVideoEncoderSettings = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED;
                EnableWindow(GetDlgItem(hwnd, IDC_VIDEOENCODERSETTINGS), bUseVideoEncoderSettings);

                if (App->GetVideoEncoder())
                    ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW);
                SetChangedSettings(true);
            }
            break;

        case IDC_QSVUSEVIDEOENCODERSETTINGS:
            if (HIWORD(wParam) == BN_CLICKED)
            {
                bool useSettings = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED;
                EnableWindow(GetDlgItem(hwnd, IDC_QSVVIDEOENCODERSETTINGS), useSettings);

                if (App->GetVideoEncoder())
                    ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW);
                SetChangedSettings(true);
            }
            break;

        case IDC_KEYFRAMEINTERVAL_EDIT:
        case IDC_SCENEBUFFERTIME_EDIT:
        case IDC_AUDIOTIMEADJUST_EDIT:
        case IDC_VIDEOENCODERSETTINGS:
        case IDC_QSVVIDEOENCODERSETTINGS:
        case IDC_LATENCYTUNE:
            if(HIWORD(wParam) == EN_CHANGE)
            {
                if (App->GetVideoEncoder())
                    ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW);
                SetChangedSettings(true);
            }
            break;

        /*case IDC_TIMER1:
        case IDC_TIMER2:
        case IDC_TIMER3:
        case IDC_DISABLED3DCOMPATIBILITY:
            if(HIWORD(wParam) == BN_CLICKED)
            {
                ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW);
                SetChangedSettings(true);
            }
            break;*/

        case IDC_USESENDBUFFER:
            if(HIWORD(wParam) == BN_CLICKED)
            {
                BOOL bUseSendBuffer = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED;
                EnableWindow(GetDlgItem(hwnd, IDC_SENDBUFFERSIZE), bUseSendBuffer);

                if (App->GetVideoEncoder())
                    ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW);
                SetChangedSettings(true);
            }
            break;

        case IDC_PRESET:
            if(HIWORD(wParam) == CBN_SELCHANGE)
            {
                HWND hwndTemp = (HWND)lParam;

                String strNewPreset = GetCBText(hwndTemp);
                if (scmp(strNewPreset.Array(), TEXT("veryfast")))
                {
                    static BOOL bHasWarned = FALSE;
                    if (!bHasWarned && OBSMessageBox(hwnd, Str("Settings.Advanced.PresetWarning"), NULL, MB_ICONEXCLAMATION | MB_YESNO) == IDNO)
                        LoadSettingComboString(hwndTemp, TEXT("Video Encoding"), TEXT("Preset"), TEXT("veryfast"));
                    else
                        bHasWarned = TRUE;
                }

                SetChangedSettings(true);
                if (App->GetVideoEncoder())
                    ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW);
            }
            break;

        case IDC_X264PROFILE:
        case IDC_SENDBUFFERSIZE:
        case IDC_PRIORITY:
        case IDC_BINDIP:
        case IDC_NVENCPRESET:
        case IDC_QSVPRESET:
            if(HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE)
            {
                if (App->GetVideoEncoder())
                    ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW);
                SetChangedSettings(true);
            }
            break;

        case IDC_DISABLEPREVIEWENCODING:
        case IDC_ALLOWOTHERHOTKEYMODIFIERS:
        case IDC_MICSYNCFIX:
        case IDC_USEMICQPC:
        case IDC_SYNCTOVIDEOTIME:
        case IDC_USECFR:
        case IDC_USEMULTITHREADEDOPTIMIZATIONS:
        case IDC_UNLOCKHIGHFPS:
        case IDC_LATENCYMETHOD:
            if(HIWORD(wParam) == BN_CLICKED)
            {
                if (App->GetVideoEncoder())
                    ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW);
                SetChangedSettings(true);
            }
            break;
        }

    }
    return FALSE;
}