Страницы: 1
RSS
Как воспроизвести MP3-файл и дождаться его завершения?
 
Т.е. нужно, чтобы во время выполнения макроса был запущен мп3-файл, и только после того, как этот файл проиграется о конца, макрос дальше продолжит свое выполнение.
 
Распаковать архив на диск.
 
Юра,  
этот метод не обеспечивает ожидания завершения проигрывания.  
Если после  
Call mciExecute("play " & str)  
поставить например  
Msgbox "After play"  
, то сообщение появляется сразу.  
 
Надо добавить "wait":  
 
Call mciExecute("play " & str & " wait")  
 
Воспроизведение аудио/видео с различными параметрами описано, например, тут: http://www.answers.com/topic/mciexecute  
http://www.brilliantdatabase.com/online_help.html/a_play.htm
 
Алексей, понял, спасибо!  
Я нашёл ещё вот это:  
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _  
               (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long  
   'lpszSoundName -Путь и имя WAV-файла для воспроизведения, или название системного звука  
   'uFlags -Ноль или большее количество следующих флажков, определяющих, как запустить звук:  
Const SND_ALIAS = &H10000       'Воспроизведение звуков Windows,определенных в WIN.INI или  
                               '    реестре(напр. SystemStart, Asterisk, и т.д.).  
Const SND_ASYNC = &H1           'Асинхронное воспроизведение  
Const SND_FILENAME = &H20000    'Запуск указанного файла  
Const SND_LOOP = &H8            'Циклическое воспроизведение до следующего вызова  
                               '    sndPlaySound lpszSoundName = "".  
                               '    Можно также использовать SND_ASYNC  
Const SND_NODEFAULT = &H2       'Не запускать звук по умолчанию Windows, если указанный звук  
                               '    не может быть найден.  
Const SND_NOSTOP = &H10         'Не прекращать воспроизведение любого запущенногозвука  
Const SND_NOWAIT = &H2000       'Не ждать,если драйвер занят  
Const SND_SYNC = &H0            'Синхронное воспроизведение(значение по умолчанию).  
                               '    Ждать, пока звук не закончил играть перед  
                               '    продолжающимся выполнением программы.  
Вроде, то, что нужно.
 
{quote}{login=Казанский}  
Надо добавить "wait":  
 
Call mciExecute("play " & str & " wait")  
 
Воспроизведение аудио/видео с различными параметрами описано, например, тут: http://www.answers.com/topic/mciexecute  
http://www.brilliantdatabase.com/online_help.html/a_play.htm{/post}{/quote}  
спасибо! работает perfectly ;)
 
Юрий М, ваш пример тоже работает, но он подходит только для WAV...  
 
Попутно возник вопрос: а можно как-нибудь по-другому приостановить выполнение кода макроса, пока вызванная им DDL процедура/функция не завершит свою работу? Просто в указанных выше примерах это достигается за счет передачи соответствующих параметров, но что делать если вызываемая функция не предоставляет такой возможности? можно что-то придумать?
 
>> что делать если вызываемая функция не предоставляет такой возможности?  
А что это за функция?
 
Например, вот:  
http://jaws.tiflocomp.ru/synths/sapi/sapidll.php
 
Не очень понимаю проблему: задавайте тогда тайм-аут на время звучания mp3. Или вызывайте отдельной процедурой.
 
А еще можно MP3 конвертировать в WAV. И пользоваться вариантами Алексея и Юрия.
Я сам - дурнее всякого примера! ...
 
KukLP, да, можно было бы и сконвертировать, согласен. Но только тогда файлы стали бы занимать место раз пять больше ))))  
 
Юрий, в библиотеке есть процедура, которая мне нужна:  
 
procedure Speak( Text : string);stdcall; - Проговаривает строку Text.    
 
Как видите, она не принимает никаких дополнительных параметров, а следовательно макрос не будет дожидаться окончания ее работы; а мне как раз нужно, чтобы он дождался. Мне нужно, чтобы пока текст не был проговорен до конца (вызываемой для этого внешней процедурой), код макроса не выполнялся.
 
Попробуйте из другой процедуры:  
sub Макрос1()  
call макрос2  
'дальнейшие действия  
end sub  
 
sub макрос2()  
'здесь говорилка  
end sub
 
Юрий М, okey, чуть попозже попробую.)
 
Не помогло. ((  
 
Может быть, все-таки есть какой-то способ?    
 
Кстати, а можно как-нибудь дождаться конца выполнения командного файла?
 
10 лет назад писал.
Я сам - дурнее всякого примера! ...
 
кстати, сам командный файл ждет окончания запущенной им программы.  
 
я как-то этим пользовался - запускал из командного файла архиватор в пакетном режиме, по окончанию работы архиватора,  тем же командным файлом создавал файл-индикатор end.txt  
макрос в холостом цикле  
 
do  
doevents  
loop until dir("end.txt")<>""  
 
ждал появления файла, после чего уничтожал его и продолжал работу..
Живи и дай жить..
 
{quote}{login=KukLP}{date=20.10.2012 09:43}{thema=}{post}10 лет назад писал.{/post}{/quote}  
о чем? )))
 
слэн, прикольно.) надо подумать над этим.)
 
Я вообще-то пример выложил, о чем. Вижу, зря старался.
Я сам - дурнее всякого примера! ...
 
я мог просмотреть... где?
 
Я один вижу свой файл в посте от 20.10.2012, 09:43?
Я сам - дурнее всякого примера! ...
 
>> Я один вижу свой файл в посте от 20.10.2012, 09:43?  
 
нет, теперь и я вижу его ))))))))  
 
просто издержки интерфейса... прошу прощения.)) но файлег интересный - обязательно его поизучаю... ;)
 
KukLP, спасибо. еще как пригодилось.))  
 
в общем, кажется, я нашел пока что самый лучший способ воспроизведения mp3. спасибо чуваку с http://vb.narod.ru/koding/stat/vb/11.htm за то, что на вел на мысль.))  
 
основная проблема всех перечисленных до этого метотов - они не позволяют прервать воспроизведение файла, пока он не доиграет до конца и не передаст уравление следующему оператору в скрипте. речь, конечно же, идет о синхронном воспроизведении, когда такое ожидание необходимо (в асинхронном такой проблемы нет, т.к. воспроизведение можно прервать посылом специальной команды в любой момент). но что делать, когда пользователь хочет прервать операцию, именно когда выполнение скрипта приостонавливается на время звучания?    
 
вот пример такого кода:  
 
<EM><FONT color=#99000><STRONG>Код в сообщении ниже.  
Автору: не нужно вкладывать в сообщение длинные листинги.</STRONG></FONT>  - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>  
 
пару комментов... PlayOneInChain запускает проигрывание файла (при этом получение короткого имени файла необходимо, т.к. mci функция не работает с пробела в имени и пути) в асинхронном режиме, но сразу же уходит в цикл ожидания окончания воспроизведения. в самом же цикле происходит переодическая проверка, не завершилось ли проигрывание, и если завершилось, то происходит выход. при этом цикл можно прервать досрочно сменив глобальный флаг восрпоизведения в одной из процедур вызываемых в doevents. ну вот и все, собственно.) рад буду, если это кому-то окажется полезным ;)
 
Код в текстовом файле.
Страницы: 1
Наверх