2013-11-04 88 views
0

我另一個人用C#和涉足想要創建一個簡單的音頻應用程序可以播放通過上傳程序裝入程序wav文件。我的問題是,我需要得到什麼聲音正在播放與音頻文件的軌道定時器暫停文件時,我通過我的播放按鈕重新啓動音頻文件正在使用。我已經有一個全球性的計時器,「baseTimer」,我想我可以用它來設置音頻文件,已停止,曲目時間點。但是我不知道如何完成這個任務,也不知道如何使用所有的mci命令。C#中使用聲音播放暫停和恢復

我已經展示了我所有的代碼爲我的主要應用...我也看過,我可能需要使用線程,但我也看到了,這將是不可能的設置與一個音頻文件的軌道持續時間線。

public partial class FrmMain : Form 
{ 
    public FrmMain() 
    { 
     InitializeComponent(); 
    } 

    System.Timers.Timer baseTimer = new System.Timers.Timer(); 

    List<string> PlayList = new List<string>(); 
    List<byte> PlayList_byte; 
    int soundNum = 0; 

    private string music_PATH { get; set; } 
    private string talk_PATH { get; set; } 
    private byte Pause_TIME { get; set; } 
    private string Pause_RADIO { get; set; } 

    bool isStopped = new bool(); 
    bool isPaused = new bool(); 

    [DllImport("winmm.dll")] 
    private static extern uint mciSendString(string command, StringBuilder returnValue, int returnLength, IntPtr winHandle); 

    public static int GetSoundLength(string fileName) 
    { 
     StringBuilder lengthBuf = new StringBuilder(32); 

     mciSendString(string.Format("open \"{0}\" type waveaudio alias wave", fileName), null, 0, IntPtr.Zero); 
     mciSendString("status wave length", lengthBuf, lengthBuf.Capacity, IntPtr.Zero); 
     mciSendString("close wave", null, 0, IntPtr.Zero); 

     int length = 0; 
     int.TryParse(lengthBuf.ToString(), out length); 

     return length; 
    } 

    private void SetPath() 
    { 
     music_PATH = @"..\\..\\commercial\list.txt"; 
     talk_PATH = @"..\\..\\main\list.txt"; 
     StreamReader myReader; 

     using (myReader = new StreamReader(music_PATH)) 
     { 
      while (myReader.Peek() != -1) 
      { 
       string read = myReader.ReadLine(); 
       PlayList.Add(read); 
      } 
     } 

     using (myReader = new StreamReader(talk_PATH)) 
     { 
      while (myReader.Peek() != -1) 
      { 
       string read = myReader.ReadLine(); 
       PlayList.Add(read); 
      } 
      myReader.Close(); 
     } 

     foreach (string sound in PlayList) 
     { 
      soundNum++; 
     } 
    } 

    private string CurrentSound() 
    { 
     try 
     { 
      Random _randx = new Random(); 
      int pick = _randx.Next(0, soundNum); 

      string currentaudio = PlayList[pick]; 
      Pause_RADIO = currentaudio; 
      return currentaudio; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: " + ex.Message); 
     } 
     return null; 
    } 

    string _SelectedSound = ""; 

    private string _Sound(string currentradio, string pattern) 
    { 
     foreach (Match entry in Regex.Matches(currentradio, pattern)) 
     { 
      _SelectedSound = entry.Value.ToString(); 
     } 
     if (_SelectedSound == "music") 
     { 
      return "commercial"; 
     } 
     else if (_SelectedSound == "talk") 
     { 
      return "main"; 
     } 
     return null; 
    } 

    private void _SetTimer(string currentradio, string pattern) 
    { 
     baseTimer.Interval = GetSoundLength(@"..\\..\\" + pattern + @"\" + currentradio); 
    } 

    private bool isRepeat(string lastradio, string currentradio) 
    { 
     if (lastradio == currentradio) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    private void baseTimerElasped(object sender, ElapsedEventArgs e) 
    { 
     Radio.FrmMain play = new Radio.FrmMain(); 
     play.PlayPlayer(); 
    } 

    private void PlayPlayer() 
    { 
     MediaPlayer wavplayer; 
     try 
     { 
      if (soundNum == 0) 
      { 
       SetPath(); 
       PlayPlayer(); 
      } 
      else 
      { 
       string currentradio = CurrentSound(); 
       bool localcheck = isRepeat(_SelectedSound, currentradio); 
       if (localcheck == true) 
       { 
        PlayPlayer(); 
       } 
       else 
       { 
        string Pattern = @"(music|talk)"; 
        string selected = _Sound(currentradio, Pattern); 
        _SetTimer(currentradio, selected); 

        switch (selected) 
        { 
         case "commercial": 
          music_PATH = @"..\\..\\commercial\"; 
          PlayList_byte = new List<byte>(File.ReadAllBytes(music_PATH + currentradio)); 
          wavplayer = new MediaPlayer(PlayList_byte.GetRange(0, PlayList_byte.Count).ToArray()); 
          wavplayer.Play(); 
          baseTimer.Start(); 
          break; 
         case "main": 
          talk_PATH = @"..\\..\\main\"; 
          PlayList_byte = new List<byte>(File.ReadAllBytes(talk_PATH + currentradio)); 
          wavplayer = new MediaPlayer(PlayList_byte.GetRange(0, PlayList_byte.Count).ToArray()); 
          wavplayer.Play(); 
          baseTimer.Start(); 
          break; 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: " + ex.Message + ex.StackTrace + ex.Source); 
     } 
    } 

    private void PausePlayer() 
    { 
     MediaPlayer wavplayer = new MediaPlayer(PlayList_byte.GetRange(0, PlayList_byte.Count).ToArray()); 
     baseTimer.Stop(); 

     MessageBox.Show("Count: " + PlayList_byte.Count + "Pause_TIME: " + Pause_TIME + "\nPlaylist_byte" + PlayList_byte.ToString()); 

     try 
     { 
      switch (isPaused) 
      { 
       case false: 
        isPaused = true; 
        wavplayer.Stop(); 
        break; 
       case true: 
        isPaused = false; 
        string localcheck = _Sound(Pause_RADIO, @"(music|talk)"); 
        switch (localcheck) 
        { 
         case "commercial": 
          music_PATH = @"..\\..\\commercial\"; 
          wavplayer.Play(PlayList_byte.GetRange(PlayList_byte.Count - Pause_TIME, PlayList_byte.Count - Pause_TIME).ToArray()); 
          break; 
         case "main": 
          talk_PATH = @"..\\..\\main\"; 
          wavplayer.Play(PlayList_byte.GetRange(PlayList_byte.Count - Pause_TIME, PlayList_byte.Count - Pause_TIME).ToArray()); 
          break; 
        } 
        break; 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: " + ex.Message + ex.Data); 
     } 
    } 

    private void btnPlay_Click(object sender, EventArgs e) 
    { 
     switch (isStopped) 
     { 
      case false: 
       isStopped = true; 
       btnPlay.Image = Image.FromFile(@"..\\..\\Pause.png"); 
       lblPlay.Text = "Pause"; 
       if (isPaused == false) 
       { 
        PlayPlayer(); 
       } 
       else 
       { 
        PausePlayer(); 
       } 
       break; 
      case true: 
       isStopped = false; 
       btnPlay.Image = Image.FromFile(@"..\\..\\Play.png"); 
       lblPlay.Text = "Play"; 
       PausePlayer(); 
       break; 
     } 

     baseTimer.Elapsed += new ElapsedEventHandler(baseTimerElasped); 
    } 

    private void btnNext_Click(object sender, EventArgs e) 
    { 
     PlayPlayer(); 
    } 

    private void btnStop_Click(object sender, EventArgs e) 
    { 
     MediaPlayer wavplayer = new MediaPlayer(); 
     wavplayer.Stop(); 
     baseTimer.Stop(); 
    } 

    private void btnQuit_Click(object sender, EventArgs e) 
    { 
     Application.Exit(); 
    } 

    private void btnGetUpload_Click(object sender, EventArgs e) 
    { 
     Uploader FrmUpload = new Uploader(); 
     FrmUpload.Show(); 
     this.Hide(); 
    } 
} 
class MediaPlayer 
{ 
    SoundPlayer wavplayer; 

    public MediaPlayer() 
    { 
     Stop(); 
    } 

    public MediaPlayer(byte[] buffer) 
    { 
     MemoryStream memStream = new MemoryStream(buffer, true); 
     wavplayer = new SoundPlayer(memStream); 
    } 

    public void Play() 
    { 
     wavplayer.Play(); 
    } 

    public void Play(byte[] buffer) 
    { 
     wavplayer.Stream.Seek(0, SeekOrigin.Begin); 
     wavplayer.Stream.Write(buffer, 0, buffer.Length); 
     wavplayer.Play(); 
    } 

    public void Stop() 
    { 
     wavplayer.Stop(); 
    } 
} 

編輯:

爲清楚起見currentaudio有一個文件爲這樣的 「music3.wav」 或爲 「talk1.wav」。

回答

0

SoundPlayer是極其有限的,並且不支持暫停和恢復。你能夠使用WPF MediaElement嗎?你會發現它更強大,支持播放多種類型的文件,重新定位,設置音量,暫停和恢復。您也可以使用它來獲取文件長度而不是mci。

+0

所以沒有使用MCI的狀態波長推到我的任何.wav文件我想要的應用程序的方法嗎? – gh0st