SỐ 133
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 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 SoundDeviceSoundBuffer 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 NamebtnPlay và có thuộc tính Text&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&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!

[Đầu trang]
Trang chủ
Nội lực "Peter Pan"
Cầu nối Intel Việt Nam
Chuyện trong tuần
Cõi người ta
Bình luận thị trường
Cõi Mô-bai
Chuyên đề
Bổ ngửa
Túi càn khôn IT
Hồ lô biến
Cảm về Game
Nhật ký e-CHÍP
Bản quyền Công ty Phần mềm & Truyền thông VASC
 99 Triệu Việt Vương HN; Tel: (04) 9782235 • email: echip@vasc.com.vn
Mọi chi tiết về kinh doanh và quảng cáo xin liên hệ Phòng Quảng cáo. Tel: (04) 9782077 kd@vasc.com.vn