Delphi урок - Воспроизводим звук в программе без MediaPlayer

Опубиковано: 25.03.2009 г., автор: , просмотров: 125034

    Delphi урок - Воспроизводим звук в программе без MediaPlayer

    Парадокс, но я часто сталкиваюсь с тем, что многие не умеют воспроизводить звук в программе без использования компонента MediaPlayer. В этом небольшом уроке я хочу исправить это дело и показать вам, как проиграть у себя в программе звуковой файл в формате Wav без использования MediaPlayer.

    На самом деле делается это очень просто.
    Достаточно всего лишь добавить в раздел uses модуль mmsystem

    И далее в месте где вам нужно воспроизвести звук использовать функцию PlaySound

    function PlaySound(pszSound:PChar; hmod:HINST; fdwSound:Cardinal):boolean;

    Как всегда разберем это на конкретном примере.

    Первым делом открываем Delphi, создаем новый проект и дописываем в раздел uses модуль mmsystem.
    Далее кидаем на форму кнопку (Button) с закладки Standard и создаем на ней обработчик событий Onclick.
    Между begin end пишем:

    PlaySound('D:\1.wav', 0, SND_ASYNC);

    Первый параметр в нашей функции это полный путь к звуковому файлу с указанием его расширения, т.к. у меня файл называется 1.wav и находиться на диске D:\ я написал тут 'D:\1.wav'.
    Второй параметр используется в случае, когда звук берется из ресурса, поскольку мы этого делать не будем, то можно этот параметр задавать равным 0 или nil.
    Последний параметр определяет, как будет воспроизводиться звук (режим воспроизведения). Существует несколько режимов воспроизведения которые задаются соответствующими флагами, вот пример некоторых из них:

    SND_ASYNC - Звук воспроизводится асинхронно и функция возвращается сразу же после начала воспроизведения. Чтобы прекратить воспроизведение нужно вызвать функцию PlaySound с параметром pszSound, равным 0.
    SND_LOOP - воспроизведение звука постоянно повторяется, одновременно надо установить флаг SND_ASYNC.
    SND_NOSTOP - Если заданный звук не может быть воспроизведен из-за занятости ресурсов, то функция немедленно вернет false (и звук не будет воспроизведен). Если же данный флаг не указан, то функция попытается остановить воспроизведение другого звука, чтобы освободить ресурсы.
    SND_PURGE - Останавливает воспроизведение любых звуков, вызванных в данной задаче.
    SND_SYNC - Синхронное воспроизведение звука события. Функция PlaySound возвращается только после окончания воспроизведения.

    т.е. Если мы хотим, чтобы звук воспроизводился асинхронно и постоянно повторялся в нашей функции нужно использовать флаги SND_ASYNC и SND_LOOP. Комбинировать флаги можно при помощи операции or.

    Пример:

    PlaySound('D:\1.wav', 0, SND_ASYNC or SND_LOOP);

    Вот в принципе и все что я хотел рассказать вам в этом уроке. До встречи.

    скачать Скачать звуковой файл в формате wav для экспериментов.

    P.S. Хотите вперед всех остальных посетителей сайта получать свежие Видео уроки, Аудио подкасты, статьи по Delphi.
    Участвовать в конкурсах и постепенно вливаться в нашу команду ?!
    Тогда прямо сейчас подписывайтесь на бесплатную мультимедийную рассылку сайта delphiexpert.ru
    Нас уже больше чем 1500 человек ! Подписаться



    Похожие материалы

    Последние из рубрики

    Alex 25 Dec 2016 в 21:48 #
    Какая нужна функция чтобы при нажатии той-же кнопки можно было выключить звук ?
    Артур 25 Nov 2014 в 13:53 #
    Всё получилось. Спасибо. Хочу звуковую азбуку для сына сделать. Чтобы тыркнув на букву программа озвучила букву. Всё работает.
    Perfcet answer! That 06 Oct 2014 в 20:32 #
    Perfcet answer! That really gets to the heart of it!
    You get a lot of res 06 Oct 2014 в 19:48 #
    You get a lot of respect from me for writing these helpful arleitcs.
    Валера 15 Dec 2013 в 21:56 #
    Мне нужно во время проигрывания длинной музыки 1.wav чувствовать нажатия на другие элементы управления. Естественно я использую опцию SND_ASYNC. Но в тоже время если ничего не происходило, мне нужно в конце этой музыки запустить таймер. Я использую следующее:
    PlaySound('1.wav',hInstance,SND_FILENAME or SND_ASYNC);
    Repeat
    B:=PlaySound('2.wav',hInstance,SND_FILENAME or SND_NOSTOP);
    Application.ProcessMessages;
    Until B;
    ShowMessage('START TIMER')
    Но почему-то я не слышу 1, а слышу 2. Хотя благодаря опции NOSTOP музыка 1 не должна прерываться! Где у меня проблема?

    ОтменитьДобавить комментарий