PlaySound и Alert

 

Здравствуйте! Пытаюсь озвучить сигналы своего индикатора при помощи функции PlaySound. Оформил, скомпелировал, болтает, процесс идет нормально!!! НО, без но не обошлось, с функцией Alert работает не полноценно. Только начинает воспроизводить нужный текст функция PlaySound (там несколько слов, типа "Сигнал вверх №1") как ее перебивает сигнал Алерта. Можно ли сделать так, чтобы функция PlaySound проигрывала полностью свой текст до конца после чего выходило окошко алерта со своим сигналом, или наоборот с начала алерт, потом функция PlaySound, не принципиально. Пробовал и перед алертом ставить PlaySound и после. Все равно почему то в первую очередь начинает звучать первые буквы из PlaySound потом алерт. Если функция PlaySound используется одна без алерта, то проигрывает все до конца. Ниже привожу свой код. С коментом, к стати, PlaySound работает фолноценно.

if (TimeBar!=Time[0] && AlertON && i==0 && S!=0)
      {
           
      Alert(Symbol()+ " " + "(" + " " + "M" + Period() + ")" + " = " + NameFigur);
      Comment(Symbol(),Period());
      PlaySound(Voice);
     
      TimeBar=Time[0];
    
      } 

Прошу помочь, кодом, советом, ссылкой, короче кто чем может.

P.S. прежде чем писать сюда, порыскал в интернете, почитал статейки. но не помогло. К стати, нашел в инете пример, типа работающий, код один в один как у меня, но у меня не проходит. 

 
Еще один момент. Поставил подряд две функции PlaySound и почему то проигрывается только последний. Хотелось бы чтобы все по очереди. Что делать???
 
Galex:
Еще один момент. Поставил подряд две функции PlaySound и почему то проигрывается только последний. Хотелось бы чтобы все по очереди. Что делать???
Делать паузу между мелодиями, достаточную для проигрывания первой из них. 
 
На сколько я знаю пауза в индикаторах не допускается, по крайней мере при помощи функции sleep. Какую функцию порекомендуете вы?
 
Galex:
На сколько я знаю пауза в индикаторах не допускается, по крайней мере при помощи функции sleep. Какую функцию порекомендуете вы?
Никакую. Если Вы - об индикаторе, то надо просто реже играть музыку. 
 
Хотелось чтобы модератор высказал свое мнение по этому вопросу. А то ответ -"...надо просто реже играть музыку." кажется не серьезным.
 
У модератора несколько иные функции. 
 
Galex:
Хотелось чтобы модератор высказал свое мнение по этому вопросу. А то ответ -"...надо просто реже играть музыку." кажется не серьезным.

у модератора действительно другие задачи. 

По поводу музыки. Не начинайте новую пока не закончится старая - что-то типа того - играйте реже. 

 
Galex:

Здравствуйте! Пытаюсь озвучить сигналы своего индикатора при помощи функции PlaySound. Оформил, скомпелировал, болтает, процесс идет нормально!!! НО, без но не обошлось, с функцией Alert работает не полноценно. Только начинает воспроизводить нужный текст функция PlaySound (там несколько слов, типа "Сигнал вверх №1") как ее перебивает сигнал Алерта. Можно ли сделать так, чтобы функция PlaySound проигрывала полностью свой текст до конца после чего выходило окошко алерта со своим сигналом, или наоборот с начала алерт, потом функция PlaySound, не принципиально. Пробовал и перед алертом ставить PlaySound и после. Все равно почему то в первую очередь начинает звучать первые буквы из PlaySound потом алерт. Если функция PlaySound используется одна без алерта, то проигрывает все до конца. Ниже привожу свой код. С коментом, к стати, PlaySound работает фолноценно.

if (TimeBar!=Time[0] && AlertON && i==0 && S!=0)
      {
           
      Alert(Symbol()+ " " + "(" + " " + "M" + Period() + ")" + " = " + NameFigur);
      Comment(Symbol(),Period());
      PlaySound(Voice);
     
      TimeBar=Time[0];
    
      } 

Прошу помочь, кодом, советом, ссылкой, короче кто чем может.

P.S. прежде чем писать сюда, порыскал в интернете, почитал статейки. но не помогло. К стати, нашел в инете пример, типа работающий, код один в один как у меня, но у меня не проходит. 

Остается один вариант.

При создании звуковых файлов делать тишину-паузу на длину звука Alert а. 

 
Можно доверить озвучку советнику или скрипту - напр ваш индикатор(ы) пишет сигнал(ы) в глобальную переменную, этот "голос за кадром" их считывает, озвучивает с нужными паузами и обнуляет. Я делал - вариант не идеальный, бо сигналы озвучиваются не моментально + надо составлять список времён звучания фраз
 
Одновременное воспроизведение (mp3) с использованием DLL:
//+------------------------------------------------------------------+
//|                                                    SoundTest.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#import "winmm.dll"
   int mciSendStringW(const string,long,uint,int);          // версия для передачи NULL в качестве строки в x64
   int mciSendStringW(const string,int,uint,int);           // версия для передачи NULL в качестве строки в x86
   int mciSendStringW(const string,string &,uint,int);      // версия для передачи строки в x86/x64
   int mciGetErrorStringW(int,string &,uint);               // получение текста ошибки в x86/x64
#import
//+------------------------------------------------------------------+
//| Подпапка песочницы                                               |
//+------------------------------------------------------------------+
#ifdef __MQL5__
   const string ExtMQL="MQL5";
#else
   const string ExtMQL="MQL4";
#endif
//+------------------------------------------------------------------+
//| Вызов правильной версии функции (от битности процесса)           |
//+------------------------------------------------------------------+
int mciSendString(string str)
  {
   if(_IsX64)
      return(mciSendStringW(str,(long)0,256,0));
//---
   return(mciSendStringW(str,(int)0,256,0));
  }
//+------------------------------------------------------------------+
//| Открытие файла                                                   |
//+------------------------------------------------------------------+
int SoundOpen(const string name,const string path)
  {
   static string data_path=NULL;
//---
   if(data_path==NULL)
      data_path=TerminalInfoString(TERMINAL_DATA_PATH)+"\\"+ExtMQL+"\\Files\\";
//---   
   return(mciSendString("OPEN \""+data_path+path+"\" TYPE MpegVideo ALIAS \""+name+"\""));
  }
//+------------------------------------------------------------------+
//| Воспроизведение с позиции (по умолчанию с позиции 0)             |
//+------------------------------------------------------------------+
int SoundPlay(const string name,long from_pos=0)
  {
   return(mciSendString("PLAY \""+name+"\" from "+IntegerToString(from_pos)));
  }
//+------------------------------------------------------------------+
//| Закрытие файла                                                   |
//+------------------------------------------------------------------+
int SoundClose(const string name)
  {
   return(mciSendString("CLOSE \""+name+"\""));
  }
//+------------------------------------------------------------------+
//| Получение описания ошибки                                        |
//+------------------------------------------------------------------+
string SoundErrDesc(int err)
  {
   string desc;
   StringInit(desc,256);
   mciGetErrorStringW(err,desc,256);
   return(desc);
  }
//+------------------------------------------------------------------+
//| Получение текущей позиции в файле                                |
//+------------------------------------------------------------------+
long SoundPos(const string name)
  {
   string res;
   StringInit(res,128);
   if(mciSendStringW("STATUS \""+name+"\" POSITION",res,256,0)==0)
      return(StringToInteger(res));
//---
   return(-1);
  }
//+------------------------------------------------------------------+
//| Получение длины файла                                            |
//+------------------------------------------------------------------+
long SoundLen(const string name)
  {
   string res;
   StringInit(res,128);
   if(mciSendStringW("STATUS \""+name+"\" LENGTH",res,256,0)==0)
      return(StringToInteger(res));
//---
   return(-1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int res;
   res=SoundOpen("music","1.mp3");   
   if(res!=0)
      Print("SoundError: ",SoundErrDesc(res));
   else
     {
      res=SoundOpen("music2","1.mp3");
      if(res!=0)
         Print("SoundError: ",SoundErrDesc(res));
      else
        {
         long len=SoundLen("music");   

         SoundPlay("music2");
         SoundPlay("music",len/2);
         
         while(!IsStopped())
           {
            long pos=SoundPos("music");            
            
            Comment(pos,"/",len,"\n",SoundPos("music2"),"/",len);
            
            if(pos==len)
               SoundPlay("music");
           }
         //---
         SoundClose("music");
         SoundClose("music2");
        }
     }
  }
//+------------------------------------------------------------------+