|
KINH NGHIỆM LẬP
TRÌNH |
|
Dành cho U16: Làm
quen với C# và .NET
Lập trình DirectSound: Thêm chức năng điều khiển khi
chơi tập tin .WAV
Anh SI SÁP |
|
- Anh Si Sáp nè, chương trình chơi tập tin âm thanh
của mình còn thiếu chức năng Stop nên sau khi
bấm nút Play, nếu mình thấy "hổng hạp" thì
đành phải nghe cho hết hoặc bấm nút Kết thúc.
Kỳ quá hà! |
|
- Xem nào, lớp SecondaryBuffer có hàm
Stop(), dùng để dừng việc phát ra âm thanh. Vậy
thì em hãy giúp anh đặt thêm vào biểu mẫu một nút
lệnh mới có tên là btnStop và có thuộc tính
Text là Stop (H.1). Tiếp theo, em bấm
kép vào nút lệnh Stop này. Trong cửa sổ tập
tin nguồn Form1.cs sẽ xuất hiện hàm đáp ứng
tình huống Click của nút lệnh này, tên là
btnStop_Click. Em thêm vào trong hàm này các
lệnh như vầy (đoạn mã 1). |
|

Hình 1 |
|
Đoạn mã 1
private void btnStop_Click(object sender,
System.EventArgs e)
{
if (SoundBuffer != null &&
SoundBuffer.Status.Playing)
{
SoundBuffer.Stop();
}
} |
|
- Ủa, sao mình không gọi ngay hàm
SoundBuffer.Stop() mà phải đặt trong điều kiện
if vậy anh? |
|
- Nếu như SoundBuffer chưa được tạo ra hoặc
vì lý do nào đó việc tạo ra SoundBuffer không
thành công mà mình lại gọi hàm Stop() của nó
thì chương trình sẽ bị lỗi trong lúc chạy (runtime
error). Ngoài ra, trước khi gọi hàm Stop()
mình phải kiểm tra tình trạng hoạt động của
SoundBuffer, chứ nếu chương trình đã chơi xong
rồi thì còn "xì-tốp" làm chi nữa! Bây giờ em thử cho
biên dịch và chạy chương trình xem. À, có lẽ phải
tìm tập tin WAV nào dài dài một chút. Nếu tập tin
WAV ngắn quá, mình vừa bấm nút Play, nó chỉ
kêu "thất thanh" vài tiếng "tứng từng" rồi im thì
nút bấm Stop trở nên vô dụng! |
|
Tí Cận chạy chương trình, bấm nút Play, xong
bấm nút Stop rồi lại bấm nút Play. Âm
thanh tiếp tục phát ra từ chỗ vừa dừng chứ không
chơi lại từ đầu. |
|
- Ủa, sao nút Stop này hoạt động giống nút
Pause vậy anh? |
|
Anh Si Sáp gãi đầu: |
|
- Ờ... ờ... Để anh “nghiên kíu” tiếp xem sao... À,
đây rồi! Muốn cho chương trình chơi lại từ đầu thì
phải gọi hàm SetCurrentPosition() với tham số
là 0 để "tua" về đầu vùng đệm. Mình viết thêm trong
hàm đáp ứng btnStop_Click() như thế này (đoạn
mã 2). Rồi, em thử chạy lại xem sao. |
|
Đoạn mã 2
private void btnStop_Click(object sender,
System.EventArgs e)
{
if (SoundBuffer != null &&
SoundBuffer.Status.Playing)
{
SoundBuffer.Stop();
SoundBuffer.SetCurrentPosition(0);
}
} |
|
- A, lần này thì đúng là Stop chứ không phải
Pause nữa anh ạ. |
|
- Vậy em tự thêm chức năng Pause cho chương
trình này được không? |
|
- Chưa biết thì thấy khó, biết rồi thấy...cũng khó!
Hì hì... Nói chơi chứ em biết phải làm gì rồi. Chỉ
việc tạo thêm một nút lệnh Pause, đặt tên là
btnPause, trong biểu mẫu (H.2). Bấm kép vào
nút lệnh này trong biểu mẫu để vào hàm đáp ứng
btnPause_Click(). Mình “rinh” nguyên phần “ruột”
của hàm đáp ứng chức năng Stop đặt vào đây và
bỏ đi dòng lệnh gọi hàm SetCurrentPosition(),
phải không anh? |
|

Hình 2 |
|
- Tốt! Thôi mình nghỉ đi. Nãy giờ ngó màn hình mỏi
mắt, lại phải nghe "chương trình ca nhạc bắt buộc"
đến... mỏi tai. Mình ra sân chơi cầu lông một chút,
em chịu không? |
|
|