Ejemplo n.º 1
0
        private void InitBuffers()
        {
            // query active paths from the current computer.
            int result = CCDWrapper.GetDisplayConfigBufferSizes(CCDWrapper.QueryDisplayFlags.OnlyActivePaths, out _numPathArrayElements, out _numModeInfoArrayElements);

            if (result != 0)
            {
                ServiceRegistration.Get <ILogger>().Error("RefreshRateChanger: GetDisplayConfigBufferSizes(...) returned {0}", result);
                return;
            }

            _pathInfoArray = new CCDWrapper.DisplayConfigPathInfo[_numPathArrayElements];
            _modeInfoArray = new CCDWrapper.DisplayConfigModeInfo[_numModeInfoArrayElements];

            // Get display configuration
            result = CCDWrapper.QueryDisplayConfig(CCDWrapper.QueryDisplayFlags.OnlyActivePaths, ref _numPathArrayElements, _pathInfoArray, ref _numModeInfoArrayElements, _modeInfoArray, IntPtr.Zero);
            if (result != 0)
            {
                ServiceRegistration.Get <ILogger>().Error("RefreshRateChanger: QueryDisplayConfig(...) returned {0}", result);
                return;
            }

            _initialized = true;
        }
Ejemplo n.º 2
0
        public bool SetRefreshRate(double refreshRate)
        {
            if (!_initialized)
            {
                return(false);
            }

            // Set proper numerator and denominator for refresh rate
            UInt32 newRefreshRate = (uint)(refreshRate * 1000);
            UInt32 numerator;
            UInt32 denominator;

            CCDWrapper.DisplayConfigScanLineOrdering scanLineOrdering;
            switch (newRefreshRate)
            {
            case 23976:
                numerator        = 24000;
                denominator      = 1001;
                scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive;
                break;

            case 24000:
                numerator        = 24000;
                denominator      = 1000;
                scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive;
                break;

            case 25000:
                numerator        = 25000;
                denominator      = 1000;
                scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive;
                break;

            case 29970:
                numerator        = 30000;
                denominator      = 1001;
                scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive;
                break;

            case 30000:
                numerator        = 30000;
                denominator      = 1000;
                scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive;
                break;

            case 50000:
                numerator        = 50000;
                denominator      = 1000;
                scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive;
                break;

            case 59940:
                numerator        = 60000;
                denominator      = 1001;
                scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive;
                break;

            case 60000:
                numerator        = 60000;
                denominator      = 1000;
                scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive;
                break;

            default:
                numerator        = newRefreshRate / 1000;
                denominator      = 1;
                scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive;
                break;
            }

            // Set refresh rate parameters in display config
            var modeIndex = _displayIndex * 2; // Array always contains "Source" and "Target" per display

            _modeInfoArray[modeIndex].TargetMode.TargetVideoSignalInfo.VerticalSyncFreq.Numerator   = numerator;
            _modeInfoArray[modeIndex].TargetMode.TargetVideoSignalInfo.VerticalSyncFreq.Denominator = denominator;
            _modeInfoArray[modeIndex].TargetMode.TargetVideoSignalInfo.ScanLineOrdering             = scanLineOrdering;

            // Validate new refresh rate
            CCDWrapper.SdcFlags flags = CCDWrapper.SdcFlags.Validate | CCDWrapper.SdcFlags.UseSuppliedDisplayConfig;
            long result = CCDWrapper.SetDisplayConfig(_numPathArrayElements, _pathInfoArray, _numModeInfoArrayElements, _modeInfoArray, flags);

            // Adding SDC_ALLOW_CHANGES to flags if validation failed
            if (result != 0)
            {
                ServiceRegistration.Get <ILogger>().Debug("RefreshRateChanger.SetDisplayConfig(...): SDC_VALIDATE of {0}/{1} failed", numerator, denominator);
                flags = CCDWrapper.SdcFlags.Apply | CCDWrapper.SdcFlags.UseSuppliedDisplayConfig | CCDWrapper.SdcFlags.AllowChanges;
            }
            else
            {
                ServiceRegistration.Get <ILogger>().Debug("RefreshRateChanger.SetDisplayConfig(...): SDC_VALIDATE of {0}/{1} succesful", numerator, denominator);
                flags = CCDWrapper.SdcFlags.Apply | CCDWrapper.SdcFlags.UseSuppliedDisplayConfig;
            }

            // Configuring display
            result = CCDWrapper.SetDisplayConfig(_numPathArrayElements, _pathInfoArray, _numModeInfoArrayElements, _modeInfoArray, flags);

            if (result != 0)
            {
                ServiceRegistration.Get <ILogger>().Warn("RefreshRateChanger.SetDisplayConfig(...): SDC_APPLY returned {0}", result);
                return(false);
            }
            ServiceRegistration.Get <ILogger>().Debug("RefreshRateChanger.SetDisplayConfig(...): Successfully switched to {0}/{1}", numerator, denominator);
            Windows7DwmFix.FixDwm();
            _rateChanged = true;
            return(true);
        }