C#中使用声音播放暂停和恢复 [英] C# Using SoundPlayer to Pause and Resume

查看:463
本文介绍了C#中使用声音播放暂停和恢复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是另一个人用C#和涉足想要创建一个简单的音频应用程序可以播放通过上传程序装入程序wav文件。我的问题是,我需要得到任何音频当前正在播放的音频文件的轨道定时器暂停文件时,我通过我的播放按钮重新启动音频文件被使用。我已经有一个全球性的计时器,baseTimer',那我想我可以用它来设置音频文件,已停止,曲目时间点。不过,我不知道如何做到这一点也不我真的知道如何使用所有的MCI命令呢。

I am another person dabbling with C# and wanting to create a simple audio application that plays wav files loaded into the program via an upload program. My issue is that I need to get whatever audio file currently being played to pause with the track timer of the audio file being used when I start the audio file again via my Play button. I already have a global timer, 'baseTimer', that I think I can use to set the audio file, that was stopped, track duration point. However I do not know how to accomplish this nor do I really know how to use all of the mci commands yet.

我已经展示我所有的code为我的主要应用...我也看过,我可能需要利用线程,但我也看到了,这将是不可能设置一个音频文件的轨道持续与线程

I have displayed all of my code for my main application... I also have read that I may need to utilize threading, but I've also read that it would be impossible to set an audio files track duration with a thread.

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。

For clarity currentaudio has a file as such "music3.wav" or "talk1.wav" in it.

推荐答案

声音播放是极其有限的,并且不支持暂停和恢复。你能够使用WPF <一个href=\"http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement%28v=vs.110%29.aspx\"相对=nofollow> MediaElement的呢?你会发现它是更强大,支持多种播放类型的文件,重新定位,设置音量,暂停和恢复。你也可以用它来获取文件长度,而不是MCI。

SoundPlayer is extremely limited, and doesn't support Pause and Resume. Are you able to use the WPF MediaElement instead? You will find it is much more powerful, supporting playing files of many types, repositioning, setting volume, pausing and resuming. You can also use it to get the file length instead of mci.

这篇关于C#中使用声音播放暂停和恢复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆