Cảnh báo âm thanh
Để làm việc với âm thanh, API MQL5 cung cấp một hàm: PlaySound
.
bool PlaySound(const string soundfile)
Hàm này phát tệp âm thanh được chỉ định ở định dạng wav
.
Nếu tên tệp được chỉ định mà không có đường dẫn (ví dụ: "Ring.wav"), tệp đó phải nằm trong thư mục Sounds
bên trong thư mục cài đặt terminal. Nếu cần, bạn có thể tổ chức các thư mục con bên trong thư mục Sounds
. Trong trường hợp đó, tên tệp trong tham số soundfile
cần được thêm đường dẫn tương đối phía trước. Ví dụ, "Example/Ring.wav" đề cập đến các thư mục và tệp Sounds/Example/Ring.wav
bên trong thư mục cài đặt terminal.
Ngoài ra, bạn có thể sử dụng các tệp âm thanh nằm trong bất kỳ thư mục con MQL5 nào khác trong thư mục dữ liệu của terminal. Đường dẫn như vậy phải bắt đầu bằng dấu gạch chéo (/
hoặc \\
), là ký tự phân cách bạn sử dụng giữa các cấp thư mục liền kề trong hệ thống tệp. Ví dụ, nếu tệp âm thanh Demo.wav
nằm trong terminal_data_directory/MQL5/Files
, thì trong lời gọi PlaySound
, chúng ta sẽ viết đường dẫn "/Files/Demo.wav".
Việc gọi hàm với tham số NULL
sẽ dừng việc phát âm thanh. Gọi hàm với một tệp mới trong khi tệp cũ vẫn đang phát sẽ làm gián đoạn tệp cũ và bắt đầu phát tệp mới.
Ngoài các tệp nằm trong hệ thống tệp, một đường dẫn đến tài nguyên — các khối dữ liệu được nhúng trong chương trình MQL — cũng có thể được truyền vào hàm. Cụ thể, nhà phát triển có thể tạo một tài nguyên âm thanh từ một tệp có sẵn cục bộ tại thời điểm biên dịch trong môi trường sandbox. Tất cả các tài nguyên đều nằm trong tệp ex5, đảm bảo người dùng có chúng và đơn giản hóa việc phân phối chương trình dưới dạng một mô-đun duy nhất.
Một bài viết chi tiết về tất cả các cách sử dụng tài nguyên, bao gồm không chỉ âm thanh mà còn hình ảnh, dữ liệu nhị phân và văn bản tùy ý, cùng với các chương trình phụ thuộc (chỉ báo), được trình bày trong phần tương ứng ở phần thứ bảy của cuốn sách.
Hàm PlaySound
trả về true
nếu tệp được tìm thấy, hoặc false
nếu không. Lưu ý rằng ngay cả khi tệp không phải là tệp âm thanh và không thể phát được, hàm vẫn sẽ trả về true
.
Việc phát âm thanh được thực hiện không đồng bộ, song song với việc thực thi các lệnh chương trình tiếp theo. Nói cách khác, hàm trả lại quyền điều khiển cho mã gọi ngay sau khi được gọi, mà không đợi hiệu ứng âm thanh hoàn tất.
Trong trình kiểm tra chiến lược, hàm PlaySound
không được thực thi.
Tập lệnh OutputSound.mq5
cho phép bạn kiểm tra hoạt động của hàm.
void OnStart()
{
PRTF(PlaySound("new.txt"));
PRTF(PlaySound("abracadabra.wav"));
const uint start = GetTickCount();
PRTF(PlaySound("request.wav"));
PRTF(GetTickCount() - start);
}
2
3
4
5
6
7
8
Chương trình cố gắng phát nhiều tệp. Tệp "new.txt" tồn tại (được tạo đặc biệt để kiểm tra), tệp "abracadabra.wav" không tồn tại, và tệp "request.wav" được bao gồm trong phân phối tiêu chuẩn của MetaTrader 5. Thời gian của lời gọi hàm cuối cùng được đo bằng một cặp lời gọi đến GetTickCount
.
Kết quả của việc chạy tập lệnh, chúng ta nhận được các mục nhật ký sau:
PlaySound(new.txt)=true / ok
PlaySound(abracadabra.wav)=false / FILE_NOT_EXIST(5019)
PlaySound(request.wav)=true / ok
GetTickCount()-start=0 / ok
2
3
4
Tệp "new.txt" được tìm thấy và do đó hàm trả về true
, mặc dù nó không tạo ra âm thanh. Một lời gọi cho tệp thứ hai, không tồn tại, trả về false
, và mã lỗi trong _LastError
là 5019 (FILE_NOT_EXIST
). Cuối cùng, việc phát tệp cuối cùng (giả sử nó tồn tại) sẽ thành công ở mọi khía cạnh: hàm sẽ trả về true
, và terminal sẽ phát âm thanh. Thời gian xử lý lời gọi hầu như bằng không (thời lượng của âm thanh không quan trọng).