|
HỒ LÔ BIẾN |
|
Dành cho U16: Làm
quen với C# và .NET
Lập trình DirectSound: chơi một tập tin WAV
Anh SI SÁP |
|
- Anh Si Sáp ơi, lần trước khi cài đặt DirectX
SDK, anh cho rằng “mới chỉ là khúc dạo đầu của
hành trình gian khổ”, làm em "nổi da gà" hết trơn
nè! |
|
- Thường thì bao giờ ta cũng thấy e ngại với lĩnh
vực mà mình còn lạ lẫm. Nhưng “học tri lý, bất học
bất tri lý”, có học, có thử làm thì mới biết em ạ.
Em nên lướt trên Internet để tìm kiếm thêm thông tin
về lập trình trong lĩnh vực DirectX. Từ khóa
để tìm kiếm trên mạng là DirectSound, C#
hoặc Programming chẳng hạn... |
|
- Nhưng trước hết anh bày cho em làm một chương
trình nho nhỏ để em biết bắt đầu từ đâu, nghe anh? |
|
- Mình hãy bắt đầu bằng việc lập trình
DirectSound để chơi một tập tin âm thanh dạng
WAV. Việc lập trình DirectSound có thể
được gói gọn trong 4 bước cơ bản như sau: |
|
1. Tạo đối tượng thiết bị SoundDevice. |
|
2. Tạo đối tượng vùng đệm SoundBuffer (cụ thể
là dùng đối tượng thuộc lớp SecondaryBuffer). |
|
3. Nạp tập tin âm thanh WAV vào vùng đệm
SoundBuffer. |
|
4. Cho âm thanh phát ra từ dữ liệu ở vùng đệm ấy. |
|
Mình thử nhé. Em hãy tạo một dự án thuộc loại
Windows Form. Trong cửa sổ Solution Explorer,
em bấm-phải vào mục Reference và chọn Add
Reference. Trong thẻ .NET của cửa sổ
Add Reference, em giữ phím Ctrl, bấm lần lượt
vào Microsoft.DirectX và
Microsoft.DirectX.DirectSound để chọn hai thành
phần đó (hình 1) rồi bấm nút OK. |
|

Hình 1 |
|
Để dùng hai thành phần vừa chọn, em mở tập tin nguồn
Form1.cs, thêm hai câu lệnh ở đầu tập tin như
vầy: |
|
using Microsoft.DirectX;
using Microsoft.DirectX.DirectSound; |
|
Mình nên tạo SoundDevice và SoundBuffer
ngay khi khởi động chương trình tức là trong hàm đáp
ứng tình huống Form1_Load. Sau khi tạo
SoundBuffer, em có thể nạp luôn dữ liệu âm thanh
từ tập tin WAV nào đó, chẳng hạn như tập tin
Windows XP Startup.wav trong Windows XP hay
The Microsoft Sound.wav trong các hệ điều hành
Windows cũ hơn (đoạn mã 1). |
|
Đoạn mã 1
private void MainForm_Load(object sender,
System.EventArgs e)
{
// Tạo thiết bị
SoundDevice = new Device();
// Xác lập mức độ cộng tác của thiết bị với các
ứng dụng khác cũng đang sử dụng thiết bị
SoundDevice.SetCooperativeLevel(this,
CooperativeLevel.Priority);
try
{
// Tạo vùng đệm cho thiết bị và nạp tập tin WAV
SoundBuffer =
new SecondaryBuffer(
"C:\\Windows\\Media\\Windows XP Startup.wav",
SoundDevice);
}
catch(SoundException sndex)
{
// Báo lỗi nếu không tạo được
MessageBox.Show(sndex.Message);
}
} |
|
Mình có thể thiết kế biểu mẫu đơn giản thôi: đặt một
nút lệnh có thuộc tính Name là btnPlay
và có thuộc tính Text là &Play. Khi
người dùng bấm vào nút này thì chương trình bắt đầu
phát âm thanh ra loa. Cũng như mọi khi, mình cần có
thêm một nút lệnh btnKetthuc, với thuộc tính
Text là &Ket thuc, để đóng cửa sổ và
kết thúc chương trình. |
|
Để viết hàm đáp ứng tình huống Click cho nút
Play, em chọn nút Play, chọn thẻ
event (biểu tượng tia sét) trong cửa sổ
Properties, bấm kép vào tình huống Click.
Hàm đáp ứng tình huống btnPlay_Click lập tức
xuất hiện trong cửa sổ mã. Em viết hàm đó như vầy nè
(đoạn mã 2). Tương tự, em viết hàm đáp ứng tình
huống Click của nút lệnh Ket thuc để kết thúc
chương trình. Không có chi nhiều, mình chỉ cần gọi
hàm Close() là xong (đoạn mã 2). Khi kết thúc
chương trình, em nhớ giải tỏa vùng đệm
SoundBuffer và thiết bị SoundDevice. Mình
thực hiện việc này thông qua hàm Dispose()
(đoạn mã 3). Coi như xong rồi đó, bây giờ em cho
biên dịch và chạy thử xem sao. |
|
Đoạn mã 2
private void btnPlay_Click(object sender,
System.EventArgs e)
{
if (SoundBuffer != null)
{
// Bắt đầu chơi tập tin âm thanh đã nạp trong
vùng đệm
SoundBuffer.Play(0, BufferPlayFlags.Default);
}
}
...
private void btnKetthuc_Click(object sender,
System.EventArgs e)
{
Close();
} |
|
Đoạn mã 3
protected override void
Dispose(bool disposing)
{
if (SoundBuffer != null)
SoundBuffer.Stop();
if (SoundDevice != null)
SoundDevice.Dispose();
if(disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
} |
|
 |
|
- U ra! Thành công rồi! Em đã nghe được “giai điệu”
quen thuộc của Windows XP khi khởi động. Chương
trình ngắn gọn và đơn giản quá hén! |
|
- Dĩ nhiên rồi, Tí Cận ơi. Chương trình của anh em
mình chỉ thuộc loại "ê a" thôi mà, đã làm được gì
nhiều đâu! |
|
|