Звуковые оповещения

Для работы со звуком MQL5 API предоставляет одну функцию: PlaySound.

bool PlaySound(const string soundfile)

Функция воспроизводит указанный звуковой файл в формате wav.

Если имя файла указано без пути (например, "Ring.wav"), он должен быть расположен в папке Sounds внутри каталога установки терминала. При необходимости внутри папки Sounds можно организовать вложенные папки — в таких случаях имя файла в параметре soundfile следует предварить относительным путем. Например, "Example/Ring.wav" ссылается на папки и файл Sounds/Example/Ring.wav внутри каталога установки терминала.

Кроме того можно использовать звуковые файлы, находящиеся в любой другой подпапке MQL5 в каталоге данных терминала. Такой путь следует указывать с начальной косой чертой (прямой одиночной '/' или удвоенной обратной '\\'), то есть с того символа-разделителя, который вы используете между соседними уровнями папок в файловой системе. Например, если звуковой файл Demo.wav лежит в папке каталог_данных_терминала/MQL5/Files, то в вызове PlaySound мы напишем путь "/Files/Demo.wav".

Вызов функции с параметром NULL останавливает воспроизведение звука. Вызов функции с новым файлом в тот момент, когда еще звучит старый, приведет к прерыванию старого и началу воспроизведения нового.

Кроме файлов, находящихся в файловой системе, в функцию можно передать путь к ресурсам — встраиваемым в MQL-программу блокам данных. В частности, разработчик может создать звуковой ресурс из файла, доступного локально во время компиляции в пределах "песочницы". Все ресурсы находятся внутри ex5-файла, что гарантирует их наличие у пользователя и упрощает распространение программы в виде единого модуля.

Подробный рассказ о всех способах применения ресурсов, включая не только звук, но и изображения, произвольные двоичные и текстовые данные, зависимые программы (индикаторы), представлен в соответствующем разделе в седьмой Части книги.

Функция PlaySound возвращает true, если файл найден, или false в противном случае. Учтите, что даже если файл не является звуковым и не может быть проигран, функция вернет true.

Проигрывание звука выполняется асинхронно, параллельно выполнению последующих инструкций программы. Иными словами, функция возвращает управление вызывающему коду сразу после вызова, не дожидаясь, когда аудиоэффект завершится.

В тестере стратегий функция PlaySound не выполняется.

Протестировать работу функции позволяет скрипт OutputSound.mq5.

void OnStart()
{
   PRTF(PlaySound("new.txt"));
   PRTF(PlaySound("abracadabra.wav"));
   const uint start = GetTickCount();
   PRTF(PlaySound("request.wav"));
   PRTF(GetTickCount() - start);
}

Программа пытается воспроизвести несколько файлов. Файл "new.txt" существует (создан специально для проверки), файл "abracadabra.wav" отсутствует, а файл "request.wav" входит в стандартную поставку MetaTrader 5. Время последнего вызова функции измеряется с помощью пары обращений к GetTickCount.

В результате запуска скрипта получим следующие записи в журнале:

PlaySound(new.txt)=true / ok
PlaySound(abracadabra.wav)=false / FILE_NOT_EXIST(5019)
PlaySound(request.wav)=true / ok
GetTickCount()-start=0 / ok

Файл "new.txt" был найден, и потому функция вернула true, хотя и не породила звука. Вызов для второго, несуществующего файла вернул false, а код ошибки в _LastError равен 5019 (FILE_NOT_EXIST). Наконец, проигрывание последнего файла (при условии его наличия) должно завершиться успешно во всех смыслах: функция вернет true, а терминал воспроизведет аудио. Время обработки вызова практически равно нулю (длительность звука не имеет значения).