プログラミング

C#で現在のシステムの音量を取得する [C#チュートリアル]

C#でリアルタイムに流れてる音の音量を取得します。

C#を3年越しくらいに弄りました。ほぼはじめてC#やる感じになるので、C#入門・チュートリアルみたいな感じの記事になります。メイン内容のシステム音量云々だけ知りたいのだがという方は適当に飛ばして、どうぞ。

csc.exeで外部dllモジュールを読み込む

現在のシステムの音量を取得するため、NAudio.dllというモジュールを使用します。

NAudio – CodePlex Archive

dllモジュールを読み込まずにコンパイルをしようとするとerror CS0246エラーが出ます。

dllを読み込むにはどうしたらいいんだ、というと、csc.exeに/rオプションでファイルへのパスを指定してやることで勝手に読み込んでくれるようです。

C:\Users\Noob\csharp>csc test.cs /r:SnarlNetwork.dll

c# – Why am I getting error CS0246: The type or namespace name could not be found? – Stack Overflow

csc /helpでヘルプが見れますので、/rがどういうものなのか見てみます。
/reference:<file list> 指定されたアセンブリ ファイルのメタデータを参照とありますね。

PS C:\pg> csc.exe /help | sls "/r"

 /refout:<file>                生成する参照アセンブリ出力
 /recurse:<wildcard>           ワイルドカードの指定に従い、現行ディレクトリおよび
 /reference:<alias>=<file>     指定されたエイリアスを使用して、指定された
                               アセンブリ ファイルのメタデータを参照します (短い形式: /r)
 /reference:<file list>        指定されたアセンブリ ファイルのメタデータを参照
                               します (短い形式: /r)
 /resource:<resinfo>           指定されたリソースを埋め込みます (短い形式: /res)
 /refonly                      メイン出力の代わりに参照アセンブリを生成します
 /ruleset:<file>               特定の診断を無効にするルールセット ファイルを
 /reportanalyzer               追加のアナライザー情報を報告します

軽く総当りで検証をしてみましたので参考にどうぞ。

cp '/mnt/c/Program Files/BlueStacks/NAudio.dll' .

'/mnt/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/Roslyn/csc.exe' dev-cs.cs NAudio.dll  
# => error

'/mnt/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/Roslyn/csc.exe' dev-cs.cs "C:/Program Files/BlueStacks/NAudio.dll"  
# => error

'/mnt/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/Roslyn/csc.exe' dev-cs.cs /r:NAudio.dll
# => success

'/mnt/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/Roslyn/csc.exe' dev-cs.cs /r:./NAudio.dll  
# => success

'/mnt/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/Roslyn/csc.exe' dev-cs.cs /r:"C:/Program Files/BlueStacks/NAudio.dll"  
# => success

'/mnt/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/Roslyn/csc.exe' dev-cs.cs /r:"C:\Program Files\BlueStacks\NAudio.dll"  
# => success

上記の通り、パスは絶対パスでも相対パスでもいけるようです。helpする前までは、/rとあったからrelativerかと思っていました。

c# – Can I load a .NET assembly at runtime and instantiate a type knowing only the name? – Stack Overflow
reflection – Loading DLLs at runtime in C# – Stack Overflow

現在のシステムの音量を取得する

以下の通りファイルを作成し、コマンドで実行します。

'/mnt/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/Roslyn/csc.exe' dev-cs.cs /r:"C:\Program Files\BlueStacks\NAudio.dll" ; ./dev-cs.exe

dev-cs.cs

using NAudio.CoreAudioApi;
// using System.Console;
using System;

namespace Dev
{
  public static class Program
  {
    public static void Main(params string[] args)
    {
      // System.Console.WriteLine("Hello !!");

      MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
      MMDevice defaultDevice = devEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);

      Console.WriteLine( "The realtime volume is " + defaultDevice.AudioMeterInformation.MasterPeakValue.ToString() );


    }
  }
}

audio – Get Master Sound Volume in c# – Stack Overflow

して、以下のような出力が得られます。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_9fb19bdb-c200-41b8-96f9-60057c3e3450.png

yuis ASUS /mnt/c/pg/cs$ '/mnt/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/Roslyn/csc.exe' dev-cs.cs /r:"C:\Program Files\BlueStacks\NAudio.dll" ; ./dev-cs.exe
Microsoft (R) Visual C# Compiler バージョン 2.7.0.62715 (db02128e)
Copyright (C) Microsoft Corporation. All rights reserved.

The realtime volume is 0

音楽を流したりしていれば、この数値が変動します。

結論

https://yuis.xsrv.jp/data/MjQuC3Aeoxgi4YZvwYxCRCXfuwXbGI1H.png

割と簡単に実装できましたね。2時間の作業でここまでできたので、わりかしスムーズだったと思います。そのうち時間あるときにawesomeでも見ながらたまにC#いじっていきたいかなと思います。

quozd/awesome-dotnet: A collection of awesome .NET libraries, tools, frameworks and software