Search…

Chạy File Wav với Windows.h

04/09/20202 min read
Hướng dẫn sử dụng Windows.h để phát âm thanh với C/C++ Win32 API.

Âm thanh là một phần quen thuộc trong cuộc sống, trong lập trình cũng phải xử lý âm thanh và bài viết này giúp phát được file âm thanh chuẩn WAV trên Windows với Windows.h.

Trong thư viện Windows.h có các hàm hỗ trợ phát âm thanh file WAV - âm thanh dạng sóng như: PlaySound(), sndPlaySoundA(), PlaySoundA().

[0] Download project mẫu

STDIO_PlaySoundWav.zip

[1] Yêu cầu

Tạo một project với ngôn ngữ C++ bằng IDE Visual Studio hoặc tải sử dụng project vừa tải ở trên.

Để có thể dùng các hàm hỗ trợ phát âm thanh trước tiên phải #include <Windows.h>, phần hiện thực thuộc về thư viện winmm.lib vào trong phần Linker, nếu không có thư viện này thì sẽ không có mã thực thi cho các hàm phát âm thanh.

Cách thêm thư viện library vào có 2 cách, một là thêm vào phần link trong properties của project (sẽ không đề cập trong bài này) và cách thứ 2 là thêm dòng dưới vào file .cpp bất kỳ.

#pragma comment (lib, "winmm.lib")

[2] Cách sử dụng

Hàm đã được định nghĩa sẵn để phát một file âm thanh WAV.

bool PlaySound(LPCWSTR FileName, HMODULE TypeOfSound, DWORD Flag);

Hàm trên sẽ trả về true nếu âm thanh phát được và ngược lại. Sau đây tôi xin chú thích các thông số trên:

  • fileName: đường dẫn đến file âm thanh có định dạng WAV cần phát.
  • TypeOfSound: thông thường là sẽ NULL nếu là một file âm thanh có định dạng WAV.
  • Flag: cờ hiệu để phát một file âm thanh, ở đây dùng: SND_FILENAME, SND_LOOP, nếu muốn nghe được âm thanh đó, khi âm thanh kết thúc hàm trên sẽ trả về giá trị true. Còn nếu như muốn kiểm tra xem 1 file âm thanh có thể phát được hay không mà không cần phải đợi âm thanh kết thúc thì dùng cờ hiệu SND_ASYNC.
#include <stdio.h>
#include "windows.h"

#pragma comment(lib, "winmm.lib")

int main()
{
	bool isPlay = PlaySound(L"STDIO_SOUND_LOGO.wav", NULL, SND_FILENAME);

	if (isPlay)
		printf("This sound can be played");

	return 0;
}

Khi thực thi chương trình trên, phải đợi một lúc khi âm thanh được phát hết thì mới xuất hiện dòng chữ This sound can be played. Việc dòng chữ xuất hiện sau khi âm thanh được phát hết là do cờ hiệu đã được thiết lập là SND_FILENAME, nghĩa là hàm PlaySound được xử lý tuần tự, như vậy có thể làm gián đoạn ứng dụng trong quá trình âm thanh này đang phát, trong các chương trình thực tế, âm thanh vẫn có thể được phát trong khi chương trình vẫn hoạt động (vẫn cập nhật và vẽ), vậy cần xử lý bất đồng bộ bằng cách thay SND_FILENAME bằng SND_ASYNC.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024