Alertas sonoras

Para trabajar con sonido, la API de MQL5 proporciona una función: PlaySound.

bool PlaySound(const string soundfile)

La función reproduce el archivo de sonido especificado en el formato wav.

Si el nombre del archivo se especifica sin una ruta (por ejemplo, «Ring.wav»), debe estar ubicado en la carpeta Sounds dentro del directorio de instalación del terminal. Si es necesario, puede organizar subcarpetas dentro de la carpeta Sounds. En tales casos, el nombre del archivo en el parámetro soundfile debe ir precedido de una ruta relativa. Por ejemplo, «Ejemplo/Ring.wav» se refiere a las carpetas y al archivo Sounds/Example/Ring.wav dentro del directorio de instalación del terminal.

Además, puede utilizar archivos de sonido ubicados en cualquier otra subcarpeta MQL5 del directorio de datos del terminal. Una ruta de este tipo debe ir precedida de una barra oblicua (una sola barra '/' o una doble barra invertida '\\'), que es el carácter delimitador que se utiliza entre niveles de carpetas adyacentes en el sistema de archivos. Por ejemplo, si el archivo de sonido Demo.wav está en terminal_data_directory/MQL5/Files, entonces en la llamada PlaySound escribiremos la ruta «/Archivos/Demo.wav».

Llamar a la función con un parámetro NULL detiene la reproducción del sonido. Llamar a una función con un nuevo archivo mientras el antiguo aún se está reproduciendo hará que el antiguo se interrumpa y el nuevo comience a reproducirse.

Además de los archivos ubicados en el sistema de archivos, una ruta a los recursos (bloques de datos incrustados en el programa MQL) se puede pasar a la función. En concreto, un desarrollador puede crear un recurso de sonido a partir de un archivo que esté disponible localmente en tiempo de compilación dentro de una «sandbox». Todos los recursos se encuentran dentro del archivo ex5, lo que garantiza que el usuario disponga de ellos y simplifica la distribución del programa como un único módulo.

Un artículo detallado sobre todas las formas de utilizar los recursos, incluidos no sólo el sonido, sino también las imágenes, los datos binarios y de texto arbitrarios y los programas dependientes (indicadores), se presenta en la sección correspondiente en la séptima parte del libro.

La función PlaySound devuelve true si se encuentra el archivo, o false en caso contrario. Tenga en cuenta que, aunque el archivo no sea de audio y no pueda reproducirse, la función devolverá true.

La reproducción del sonido se realiza de forma asíncrona, en paralelo con la ejecución de las siguientes instrucciones del programa. En otras palabras: la función devuelve el control al código de llamada inmediatamente después de la llamada, sin esperar a que se complete el efecto de audio.

En el probador de estrategias, la función PlaySound no se ejecuta.

El script OutputSound.mq5 permite probar el funcionamiento de la función.

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

El programa intenta reproducir varios archivos. El archivo «new.txt» existe (creado específicamente para las pruebas), el archivo «abracadabra.wav» no existe, y el archivo «request.wav» está incluido en la distribución estándar de MetaTrader 5. El tiempo de la última llamada a una función se mide utilizando un par de llamadas a GetTickCount.

Como resultado de la ejecución del script, obtenemos las siguientes entradas de registro:

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

Se encontró el archivo «nuevo.txt» y, por tanto, la función devolvió true, aunque no produjo ningún sonido. Una llamada para un segundo archivo inexistente devolvió false, y el código de error en _LastError es 5019 (FILE_NOT_EXIST). Por último, la reproducción del último archivo (suponiendo que exista) debería tener éxito en todos los sentidos: la función devolverá true, y el terminal reproducirá el audio. El tiempo de procesamiento de la llamada es prácticamente nulo (la duración del sonido no importa).