3

ユーザーが C# WPF プログラムと共に操作するデバイスがあります。このプログラムは、ユーザーがデバイスのボタンを押したときに、指定された時間またはユーザーがボタンを押している間、どちらか短い方でビープ音を鳴らさなければなりません。ビープ音/トーンを生成できる唯一のスピーカーは、コンピューターの BIOS スピーカーです。他のスピーカーが周りにいると仮定することはできません (実際には、他のスピーカーはいないと仮定しても安全です)。

必要な期間、連続音を出すにはどうすればよいですか?

これまでのところ、ビープ音はたくさん出ますが、連続音ではありません。

まず、スレッドが開始されます。

    private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) {
        if(this.Visibility == Visibility.Visible){
            mBeepThread = new Thread(new ThreadStart(ProduceTone));
            mBeepThread.Name = "Beep Thread";
            mBeepThread.Start();
        }
    }

スレッド自体:

    bool mMakeTone = false;
    private void ProduceTone(){
        while(this.Visibility == Visibility.Visible){
            if(mMakeTone ){
                Console.Beep();
            }
            else{
                Thread.Sleep(10);
            }
        }
    }

次に、mMakeTone ブール値は、ボタンが押されている間、デバイス自体によって指定された時間まで true に反転されます。

上記の Console.Beep() 行を簡単に変更しただけだと思いますが、それがどうなるかはわかりません。

4

4 に答える 4

10

Console.Beepには過負荷があり、周波数と持続時間がかかります。これは、指定された持続時間のサウンドを生成する場合に便利です。サウンドをオンにしてからBIOSスピーカーを使用してオフにする機能は、Console.Beepメソッド、または偽のサウンドカードドライバーをインストールせずに私が知っている他のAPIでは直接サポートされていません。

少し実験して、次のことがわかりました。

  • Console.Beep()は同期しており、サウンドが終了するまで戻りません。
  • 別のスレッドからConsole.Beep()を呼び出すと、現在進行中のすべてが中断されます。

つまり...選択した頻度と非常に長い期間でConsole.Beep()を呼び出す新しいバックグラウンドスレッドを作成することで、タスクを実行できるはずです。後でサウンドを終了するには、メインスレッドでConsole.Beep()を任意の頻度で呼び出し、非常にゼロ以外の継続時間(1など)でバックグラウンドスレッドからのサウンドの再生を終了します。バックグラウンドスレッドでサウンドを再生するのは、通常はサウンドの再生が停止するまでスレッドが存続し、多くのバックグラウンドスレッドが積み重ならないようにするため、妥当な期間を超えて再生しないでください。

private void button1_Click(object sender, EventArgs e)
{
    // Starts beep on background thread
    Thread beepThread = new Thread(new ThreadStart(PlayBeep));
    beepThread.IsBackground = true;
    beepThread.Start();
}

private void button2_Click(object sender, EventArgs e)
{
    // Terminates beep from main thread
    Console.Beep(1000, 1);
}

private void PlayBeep()
{
    // Play 1000 Hz for 5 seconds
    Console.Beep(1000, 5000);
}
于 2009-07-28T18:56:17.857 に答える
4

連続サウンドのウェーブ ファイルがある場合は、SoundPlayer を使用できます。

SoundPlayer player = new SoundPlayer();
player.SoundLocation = @"C:\Program Files\MyApp\sound.wav";
player.PlayLooping();
...
// Later, when you know it's time to stop the sound:
player.Stop();

開始と停止が聞こえるかどうかはわかりません。

それがうまくいかない場合は、おそらく、レベルを下げて Win32 呼び出しにする必要があります。Multimedia AudioまたはDirectSoundを見たいと思うかもしれません。

于 2009-07-28T19:24:11.653 に答える
0

残念ながら、低レベルのハードウェアへのアクセスなしでは、あなたが望んでいることは不可能だと思います。

Console.Beep() メソッドには 2 つのオーバーロードがあります。パラメーターなしで使用しているオーバーロードは、短いビープ音を鳴らすだけです。2 番目のオーバーロードには 2 つの整数が必要です。1 番目はトーンの周波数、2 番目はトーンを鳴らすミリ秒数です。

.NETをバイパスして Windows API 呼び出しに移動しても、基本的に同じ Beep 関数 (頻度と長さのパラメーターを使用) を使用できます。

したがって、期待できる最善の方法は、はるかに低レベルのコーディングを行わずに、500 ミリ秒のトーンを鳴らし、一連の中断された 0.5 秒のビープ音を連続して鳴らすことです。

bool mMakeTone = false;
private void ProduceTone(){
    while(this.Visibility == Visibility.Visible){
        if(mMakeTone ){
            Console.Beep(800, 500); // 800 Hz tone for half a second
        }
        else{
            Thread.Sleep(10);
        }
    }
}

また、最近のほとんどの PC のビープ音にはボリューム コントロールがないため、テスト中に気が狂ってしまうことを覚悟しておいてください...

于 2009-07-28T18:51:12.420 に答える
0

この方法Console.Beep(frequency,duration); では、ビープ音の頻度と持続時間を選択できます。周波数の範囲は 37 ~ 32767 ヘルツで、持続時間はミリ秒単位で測定され、制限はありません。例えば:

using System;


namespace beeptesthd
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Beep(1000,60000);
        }
    }
}

次の例では、ビープ音の周波数は 1000 ヘルツで、その持続時間は 60000 ミリ秒、つまり 1 分間です。

于 2014-07-09T19:15:18.767 に答える