2016-12-30 41 views
0

私はこの古いスレッド:What APIs exist?を知っていますが、本当にその質問には答えませんでした。それは何年もの間続いています。はい、私はNAudio.CoreAudioApiを使用していますが、私は有用な情報を見つけることはできません。C#でWindowsのスピーカー設定を変更するには?

MMDevice.Propertiesは読み取り専用です。 C#でプログラムでこれを行う方法はありますか?私はもはや確実ではない。

AudioEndpointVolumeChannelsでチャンネルを見つけることもできますが、Channels.countだけが許可されます。

私が考えたもう一つの解決策は、マウスクリックの動きで変化する何らかの種類の「マクロ」ですが、それはかなり醜いです。

NAudio APIには、適切なものがあるはずですが、それを行う方法に関するドキュメントはありません。私は一日のようにグーグルで行きましたが、何も見つかりませんでした。古いCoreAPIがそこに移動しました。

using NAudio.Wave; 
using NAudio.CoreAudioApi; 

     //Can't do anything with these Devices, but change the volume????!!! 
     var deviceEnum = new MMDeviceEnumerator(); 
     var devices = deviceEnum.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active).ToList(); 
     foreach (MMDevice device in devices) 
     { 
      Console.WriteLine(device.FriendlyName); 

     } 
+0

正確に設定するものは何ですか?より具体的にすることができます – EugeneK

+0

再生デバイスを2CHから5.1に変更したいと思います。または、Samplerateを24bit、48000にデフォルトから設定します。私は上記で引用したNAudioがツールを持っているかどうかはわかりません。私は、いくつかの他のAPIを試してきましたが、ほとんどドキュメントを書いていないか、機能がないだけです。 –

答えて

0

ユージンと私はそれが働いた方法は、再生デバイスのレジストリを見つけることだった - 「レンダリング」です: HKLM \ SOFTWARE \マイクロソフト\ Windowsの\ CurrentVersionのは\ MMDevices \ AUD IO \ その後スラッシュをレンダリング{ガイド} ...あなたの再生デバイス。お使いのデバイスが5.1以上のモードであることを確認してください。

それをファイルに「エクスポート」します。 5.1以上に復元する必要がある場合、「Sample Rate」も含まれます。次に、コードでは、エクスポートされたファイルから次のものを使用します。

Process regeditProcess = Process.Start("regedit.exe", "/s playback.reg"); 
regeditProcess.WaitForExit(); 

これは、キーが適切に復元されることを確認します。 まだ私が見たいと思う最良の方法ではありません。しかし、それは確かに動作します。

1

のWindows APIは、プロパティを変更するサポートしていますが、NAudioは、何らかの理由でこの機能を公開しません。 NAudioソースを変更することでこれを追加するのはかなり簡単です。

NAudio\CoreAudioApi\PropVariant.csにライン

 Marshal.ThrowExceptionForHR(deviceInterface.OpenPropertyStore(StorageAccessMode.Read, out propstore)); 
以下 NAudio\CoreAudioApi\MMDevice.cs

方法

/// <summary> 
    /// Sets property value at specified key 
    /// </summary> 
    /// <param name="key">Index</param> 
    /// <param name="value">Value</param> 
    public void SetValue(PropertyKey key, PropVariant value) 
    { 
     Marshal.ThrowExceptionForHR(storeInterface.SetValue(ref key, ref value)); 
    } 

以下NAudio\CoreAudioApi\PropertyStore.csアドインに

/// <summary> 
    /// Creates a new PropVariant containing a uint value 
    /// </summary> 
    public static PropVariant FromUInt(uint value) 
    { 
     return new PropVariant() { vt = (short)VarEnum.VT_UI4, ulVal = value }; 
    } 

を変更、追加今、あなたはこれらの変更でNAudio.dllを再構築した場合、あなたの例では、5.1であることを再生デバイスを変更するには、このように見えるかもしれません(管理者として実行するか、それが失敗してい)

 Marshal.ThrowExceptionForHR(deviceInterface.OpenPropertyStore(StorageAccessMode.ReadWrite, out propstore)); 

すべき

 var deviceEnum = new MMDeviceEnumerator(); 
     var devices = deviceEnum.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active).ToList(); 
     foreach (MMDevice device in devices) 
     { 
      Console.WriteLine(device.FriendlyName); 
      if (device.Properties.Contains(PropertyKeys.PKEY_AudioEndpoint_PhysicalSpeakers)) 
      { 
       var value = device.Properties[PropertyKeys.PKEY_AudioEndpoint_PhysicalSpeakers]; 
       Console.WriteLine("Current value: " + value.Value.ToString()); 
       // set configuration to 5.1, value is taken from ksmedia.h from Windows Driver Kit 
       PropVariant newvalue = PropVariant.FromUInt(63); 
       device.Properties.SetValue(PropertyKeys.PKEY_AudioEndpoint_PhysicalSpeakers, newvalue); 
      } 
     } 
+0

あなたの答えはよさそうです。しかし、そのソースをダウンロードするとき。何百万もの解決できないエラーが出ます。それは間違ったフレームワークや欠けている依存関係を持っているようです。具体的には、 '=>'や '識別子が必要です...'のようなものでは、 "無効なトークン ';' 'が表示されます。 127エラー。 –

+0

どのバージョンを使用しましたか?私はhttps://github.com/naudio/NAudioから最新のものを入手し、VS 2015でエラーなしでコンパイルします。 – EugeneK

+0

Ok上記のコメントは無視してください。私はVS2015でそれを構築しました。次の問題は、それが動作しないということです。デバッグでは、正しい値でセッターに当たっていることがわかりますが、再生デバイスは決して2CHから5.1に変わりません。 –

関連する問題