投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/9/21 22:41:15
下記はすべて同じ結果を表します。
今回の場合、+ 演算子で繋ぐ方法よりも、$ 付き文字列で埋め込んだ方が対応が分かりやすいかも。

cmd = "open \"" + fileName + "\" type mpegvideo alias " + aliasName;
cmd = @"open """ + fileName + @""" type mpegvideo alias " + aliasName;
cmd = $"open \"{fileName}\" type mpegvideo alias {aliasName}";
cmd = $@"open ""{fileName}"" type mpegvideo alias {aliasName}";
cmd = @$"open ""{fileName}"" type mpegvideo alias {aliasName}";
cmd = $"""open "{fileName}" type mpegvideo alias {aliasName}""";
cmd = $"""
    open "{fileName}" type mpegvideo alias {aliasName}
    """;

ちなみに 「3 つ以上の"」で囲む記法は、C# 11 で導入された『生文字列リテラル』という構文です。
文字列中に " や改行を、エスケープ処理無しで直接埋め込めるというメリットがあります。

※ .NET 7 のプロジェクトは、既定で C# 11 となります。
※ それ以前のバージョンで C# 11 の構文を使う場合は、プロジェクトの LangVersion 設定を変更する必要があります。


> 以下が今、うまくいっていないコードです。
> fileName = Application.StartupPath + @"Sound\" + fileName;
fileName 変数の使いまわしは良くないですね。
フォルダー名を含むかどうかという点が変化しているので、変数名と合致しなくなってしまう…。
また、パスをつなぐ場合は System.IO.Path.Combine を使った方が望ましいです。
var fullPath = Path.Combine(Application.StartupPath, "Sound", fileName);


> やはりうまくいきません。
これは対象が .wav ファイルだからです。手元では試していませんが、失敗した方では、
API の戻り値が 261 (MCIERR_UNRECOGNIZED_COMMAND) になっていませんでしたか?

setaudio コマンドが使えるのは、デジタル ビデオおよび VCR デバイスに限られます。
https://learn.microsoft.com/ja-jp/windows/win32/multimedia/setaudio
>>> setaudio コマンドは、オーディオの再生とキャプチャに関連付けられている値を設定します。
>>> デジタル ビデオおよび VCR デバイスはこのコマンドを認識します。

これはつまり、.mp3 ファイル(MPEGViedeo) などには使えますが、
.wav ファイル(WaveAudio) などには使えないコマンドであることを意味します。
(うまくいった方のコードは「type mpegvideo」でしたよね)

拡張子ごとのデバイスタイプは、レジストリの
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions
に記載されています。

ということで、MCI では waveaudio デバイスの音量制御ができません。
.wav ファイルを .mp3 などに変換して利用することを検討してみてください。

もしも .wav ファイルをそのまま扱いたいのであれば、
MCI ではなく、WaveOut API を利用するという手法があります。
(波形データを直接扱う低レベル命令なので、それなりに面倒です)
この場合、ボリューム設定は waveOutSetVolume API です。
もしくはミキサー API を使って、大元のボリュームを変更するかですね。

その他、DirectSound で再生する手法もあります。
この場合は IDirectSoundBuffer の SetVolume メソッドですね。