2009-07-28 17 views
3

我有一個用戶與C#WPF程序並行的設備。當用戶按下設備上的按鈕時,該程序必須發出嘟嘟聲,持續指定的時間或只要用戶按下按鈕(以較短者爲準)。唯一可用於產生嗶聲/音調的揚聲器是計算機BIOS揚聲器;我們不能假設其他演講者都在附近(並且假設不會有其他演講者實際上是安全的)。C#:產生連續色調直到中斷

如何在必要的持續時間內產生連續音?

我到目前爲止所產生的蜂鳴聲很多,但並不是連續的聲調。

首先,線程啓動:

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布爾翻轉爲真,直至時刻由設備本身指定。

我懷疑這只是上面的Console.Beep()行的快速更改,但我不確定它會是什麼。

回答

10

沒有爲Console.Beep,需要一個頻率和持續時間的過載,如果您想在指定的時間內產生聲音,這非常有用。使用BIOS揚聲器打開聲音然後再關閉聲音的功能不受Console.Beep方法或我知道的任何其他API的直接支持,也沒有安裝假聲卡驅動程序。

一些實驗發現了以下內容:

  • 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); 
} 
+1

首次檢查看起來像是一個更好的解決方案。但是在我的測試中,從.net提供更長的控制檯嗶聲似乎會導致嚴重的問題。在試驗5秒鐘和更長時間的嗶聲時,我的兩臺開發機器都採用了藍屏。我不記得上次在此之前我的任何一臺機器都被藍屏蔽了...... – andynormancx 2009-07-28 19:07:13

+0

在這種情況下,替代方案似乎是安裝假聲卡驅動程序或在後臺線程中使用持續時間小於藍屏死機爲你,有一個機制脫離循環。 – 2009-07-28 19:16:36

0

不幸的是,我不認爲你想要什麼可能沒有一些低級別的硬件訪問。

Console.Beep()方法有兩個重載,沒有任何參數的情況下使用的只是一聲短促的嘟嘟聲。第二次過載需要兩個整數,第一個用於音調的頻率,第二個用於毫秒的聲音。

即使您繞過.NET並轉到Windows API調用,您仍然具有基本相同的Beep函數(帶有頻率和長度參數)。

所以,如果沒有更低層次的編碼,最好的選擇就是聽起來像是500毫秒的聲音,最後會連續發出一連串中斷的半秒嗶聲。

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傳呼機時下音量控制的...

4

如果你有一個連續的聲音的波形文件,你可以使用一個聲音播放:

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 AudioDirectSound

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分鐘。