質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

268閲覧

Visual Studio 2022 C#.NETで特定プロジェクト名のときのみ音声が聞こえない不具合。

qaw

総合スコア9

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2024/03/21 06:55

不具合内容

"Pokemon"というプロジェクトで、音声ファイル(=wav)が再生されなくなった不具合が発生しています。
該当プロジェクトフォルダを削除し、同名のプロジェクトを作り直しても同じ問題が発生します。

実現したいこと

該当プロジェクト名で通常通り再生したい。

前提

環境

Windows 11 Pro Ver.23H2
Visual Studio Community 2022 64 Ver.17.9.6

作成時の設定

テンプレート: Windowsフォームアプリ [C#][Windows][デスクトップ]
場所: C:\Users\username\source\repos
フレームワーク: .NET 8.0

インストールしたライブラリ

・NAudio 2.2.1
・System.Data.SQLite.Core 1.0.118

該当コードの抜粋

問題が発生してからNAuido関連をコメントアウト、組み込みのSoundPlayerで試している。

C#:MainForm.cs

1namespace Pokemon 2{ 3 public partial class MainForm : Form 4 { 5 // fields 6 // 音声ファイルが読み込まれる変数 7 //WaveStream wfs; 8 // 音声操作のインスタンスが入る変数 9 //WaveOutEvent mainBGM; 10 SoundPlayer mainBGMS = new SoundPlayer( 11 Path.Combine( 12 Path.GetDirectoryName(Application.ExecutablePath), 13 "assets", 14 "sounds", 15 "pokemon_center.wav")); 16 17 18 19 public MainForm() 20 { 21 InitializeComponent(); 22 23 // 音声ファイルを読み込む変数にファイルパスを指定して読み込む 24 //wfs = new WaveFileReader( 25 //Path.Combine( 26 // Path.GetDirectoryName(Application.ExecutablePath), 27 // "assets", 28 // "sounds", 29 // "pokemon_center.wav")); 30 // 音声操作のインスタンス生成 31 //mainBGM = new WaveOutEvent(); 32 // 音声ファイルを指定して初期化 33 //mainBGM.Init(wfs); 34 35 // 再生する 36 //mainBGM.Play(); 37 mainBGMS.Play(); 38 } 39...

詳しい不具合と試したこと

同名プロジェクトの再作成し実行

既存の該当プロジェクトを削除し同名で再度プロジェクトを新規作成し、元のソースコード群(*.cs, *Designer.cs, *.resx, Project.csproj, Project.csproj.user)を貼り付けて実行⇒正しく再生されない。

別名プロジェクトを作成し実行

別名例えば"Hogemon"などで新しく作ったプロジェクトに1同様ソースコード群を張り付ける⇒正しく再生される。

以上からコード自体はきちんと動いている(とおもう)

また、assetsフォルダ内(=\bin\Debug\net8.0-windows\assets\sounds)を空にするとPlay()関数実行時に「System.IO.FileNotFoundException: 'Please be sure a sound file exists at the specified location.'」が発生する。

別の場所に作ってみる

最初のプロジェクト作成画面で「C:\Users\username\source\repos\hoge」以下に該当プロジェクト名で作成したり、該当プロジェクトをデスクトップに移動させる⇒正しく再生される。
これらのプロジェクトを再度repos直下に移動させる⇒同様の問題が再発生する。

該当プロジェクトの名前変更

問題の発生しているプロジェクトをソリューションエクスプローラから"Pikemon"など別名称に変更すると問題が解消されます。
その後名前を戻す⇒再発生。

プロジェクト名(というより[*\repos\該当プロジェクト名]フルパスそのもの)に問題があるのでしょうか。

コードは正しそうなのでVS側で該当プロジェクト名に対する妙な紐づけがあるのかとも思いましたプロジェクト作成時に.vsフォルダ自体再作成されますよね。
プロジェクトごとに保持される設定ではなく、VS自体がどこか一か所に保存している設定だったりするのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qaw

2024/03/22 15:04 編集

追記: 最初にNAudioのコードを試すために書いたコードを実行すると、動くようになったプロジェクトでも動かなくなる。 ``` /// <summary> /// 音量(=woe.Volume)をフェードアウト時間(=duration)で割った値ずつ下げる /// </summary> /// <param name="woe"></param> /// <param name="duration"></param> /// <param name="isDispose"></param> /// <returns></returns> async Task fadeOutBGM(WaveOutEvent woe, int duration, Boolean isDispose) { // 1msずつ下げる音量を決める。 float volumeDecrement = woe.Volume / duration; // 1msずつ下げる for (int i = 0; i < duration; i++) { // 下げ幅を音量に適応 float nextVol = woe.Volume - volumeDecrement; woe.Volume = nextVol < 0.0f ? 0.0f : nextVol; // 現在の音量から減少値を差し引いた値が0以下なら0を、そうでないならその値に設定。 // 1ms止める await Task.Delay(1); //Thread.Sleep(1); } //// インスタンスの再生を止める woe.Stop(); woe.Dispose(); //if (isDispose) //{ // woe.Dispose(); //} } ```
guest

回答1

0

自己解決

ひとまず解決しました。ライブラリの理解度不足でした。

導入のために試しに使ったNAudioのコードが原因でした。
以下は音声再生のためのWaveOutEvent インスタンスの.Volume属性の値を徐々に下げてフェードアウトさせるコードです。
この属性はインスタンスそれぞれの値を持つわけではなく、実際にはWaveOutUtilsクラスというwindowsのオーディオ出力デバイスの状態を管理するものらしく、woe.Dispose();したからといって設定したwoe.Volume = 0.0f;がリセットされるわけではないようです。

woe.Volume = 1.0f;としてやると再起動後正しい音量で再生されました。
音量設定はプロジェクトごとに別ものらしく、音が出なくなったプロジェクトでも音量設定を正してやると流れました。

/// <summary> /// 音量(=woe.Volume)をフェードアウト時間(=duration)で割った値ずつ下げる /// </summary> /// <param name="woe"></param> /// <param name="duration"></param> /// <param name="isDispose"></param> /// <returns></returns> async Task fadeOutBGM(WaveOutEvent woe, int duration, Boolean isDispose) { // 1msずつ下げる音量を決める。 float volumeDecrement = woe.Volume / duration; // 1msずつ下げる for (int i = 0; i < duration; i++) { // 下げ幅を音量に適応 float nextVol = woe.Volume - volumeDecrement; woe.Volume = nextVol < 0.0f ? 0.0f : nextVol; // 現在の音量から減少値を差し引いた値が0以下なら0を、そうでないならその値に設定。 // 1ms止める await Task.Delay(1); //Thread.Sleep(1); } //// インスタンスの再生を止める woe.Stop(); // WaveOutUtilsでのアクセスを閉じる前やインスタンスを生成するときに音量設定をリセット**** //woe.Volume = 1.0f; woe.Dispose(); //if (isDispose) //{ // woe.Dispose(); //} }
  1. windowsのオーディオ出力設定はプロジェクトごとに紐づけられている?実行ファイルのパス?
  2. インスタンスごとに音量を変えたいな~

といった疑問点は残りましたがプロジェクトごとに音が出ない問題は解消されました。
見てくださった方ありがとうございました。

投稿2024/03/22 15:28

qaw

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問