2012-09-05 19 views
7

Amaç: (Ray Molenkamp ve Xavier Flix tarafından) genişletilmiş Core Audio API DefaultAudioEndpoint en OnVolumeNotification abone ve ayarlayarak ses seviyelerini uygulamak kullanarak yukarıdaki Windows Vista ve de, değiştiğinde ses seviyesi.CoreAudio OnVolumeNotification olay abonelik Explorer.exe'ye yüksek CPU kullanımına neden olur

Sorun: İşlevsel başarılı, ancak en kısa sürede OnVolumeNotification bir abonelik kayıtlı olduğu gibi, CPU CPU gücüne bağlı olarak% 30-50 olarak saptanmış olsun eğilimindedir. Process Explorer & Process Monitor ile kazmaya başladıktan sonra explorer.exe ve bazen svchost.exe'nin kayıt defteri okuma çağrıları tarafından tüketileceği ortaya çıktı. Hangi kayıt defteri anahtarından emin değilim. Aboneliği dikkatli bir şekilde yürüttüğümden bu olaya zararlı bir şekilde abone olduğuma inanmıyorum - sadece bir kez kovuluyor.

uç noktadan sesini OnVolumeNotification
  • set uç noktası ses skalar özelliği
  • OnVolumeNotification
  • temel Win32 yöntemleri son nokta ol (hemen etkili)

    1. çık zorlamayı

      mantıksal işlem Çekirdek Ses API'sine katılanlar RegisterControlChangeNotify ve 0'dır. Sorunun neden olduğu veya etkinlik aboneliğinin uygulanmasının mümkün mü?

    +1

    Neden kayıt defteri anahtarının okunmakta olduğu açık değil mi? İşlem İzleyicisi size bu bilgiyi vermelidir. Yardımcı olabilir. Ayrıca, explorer.exe hata ayıklamaya çalıştınız mı? – Simon

    +0

    @Simon Yorumunuzu fark etmediğiniz için özür dilerim. Belirli bir anahtar bulamadım, ProcMon'a% 100 aşina değilim. Aynı konuyla karşılaşabilecek olanlar için buna geçici bir çözüm göndermek üzereyim. – erodewald

    cevap

    0

    yerine:

    1. Abonelik Kaldırma
    2. değiştirme hacmi/set dilsiz

    Yeniden Abone Ben aslında zaman yönetmek için destek alanları ile özelliklerinde mantığı kullanmak benim mantığı modifiye güncellemek için. Mükemmel değil, ama çok yakınız ve hiçbir CPU yemiyor ve INPC için tam destekli bir sürgüden harici girişe izin veriyor.

    public EndpointVolumeEnforcer() { 
        try { 
        mmDeviceEnumerator = new MMDeviceEnumerator(); 
        mmDevice = mmDeviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia); 
        audioEndpointVolume = mmDevice.AudioEndpointVolume; 
        audioEndpointVolume.OnVolumeNotification += data => { 
         VolumePercent = Convert.ToInt16(data.MasterVolume*100); 
         DeviceIsMuted = data.Muted; 
        }; 
        DesiredVolume = 65; 
        } 
        catch (Exception ex) { 
        // Logging logic here 
        } 
    } 
    
    public int DesiredVolume { 
        get { return _desiredVolume; } 
        private set { 
        if (_desiredVolume == value) return; 
        _desiredVolume = value; 
        NotifyOfPropertyChange(); 
        Enforce(_desiredVolume); 
        } 
    } 
    
    public int VolumePercent { 
        get { return volumePercent; } 
        private set { 
        if (volumePercent == value) return; 
        volumePercent = value; 
        if (volumePercent != _desiredVolume) { 
         volumePercent = _desiredVolume; 
         Enforce(volumePercent); 
        } 
        } 
    } 
    
    public void Enforce(int pct, bool mute = false) { 
        var adjusted = Convert.ToInt16(audioEndpointVolume.MasterVolumeLevelScalar*100); 
        if (adjusted != DesiredVolume) { 
        audioEndpointVolume.MasterVolumeLevelScalar = pct/100f; 
        } 
    } 
    
    İlgili konular