当前位置: 首页 > news >正文

DirectX编程:[初级]C#中利用DirectSound播放WAV格式声音[最少只要4句话]

      网上已经有很多朋友介绍过如何在C#中利用DirectSound来播放声音。今天自己试了下,发现真得很简单,对于初学者来说最简单不过了。只需要短短几句代码。其中关键的只要4句左右代码就OK了。

      效果图如下 :

     

      平台:VS.NET 2005 ,DirectX SDK(June 2008)

      需要引用的外部DLL:Microsoft.DirectX.dll 和 Microsoft.DirectX.DirectSound.dll。

      需要引用的命名空间:using Microsoft.DirectX.DirectSound。

      要实现播放效果的大致步骤:1 建立播放设备对象;2 建立缓冲区对象;3 设置缓冲区协作级别;4.播放缓冲区。

      因为比较简单,所以大家直接看代码吧。其中"Play"按钮主要的就四句话,实现播放效果,但它的缓冲区信息是默认的。"GlobalPlay"按钮通过设置缓冲区信息来对缓冲区做调整,让播放可以在失去焦点的时候继续播放。除了播放功能外,还可以控制音量和声道。

ContractedBlock.gif ExpandedBlockStart.gif PlayWav
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

//引用的命名空间
using Microsoft.DirectX.DirectSound;

namespace MyVoice
{
    
public partial class Form4 : Form
    {
        
public Form4()
        {
            InitializeComponent();
        }

        
private SecondaryBuffer secBuffer;//缓冲区对象
        private Device secDev;//设备对象

        
private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter 
= "(*.*)|*.*|(.wav)|*.wav";
            DialogResult dlgResult 
= openFileDialog1.ShowDialog();
            
if (dlgResult == DialogResult.OK)
            {
                textBox1.Text 
= openFileDialog1.FileName;
            }

        }

        
private void button2_Click(object sender, EventArgs e)
        {
            
if (textBox1.Text.Length > 0)
            {
                secDev 
= new Device();
                secDev.SetCooperativeLevel(
this, CooperativeLevel.Normal);//设置设备协作级别
                secBuffer = new SecondaryBuffer(textBox1.Text, secDev);//创建辅助缓冲区
                secBuffer.Play(0, BufferPlayFlags.Looping);//设置缓冲区为循环播放
            }
        }

        
private void button3_Click(object sender, EventArgs e)
        {
            
if (textBox1.Text.Length>0)
            {
                secDev 
= new Device();
                secDev.SetCooperativeLevel(
this, CooperativeLevel.Normal);//设置设备协作级别
                BufferDescription buffDes = new BufferDescription();
                buffDes.GlobalFocus 
= true;//设置缓冲区全局获取焦点
                buffDes.ControlVolume = true;//指明缓冲区可以控制声音
                buffDes.ControlPan = true;//指明缓冲区可以控制声道平衡
                secBuffer = new SecondaryBuffer(textBox1.Text, buffDes, secDev);//创建辅助缓冲区
                secBuffer.Play(0, BufferPlayFlags.Looping);//设置缓冲区为循环播放
            }
        }

        
private void button4_Click(object sender, EventArgs e)
        {
            
if (secBuffer != null)
            {
                secBuffer.Stop();
            }
        }

        
private void trackBar1_Scroll(object sender, EventArgs e)
        {
            
if (secBuffer != null)
            {
                secBuffer.Volume 
= -trackBar1.Value * 400;//音量为0表示最大的音量,因此设置时必须为负。
            }
        }

        
private void trackBar2_Scroll(object sender, EventArgs e)
        {
            
if (secBuffer != null)
            {
                
if (trackBar2.Value == 0)
                {
                    secBuffer.Pan 
= Convert.ToInt32(Pan.Left);//左声道
                }
                
else if (trackBar2.Value == 2)
                {
                    secBuffer.Pan 
= Convert.ToInt32(Pan.Right);//右声道
                }
                
else
                {
                    secBuffer.Pan 
= Convert.ToInt32(Pan.Center);
                }
            }
        }

    }
}

相关文章:

  • isnull rollup group by 三个关键字
  • 自我职业规划
  • 似影似梦的故事
  • ×××加密技术的应用
  • 我的十年感言
  • 工欲善其事,必先利其器——图文并茂详解VisualStudio使用技巧二
  • 如何修改已架好的域控制器的域名
  • Google Suggest .net 实现
  • 一个比赛的题目,大家出出主意看,我请他吃饭
  • 请高手帮助,网站被黑了,数据库中出现kill_kk表.不知道怎么解决!
  • 用 MapFileAndCheckSum 函数检测 exe 或 dll 是否被修改 - 回复 Joe Lo 的问题
  • 执行sql函数
  • 调试分布式 Web 应用程序
  • flex gumbo实例:重复填充BitmapGraphic对象
  • 一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
  • hexo+github搭建个人博客
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 2018一半小结一波
  • CSS 提示工具(Tooltip)
  • CSS 专业技巧
  • java概述
  • maven工程打包jar以及java jar命令的classpath使用
  • MySQL几个简单SQL的优化
  • Mysql数据库的条件查询语句
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Redis中的lru算法实现
  • Vim 折腾记
  • 对象引论
  • 服务器从安装到部署全过程(二)
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 数据可视化之 Sankey 桑基图的实现
  • 与 ConTeXt MkIV 官方文档的接驳
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​什么是bug?bug的源头在哪里?
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (待修改)PyG安装步骤
  • (动态规划)5. 最长回文子串 java解决
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (一)基于IDEA的JAVA基础10
  • (转)shell中括号的特殊用法 linux if多条件判断
  • *2 echo、printf、mkdir命令的应用
  • .NET Project Open Day(2011.11.13)
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .net项目IIS、VS 附加进程调试
  • //解决validator验证插件多个name相同只验证第一的问题
  • [android] 练习PopupWindow实现对话框
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [BZOJ1008][HNOI2008]越狱
  • [BZOJ2850]巧克力王国
  • [c]扫雷