網上已經有很多朋友介紹過如何在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"按鈕通過設定緩衝區資訊來對緩衝區做調整,讓播放可以在失去焦點的時候繼續播放。除了播放功能外,還可以控制音量和聲道。
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);
}
}
}
}
}