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"按钮通过 设置缓冲区信息来对缓冲区做调整,让播放可以在失去焦点的时候继续播放。除了播放功能外,还可以控制音量和声道。

  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);
                }
            }
        }

    }

}

转自 http://www.cnblogs.com/stg609/archive/2008/10/27/1320375.html

时间: 2024-12-27 07:27:44

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

DirectX编程:C#中利用Socket实现网络语音通信[初级版本]

 [声明:本篇来源:http://www.cnblogs.com/stg609/archive/2008/11/19/1334544.html 作者:stg609]       现在时下的VOIP软件很多,比较有名的就是Skype,还有其它诸如UUcall. 快门等等.它们提供的功能除了网络上的语音通话外,还可以与固定电话.手机等通话.在本篇中主要介绍利用C#实现语音通信的基本方法.但是目前只实现了网 络上语音传输的基本功能,而且比较粗糙,没有采用什么算法来优化,所以大家千万不要期望过高.我写这

DirectX编程:[初级]C# 中利用 DirectSound 录音

花了一阵子,把DirectX安装后自带的帮助文件中的那部分关于DirectSound录音这块给看完了,顺便把那部分翻译成了中文,有些地方可能翻译的不是很通顺,不过总体上还是能看得懂的.查看中文翻译,建议大家在进行学习前可以先去看看.       期间也看了些别人的相关文章,感觉有点思路后就开始动手了,很高兴最后能顺利通过测试.不过我这个功能很简单,也不完善,只是最基本的可以录音.还待以后深入学习.       开发平台:VS.NET 2005 ,Windows XP SP2 ,DirectX S

vc++-VC++6.0播放wav格式音乐

问题描述 VC++6.0播放wav格式音乐 调用playsound ()函数. void CKTVClientDlg::OnPlay() { PlaySound("C:UsersAdministratorDesktopKTVClient1.wav ", NULL, SND_FILENAME | SND_ASYNC); } 也加了头文件#include "windows.h" #include "Mmsystem.h" #pragma commen

C# SoundPlayer无法播放wav文件

问题描述 使用SoundPlayer在winform下能正常播放WAV文件,但是把相同代码在C#做的Windows服务中就无法播放wav文件,请问是什么原因?微软BUG吗?SoundPlayerplayer=newSoundPlayer(@"d:1.wav");player.Play(); 解决方案 解决方案二:有没有哪位知道的?

在CB中进行DirectX编程(1)

C++ Builder是一个可视化的C++编程环境,它为编程人员提供了一种方便高效.简便的C++语言开发工具,因此已为广大C++程序员所青睐,DirectX开发工具包是微软公司提供的一套Windows9X下开发高性能图形.声音.输入输出和网络游戏的接口,其高效的直接硬件访问.程序与硬件设备之间的相对独立等特性,几乎使得DirectX成为唯一可以在Windows操作系统下开发游戏程序的基本工具软件. 虽然C++ Builder中直接包含了一套DirectX3的开发包,也提供了一些例程,但是这些例程

Python中利用原始套接字进行网络编程的示例

  这篇文章主要介绍了Python中利用原始套接字进行网络编程的示例,使用sock_raw接受和发送数据包可以避开网络协议的诸多限制,需要的朋友可以参考下 在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_RAW进行数据发送. 使用SOCK_RAW的优势是,可以对数据包进行完整的修改,可以处理IP层上的所有数据包,对各字段进行修改,而不受UDP和TC

在 C++ Builder中利用串行通信控件编程

摘要:串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.本文介绍了在C++ Builder中如何利用串行通信控件进行串行通信编程. 一.引言 目前,在用计算机进行数据传输时,常用的是串行通信方式.用C++ Builder来编写串行通信程序时,可以调用Windows API函数,也可以利用VB中的MSComm控件. 利用 API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难.但是使用串行通信控

WPS演示教程:利用创建播放器方式在wpp中插入flash

wpp课件在别的电脑上演示,发现课件中插入的Flash动画不能正常播放,一检查竟然未装有Flash播放程序.为避免这种情况发生,可以采用利用创建播放器方式插入flash. 第1步 用Macromedia flash palyer打开要插入的swf文件"葬花",单击"文件"→"创建播放器"命令,在弹出的对话框中,选择好保存位置和文件名称,单击"保存"按钮. 文件变成带播放器的自动执行文件exe格式,可以在没有flash播放器的机

Python中利用生成器实现的并发编程

  这篇文章主要介绍了简单介绍Python中利用生成器实现的并发编程,使用yield生成器函数进行多进程编程是Python学习进阶当中的重要知识,需要的朋友可以参考下 我们都知道并发(不是并行)编程目前有四种方式,多进程,多线程,异步,和协程. 多进程编程在python中有类似C的os.fork,当然还有更高层封装的multiprocessing标准库,在之前写过的python高可用程序设计方法中提供了类似nginx中master process和worker process间信号处理的方式,保