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

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

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

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

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

Q&A

1回答

12950閲覧

C#とNAudioを使って音声の録音と再生ができるようなアプリケーションを作りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

0グッド

0クリップ

投稿2017/02/12 10:06

編集2017/02/12 10:18

###前提・実現したいこと
Microsoft Visual Studio 2010のC#フォームアプリケーションとNAudioを使って、音声の録音と再生ができるアプリケーションを作りたいです。button1で録音開始、button2で録音終了と音声の保存、button3で再生という感じにしたいです。

###発生している問題・エラーメッセージ
button1_Click内のwaveInという変数をbutton2_Click内で使いたいです。

###該当のソースコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NAudio.Wave;

namespace sample1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

static void button1_Click(object sender, EventArgs e) { WaveIn waveIn = new WaveIn(); waveIn.StartRecording(); } static void button2_Click(object sender, EventArgs e) { //ここにwaveInが使えるようになるなにかを追加したい。 waveIn.StopRecording(); WaveFileWriter writer = new WaveFileWriter("sample.wav", waveIn.WaveFormat); } static void button3_Click(object sender, EventArgs e) { AudioFileReader reader = new AudioFileReader("sample.wav"); WaveOut waveOut = new WaveOut(); waveOut.Init(reader); waveOut.Play(); } }

}

###試したこと
参照渡しなどに挑戦してみましたが上手くいきませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio 2010 C#フォームアプリケーション
NAudio 1.8.0

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

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

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

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

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

guest

回答1

0

waveInを宣言する場所を変更すればよいかと思います。
変数のスコープを意識して、変数を宣言する場所を決定してください。
簡単に書くと下記のような感じです。

C#

1 2public class TEST 3{ 4 5 private int a; 6 7 static void func1() 8 { 9 int b; //b1 10 int C; 11 12 // 変数a、b1、cが有効、dは使えない 13 // b1とb2は別物 14 } 15 16 static void func2() 17 { 18 int b; //b2 19 int d; 20 21 // 変数a、b2、dが有効、cは使えない 22 // b1とb2は別物 23 } 24 25} 26

投稿2017/02/12 11:03

YAmaGNZ

総合スコア10258

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

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

退会済みユーザー

退会済みユーザー

2017/02/12 11:59

ご回答ありがとうございます。 宣言をする場所を変えてみました。 しかし、ビルドは正常に終了するのですがプログラムを開始しようとするとエラーが出て、開始できませんでした。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using NAudio.Wave; namespace sample01 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } WaveIn waveIn = new WaveIn(); void button1_Click(object sender, EventArgs e) { waveIn.StartRecording(); } void button2_Click(object sender, EventArgs e) { waveIn.StopRecording(); WaveFileWriter writer = new WaveFileWriter("sample.wav", waveIn.WaveFormat); } void button3_Click(object sender, EventArgs e) { AudioFileReader reader = new AudioFileReader("sample.wav"); WaveOut waveOut = new WaveOut(); waveOut.Init(reader); waveOut.Play(); while (waveOut.PlaybackState == PlaybackState.Playing) ; } } } このように宣言する場所を変えましたが、WaveIn waveIn = new WaveIn();の部分が網掛けになって、 'System.InvalidOperationException' のハンドルされていない例外が NAudio.dll で発生しました。 追加情報: Use WaveInEvent to record on a background thread というエラーが出てしまいました。 このエラーはどのような時に出るようなものなのでしょうか?
YAmaGNZ

2017/02/12 12:38

一般的にInvalidOperationExceptionはそのオブジェクトに対し操作してはいけない時に呼び出すと 発生します。(UIスレッド以外からUIを操作しようとした等) NAudioがどのような振る舞いをするのかわからないので、このタイミグで呼び出してはいけないという ことなのだと思います。 WaveIn waveIn = new WaveIn(); と書くと、waveInの変数の宣言と同時に、WaveInクラスのインスタンスの生成動作も行いますので WaveIn waveIn; と変数の宣言のみにして、button1のクリックイベントで waveIn = new WaveIn(); としてやるとエラーが出ずに動きました。(録音等の動きまでは確認していません)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問