惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 聂微东
博客园 - 【当耐特】
Last Week in AI
Last Week in AI
量子位
S
SegmentFault 最新的问题
Hugging Face - Blog
Hugging Face - Blog
B
Blog RSS Feed
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
GbyAI
GbyAI
Jina AI
Jina AI
宝玉的分享
宝玉的分享
腾讯CDC
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
D
Docker
博客园_首页
N
News and Events Feed by Topic
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Help Net Security
Help Net Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cisco Blogs
F
Fortinet All Blogs
SecWiki News
SecWiki News
AI
AI
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Last Watchdog
The Last Watchdog
Martin Fowler
Martin Fowler
A
About on SuperTechFans
T
Troy Hunt's Blog
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
Hacker News: Ask HN
Hacker News: Ask HN
F
Full Disclosure
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
S
Security @ Cisco Blogs
Project Zero
Project Zero
Simon Willison's Weblog
Simon Willison's Weblog
C
Cyber Attacks, Cyber Crime and Cyber Security
J
Java Code Geeks
N
News | PayPal Newsroom
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
H
Hacker News: Front Page

博客园 - 落木

PowerDesigner中NAME和COMMENT的互相转换,需要执行语句 获取网站根目录的urli源代码 - 落木 - 博客园 Control的Invoke和BeginInvoke 扩大范围的多条件查询 用.net的GetCallbackEventReference函数来实现dropDownList联动的ajax效果 处理SQLSERVER死锁(转载) 调用DirectX进行简单的多媒体编程系列(三) 调用DirectX进行简单的多媒体编程系列(二) 调用DirectX进行简单的多媒体编程系列(一) 数据库分页算法 mysql想说爱你不容易啊,从mssql迁移到mysql时,几乎所有的存储过程都得改,语法相差很大,累人!! 自己写的sqlserver和mysql的行转列通用存储过程 MSSQL优化文章 C#中编写sqlserver中自定义函数,实现复杂报表 Ajax使用Post方式提交到.aspx页面交互的例子 核单台帐表(存储过程) 清欠率(存储过程) ExtJS中的面向对象设计,组件化编程思想 - 落木 - 博客园 ExtJS中如何扩展自定义的类
调用DirectX进行简单的多媒体编程系列(四)
落木 · 2009-12-04 · via 博客园 - 落木

但上面的例子中,只能播放单一文件,如果要是多个文件选择多个声卡同时播放呢?想到使用多线程来实现,再次封装多线程播放类

 

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(thisnew EventArgs());
            }
            
else
            {
//循环播放激发的事件
                OnLoopingPaly(thisnew 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;
        }

    }
}

全文文档下载:/Files/xnxylf/调用DirectX进行简单的多媒体编程系列.doc

代码下载:/Files/xnxylf/QBAudioSolution.rar