调用DirectX进行简单的多媒体编程系列(四)
2009-12-04 11:56
417 查看
但上面的例子中,只能播放单一文件,如果要是多个文件选择多个声卡同时播放呢?想到使用多线程来实现,再次封装多线程播放类
代码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;
}
}
}
全文文档下载:/Files/xnxylf/调用DirectX进行简单的多媒体编程系列.doc
代码下载:/Files/xnxylf/QBAudioSolution.rar
代码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;
}
}
}
全文文档下载:/Files/xnxylf/调用DirectX进行简单的多媒体编程系列.doc
代码下载:/Files/xnxylf/QBAudioSolution.rar
相关文章推荐
- 调用DirectX进行简单的多媒体编程系列(一)
- 调用DirectX进行简单的多媒体编程系列(二)
- 调用DirectX进行简单的多媒体编程系列(三)
- javascript异步调用XML进行解析的简单实现
- 简单的程序诠释C++ STL算法系列之十五:swap ---》利用swap()函数进行内存的释放
- Socket 由浅入深系列--------- 简单实现编程(三)
- 如何使用 JMeter 调用你的 Restful Web Service?进行简单的压力测试和自动化测试
- 文本分类系列-简单的使用cnn对新闻进行分类
- Dynamics CRM 2011 编程系列(23):用插件调用WCF
- Hessian远程调用框架进阶教程(一) Hessian介绍JAVA使用Hessian进行编程实例
- 【DirectX编程】数据缓冲区对图象进行水波处理
- C#系列教程——enum进行可靠编程
- 通过jni调用OpenCv跟直接调用android版openCv对图片进行简单的变换
- 百度地图系列01——最简单的调用百度地图
- 【Qt编程】基于Qt的词典开发系列<八>--用户登录及API调用的实现
- 跟我从头学TAO编程系列 (2) -- 编写最简单的TAO应用程序
- ASP.NET 3.5核心编程学习笔记(58):利用页面方法来进行远程调用
- Android平台通过C++的MediaPlayer进行多媒体播放在调用prepare时死锁问题
- Rx系列学习笔记_RxJava+Retrofit进行简单请求
- 用c#进行directx 3D编程:实现texture贴图的alpha通道