但上面的例子中,只能播放单一文件,如果要是多个文件选择多个声卡同时播放呢?想到使用多线程来实现,再次封装多线程播放类
AudioPalyer类,有三个事件,当播放时触发OnAudioPlay事件,当循环播放时触发OnLoopingPlay事件,当正常播放时触发OnNormalPlay事件,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QBAudioLib;
using System.Threading;
namespace QBAudioThread
{
public struct playInfo
{
public Guid devId;
public string fileName;
public PlayFlags thisFlag;
}
public class AudioEventArgs : EventArgs
{
public playInfo AudioPlayInfo;
}
public class AudioPlayer
{
QBAudioCtrl qbCtrl;
DeviceStatus devStauts;
playInfo thisInfo;
public delegate void DefEventHandler(object sender,AudioEventArgs args);
public event DefEventHandler OnAudioPlay;//开始播放事件
public event EventHandler OnNormalPaly;//默认正常播放时事件
public event EventHandler OnLoopingPaly;//循环播放时事件
public AudioPlayer(playInfo iPlay)
{
thisInfo = iPlay;
}
public void Audio_Play()
{
Monitor.Enter(this);
qbCtrl = new QBAudioCtrl(thisInfo.devId, thisInfo.fileName);
qbCtrl.Dev_Play(thisInfo.thisFlag);
devStauts = qbCtrl.GetDeviceStatus();
//开始播放激发的事件
if (devStauts.isPlaying == true)
{
AudioEventArgs thisArgs = new AudioEventArgs();
thisArgs.AudioPlayInfo = thisInfo;
OnAudioPlay(this, thisArgs);
}
if (devStauts.isLooping == false)
{//默认播放激发的事件
OnNormalPaly(this, new EventArgs());
}
else
{//循环播放激发的事件
OnLoopingPaly(this, new EventArgs());
}
Monitor.Exit(this);
Thread.Sleep(1000);
}
}
}
using System.Linq;
using System.Text;
using QBAudioLib;
using System.Threading;
namespace QBAudioThread
{
public struct playInfo
{
public Guid devId;
public string fileName;
public PlayFlags thisFlag;
}
public class AudioEventArgs : EventArgs
{
public playInfo AudioPlayInfo;
}
public class AudioPlayer
{
QBAudioCtrl qbCtrl;
DeviceStatus devStauts;
playInfo thisInfo;
public delegate void DefEventHandler(object sender,AudioEventArgs args);
public event DefEventHandler OnAudioPlay;//开始播放事件
public event EventHandler OnNormalPaly;//默认正常播放时事件
public event EventHandler OnLoopingPaly;//循环播放时事件
public AudioPlayer(playInfo iPlay)
{
thisInfo = iPlay;
}
public void Audio_Play()
{
Monitor.Enter(this);
qbCtrl = new QBAudioCtrl(thisInfo.devId, thisInfo.fileName);
qbCtrl.Dev_Play(thisInfo.thisFlag);
devStauts = qbCtrl.GetDeviceStatus();
//开始播放激发的事件
if (devStauts.isPlaying == true)
{
AudioEventArgs thisArgs = new AudioEventArgs();
thisArgs.AudioPlayInfo = thisInfo;
OnAudioPlay(this, thisArgs);
}
if (devStauts.isLooping == false)
{//默认播放激发的事件
OnNormalPaly(this, new EventArgs());
}
else
{//循环播放激发的事件
OnLoopingPaly(this, new EventArgs());
}
Monitor.Exit(this);
Thread.Sleep(1000);
}
}
}
界面实现:
代码
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 QBAudioLib;
using System.Threading;
namespace QBAudioThread
{
public partial class Form2 : Form
{
PlayFlags thisFlags;
DataTable dt = new DataTable();
Thread threadPlay;
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
//获得所有的音频设备
List<DeviceInfo> devInfo = QBDeviceHelper.GetDeviceList();
foreach (DeviceInfo dev in devInfo)
{
cBox_Devices.Items.Add(new KeyValuePair<Guid, string>(dev.DevId, dev.Description));
}
cBox_Devices.SelectedIndex = 0;
this.thisFlags = PlayFlags.Default;
dt.Columns.Add("devId", typeof(Guid));
dt.Columns.Add("fileName", typeof(string));
dt.Columns.Add("thisFlag", typeof(PlayFlags));
dataGridView1.DataSource = dt;
}
private void btn_play_Click(object sender, EventArgs e)//播放
{
try
{
int i = 0;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if ((bool)row.Cells[0].FormattedValue == true)
{
playInfo thisPlay = new playInfo();
thisPlay.devId = (Guid)row.Cells["devId"].Value;
thisPlay.fileName = row.Cells["fileName"].Value.ToString();
thisPlay.thisFlag = (PlayFlags)row.Cells["thisFlag"].Value;
AudioPlayer myPlayer = new AudioPlayer(thisPlay);
myPlayer.OnAudioPlay += new AudioPlayer.DefEventHandler(myPlayer_OnAudioPlay);
myPlayer.OnLoopingPaly += new EventHandler(myPlayer_OnLoopingPaly);
myPlayer.OnNormalPaly += new EventHandler(myPlayer_OnNormalPaly);
threadPlay = new Thread(new ThreadStart(myPlayer.Audio_Play));
threadPlay.Name = "player_" + i.ToString();
threadPlay.Start();
threadPlay.IsBackground = true;
i++;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void myPlayer_OnAudioPlay(object sender,AudioEventArgs args)
{
playInfo myplay = (playInfo)args.AudioPlayInfo;
string msg = myplay.devId.ToString() + "\r\n正在播放\r\n" + myplay.fileName + "\r\n";
MessageBox.Show(msg);
}
void myPlayer_OnNormalPaly(object sender, EventArgs e)
{
MessageBox.Show("Normal");
}
void myPlayer_OnLoopingPaly(object sender, EventArgs e)
{
//播放一分钟后终止线程
MessageBox.Show("Looping");
}
private void btn_File_Click(object sender, EventArgs e)//选择播放文件
{
OpenFileDialog filedg = new OpenFileDialog();
filedg.Filter = "音视频文件(*.wav)|*.wav";
if (filedg.ShowDialog() == DialogResult.OK)
{
if (filedg.FileName != "" || filedg.FileName != string.Empty)
{
txt_File.Text = filedg.FileName;
}
}
}
private void cBox_Devices_SelectedIndexChanged(object sender, EventArgs e)//选择声卡
{
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)//选择默认播放
{
if (radioButton1.Checked)
{
thisFlags = PlayFlags.Default;
}
}
private void radioButton2_CheckedChanged(object sender, EventArgs e)//选择循环播放
{
if (radioButton2.Checked)
{
thisFlags = PlayFlags.Looping;
}
}
private void btn_add_Click(object sender, EventArgs e)//添加进列表
{
DataRow dr = dt.NewRow();
dr["devId"] = ((KeyValuePair<Guid, string>)cBox_Devices.SelectedItem).Key;
dr["fileName"] = txt_File.Text.Trim();
dr["thisFlag"] = thisFlags;
dt.Rows.Add(dr);
dataGridView1.DataSource = dt;
}
private void btn_clear_Click(object sender, EventArgs e)//清除列表
{
dt.Rows.Clear();
dataGridView1.DataSource = dt;
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QBAudioLib;
using System.Threading;
namespace QBAudioThread
{
public partial class Form2 : Form
{
PlayFlags thisFlags;
DataTable dt = new DataTable();
Thread threadPlay;
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
//获得所有的音频设备
List<DeviceInfo> devInfo = QBDeviceHelper.GetDeviceList();
foreach (DeviceInfo dev in devInfo)
{
cBox_Devices.Items.Add(new KeyValuePair<Guid, string>(dev.DevId, dev.Description));
}
cBox_Devices.SelectedIndex = 0;
this.thisFlags = PlayFlags.Default;
dt.Columns.Add("devId", typeof(Guid));
dt.Columns.Add("fileName", typeof(string));
dt.Columns.Add("thisFlag", typeof(PlayFlags));
dataGridView1.DataSource = dt;
}
private void btn_play_Click(object sender, EventArgs e)//播放
{
try
{
int i = 0;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if ((bool)row.Cells[0].FormattedValue == true)
{
playInfo thisPlay = new playInfo();
thisPlay.devId = (Guid)row.Cells["devId"].Value;
thisPlay.fileName = row.Cells["fileName"].Value.ToString();
thisPlay.thisFlag = (PlayFlags)row.Cells["thisFlag"].Value;
AudioPlayer myPlayer = new AudioPlayer(thisPlay);
myPlayer.OnAudioPlay += new AudioPlayer.DefEventHandler(myPlayer_OnAudioPlay);
myPlayer.OnLoopingPaly += new EventHandler(myPlayer_OnLoopingPaly);
myPlayer.OnNormalPaly += new EventHandler(myPlayer_OnNormalPaly);
threadPlay = new Thread(new ThreadStart(myPlayer.Audio_Play));
threadPlay.Name = "player_" + i.ToString();
threadPlay.Start();
threadPlay.IsBackground = true;
i++;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void myPlayer_OnAudioPlay(object sender,AudioEventArgs args)
{
playInfo myplay = (playInfo)args.AudioPlayInfo;
string msg = myplay.devId.ToString() + "\r\n正在播放\r\n" + myplay.fileName + "\r\n";
MessageBox.Show(msg);
}
void myPlayer_OnNormalPaly(object sender, EventArgs e)
{
MessageBox.Show("Normal");
}
void myPlayer_OnLoopingPaly(object sender, EventArgs e)
{
//播放一分钟后终止线程
MessageBox.Show("Looping");
}
private void btn_File_Click(object sender, EventArgs e)//选择播放文件
{
OpenFileDialog filedg = new OpenFileDialog();
filedg.Filter = "音视频文件(*.wav)|*.wav";
if (filedg.ShowDialog() == DialogResult.OK)
{
if (filedg.FileName != "" || filedg.FileName != string.Empty)
{
txt_File.Text = filedg.FileName;
}
}
}
private void cBox_Devices_SelectedIndexChanged(object sender, EventArgs e)//选择声卡
{
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)//选择默认播放
{
if (radioButton1.Checked)
{
thisFlags = PlayFlags.Default;
}
}
private void radioButton2_CheckedChanged(object sender, EventArgs e)//选择循环播放
{
if (radioButton2.Checked)
{
thisFlags = PlayFlags.Looping;
}
}
private void btn_add_Click(object sender, EventArgs e)//添加进列表
{
DataRow dr = dt.NewRow();
dr["devId"] = ((KeyValuePair<Guid, string>)cBox_Devices.SelectedItem).Key;
dr["fileName"] = txt_File.Text.Trim();
dr["thisFlag"] = thisFlags;
dt.Rows.Add(dr);
dataGridView1.DataSource = dt;
}
private void btn_clear_Click(object sender, EventArgs e)//清除列表
{
dt.Rows.Clear();
dataGridView1.DataSource = dt;
}
}
}