您的位置:首页 > 编程语言

调用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: