Beep — Процедура Delphi


Содержание

Beep — Процедура Delphi

Помогите пож. заставить звучать встроенный динамик компа.
Beep не работает, MessageBeep($FFFFFFFF) тоже. :(

Значит его нет или он неисправен.

А динамик-то физически подключен?

Надо убрать драйверы звуковой карты или включить колонки.

В настройках регулятора громкости проверь — не выключен ли динамик ПК.

if SoundCardPresent then MessageBeep(MB_ICONASTERISK) else MessageBeep($FFFFFFFF);

Anatoly Podgoretsky © (16.02.05 13:58) [1]
Чапаев © (16.02.05 13:59) [2]
Есть однозначно и подключен, и исправен, звук то при загрузке ПК есть. бивис им пищит.
palva © (16.02.05 14:31) [4]
Колонков на том ПК нет, это рабочий ПК. Драйвер убирать тоже нельзя потому, что иногда все-таки на нем смотрят видео инсрукции со звуком.
Leshiy © (16.02.05 14:45) [5]
Нет, не отключен.
Reindeer Moss Eater © (16.02.05 15:01) [6]
Мне то нужно вывести звук через системный динамик даже если SoundCardPresent=True, но MessageBeep($FFFFFFFF) ну никак не работает.

КаПиБаРа © (16.02.05 14:31) [3]
Сейчас буду пробовать.

КаПиБаРа © (16.02.05 14:31) [3]
Не работает на 4х ПК.

Открой корпус и посмотри куда спикер подключен.

Reindeer Moss Eater © (16.02.05 15:31) [10]
А куда его еще можно подключить кроме как к материнке?
При переключении раскладки клавиатуры в FAR»e он ведь пищит. Но как самому его сделать.

И как ни странно не везде срабатывает
echo -код символа
на одном ПК bat»ник пищит на на другом нет 8(

var
Win32Ver : TOSVersionInfo;
Win32Platform : Integer;

procedure Sound(Frequency, Duration: Integer);
asm
push edx
push eax
mov eax, Win32Platform
cmp eax, VER_PLATFORM_WIN32_NT
jne @@9X
call Windows.Beep
ret
@@9X:
pop eax
pop edx
push ebx
push edx
mov bx, ax
mov ax, 34DDh
mov dx, 0012h
cmp dx, bx
jnc @@2
div bx
mov bx, ax
in al, 61h
test al, 3
jnz @@1
or al, 3
out 61h, al
mov al, 0B6h
out 43h, al
@@1:
mov al, bl
out 42h, al
mov al, bh
out 42h, al
call Windows.Sleep
in al, 61h
and al, 0FCh
out 61h, al
jmp @@3
@@2:
pop edx
@@3:
pop ebx
end;
.
Win32Ver.dwOSVersionInfoSize := SizeOf(Win32Ver);
GetVersionEx(Win32Ver);
Win32Platform := Win32Ver.dwPlatformId;
Sound(1000,1000);

_silver © (16.02.05 16:41) [13]
Большое спасибо, код работает!

Звук в Delphi

4 ответа

используй функцию WinAPI Beep

[quote=Monarhia]У меня вопрос такой: как создать звук в делфи!
надо создать чтот тип писка что бы можно было выставлять чистоту звука! я незнаю как сделать, искал статьи так и не нашел(
к пример кажись на pascal это sound(hz:word)[/quote]
2 Sagittarius и Sania
так ему же чИстоту надо, а вы ему про чАстоту:)

а если серьезно то, Beep это то, что надо, но вот скажем в Delphi 7 мне приходилось её описывать самостоятельно, потому что не работала, несмотря на то, что описана в windows.pas как надо, так что на всякий случай

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Beep — Процедура Delphi

BOOL Beep(
DWORD dwFreq, // sound frequency
DWORD dwDuration // sound duration
);
Parameters
dwFreq
[in] Specifies the frequency, in hertz, of the sound. This parameter must be in the range 37 through 32,767 (0x25 through 0x7FFF).
Windows 95/98/Me: The Beep function ignores this parameter.

dwDuration
[in] Specifies the duration, in milliseconds, of the sound.
Windows 95/98/Me: The Beep function ignores this parameter.

Delphi Knowledge Base

More than 2000+ Delphi articles.

2010. október 8., péntek

Beep/Sound in Delphi

Beep/Sound in Delphi

The following assembler Routines implement sound output via port access and work therefore only with Win3.x and Win95/98. Simply call Sound(hz) with hz as frequency in Hz, and stop the sound output with NoSound().

If your application will run under Windows NT, you may use the operating system routine:

function InPort(PortAddr: word): byte; assembler; stdcall;
asm
mov dx,PortAddr
in al,dx
end;

procedure OutPort(PortAddr: word; Databyte: byte); assembler; stdcall;
asm
mov al,Databyte
mov dx,PortAddr
out dx,al
end;

procedure Sound(Hz: Word);
var
TmpW: Word;
begin
OutPort($43, 182);
TmpW := InPort($61);
OutPort($61, TmpW or 3);
OutPort($42, lo(1193180 div hz));
OutPort($42, hi(1193180 div hz));
end;

procedure NoSound;
var
TmpW: Word;
begin
OutPort($43, 182);
TmpW := InPort($61);
OutPort($61, TmpW and 3);
end;

BEEP для Delphi, который работает как в Pascal

Delphi , Мультимедиа , Speaker

BEEP для Delphi, который работает как в Pascal

Билл Гейтс был ограблен по дороге в Банк, где он собирался уплатить налоги за 3 года наличными. Преступникам удалось угнать лишь две машины из всей колонны грузовиков.

Я применяю следующий код, однако он работает только под Win9x/me (Под WinNT/2000/XP вы можете использовать Beep(Tone, Duration) — задавать тон и продолжительность звучания).

Статья BEEP для Delphi, который работает как в Pascal раздела Мультимедиа Speaker может быть полезна для разработчиков на Delphi и FreePascal.

Комментарии и вопросы

Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.

Использование процедур и функций в Delphi

Скобки

Добавление скобок при вызове процедур и функций без параметров уже давно не является новинкой в Delphi, тем не менее, эта возможность мало известна. Эту возможность оценят по достоинству те программисты, которым приходится работать на двух языках (C++ и Delphi), так как им не нужно будет постоянно помнить о разнице в синтаксисе при вызове процедур и функций в разных языках. В Delphi оба варианта, приведенные ниже, считаются корректными.

Возможность перегрузки

Впервые концепция перегрузки процедур и функций была реализована в Delphi 4. Она позволяет иметь несколько различных процедур и функций с одинаковыми именами, но с разными списками параметров. Такие процедуры и функции должны быть описаны с применением директивы overload.

procedure Test (I: integer); overload;
procedure Test (S: string); overload;
procedure Test (D: double); overload;

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

Передача параметров

Pascal позволяет передавать параметры в функции и процедуры либо по значению, либо по ссылке. Передаваемый параметр может иметь любой встроенный или пользовательский тип либо являться открытым массивом. Параметр также может быть константой, если его значение в процедуре или функции не меняется.

Передача параметров по значению

Этот режим передачи параметров применяется по умолчанию. Если параметр передается по значению, создается локальная копия данной переменной, которая и предоставляется для обработки в процедуру или функцию. Посмотрите на следующий пример:

procedure Test(s: string);

При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s.

Однако это не относится к объектам. Например, если в функцию передается переменная (а точнее экземпляр объекта) TStringList, то в данном случае произойдет передача по ссылке (даже если это не указано явно). Этот способ передачи является у большинства самым излюбленным, но в тоже время является и самым не практичным, т.к. для выполнения метода выделяется дополнительная память для создания точной копией передаваемой переменой. Для решения этой проблемы следует использовать один из способов описанных ниже.

Передача параметров по ссылке

Pascal позволяет также передавать параметры в функции или процедуры по ссылке — такие параметры называются параметрами-переменными. Передача параметра по ссылке означает, что функция или процедура сможет изменить полученные значения параметров. Для передачи параметров по ссылке используется ключевое слово var, помещаемое в список параметров вызываемой процедуры или функции.

procedure ChangeMe(var x: longint);
begin
x := 2; // Параметр х изменен вызванной процедурой
end;

Вместо создания копии переменной x, ключевое слово var требует передачи адреса самой переменной x, что позволяет процедуре непосредственно изменять ее значение.

Передача параметров констант

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

procedure Test(const s: string );

Передача открытых массивов

Открытый массив параметров позволяет передавать в функцию или процедуру различное количество параметров. В качестве параметров можно передать либо открытый массив элементов одинакового типа, либо массивы констант различного типа. В приведенном ниже примере объявляется функция, которой в качестве параметра должен передаваться открытый массив целых чисел.

function AddEmUp(A: array of integer): integer;

В открытом массиве можно передавать переменные, константы или выражения из констант.

Для получения информации о фактически передаваемом массиве параметров в функции или процедуре могут использоваться функции High, Low и SizeOf.

Object Pascal также поддерживает тип array of const, который позволяет передавать в одном массиве данные различных типов. Синтаксис объявления функций или процедур, использующих такой массив для получения параметров, следующий:

procedure WhatHaveIGot( A: array of const );

Вызвать объявленную выше функцию можно, например, с помощью такого оператора:

procedure WhatHaveIGot( [‘Text’, 10, 5.5, @WhatHaveIGot, 3.14, true, ‘c’] );

При передаче функции или процедуре массива констант все передаваемые параметры компилятор неявно конвертирует в тип TVarRec. Тип данных TVarRec объявлен в модуле System следующим образом:

PVarRec = ^TVarRec;
TVarRec = record
case Byte of
vtInteger: (VInteger: Integer; VType: Byte);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PShortString);
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant: (VVariant: PVariant);
vtInterface: (VInterface: Pointer);
vtWideString: (VWideString: Pointer);
vtInt64: (VInt64: PInt64);
end;

Поле VType определяет тип содержащихся в данном экземпляре записи TVarRec данных и может принимать одно приведенных значений.

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

procedure WhatHaveIGot( A: array of const );
var
i: integer;
TypeStr: string;
begin
for i := Low(A) to High(A) do
begin
case A[i].VType of
vtInteger : TypeStr := ‘Integer’;
vtBoolean : TypeStr := ‘Boolean’;
vtChar : TypeStr := ‘Char’;
vtExtended : TypeStr := ‘Extended’;
vtString : TypeStr := ‘String’;
vtPointer : TypeStr := ‘Pointer’;
vtPChar : TypeStr := ‘PChar’;
vtObject : TypeStr := ‘Object’;
vt ;
vtW ;
vtPW ;
vtAnsiString : TypeStr := ‘AnsiString’;
vtCurrency : TypeStr := ‘Currency’;
vtVariant : TypeStr := ‘Variant’;
vtInterface : TypeStr := ‘Interface’;
vtW ;
vtInt64 : TypeStr := ‘Int64’;
end;
ShowMessage( Format( ‘Array item %d is a %s’, [i, TypeStr] ) );
end;
end;

Значения параметров по умолчанию

В Delphi есть одна очень полезная возможность — использование значений параметров по умолчанию. Она позволяет установить принимаемое по умолчанию значение параметра процедуры или функции. Это значение будет использоваться в тех случаях, когда вызов процедуры или функции производится без указания значения данного параметра. В объявлении процедуры или функции принимаемое по умолчанию значение параметра указывается после знака равенства, следующего после его имени. Поясним это на следующем примере:

procedure HasDefVal( s: string; i: integer = 0 );

Подобное объявление означает, что процедура HasDefVal может быть вызвана двумя путями. В первом случае — как обычно, с указанием обоих параметров:

procedure HasDefVal( ‘Hello’, 26 );

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

procedure HasDefVal( ‘Hello’ );

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

  • Параметры, имеющие значения по умолчанию, должны располагаться в конце списка параметров. Параметр без значения по умолчанию не должен встречаться в списке после параметра, имеющего значение по умолчанию.
  • Значения по умолчанию могут присваиваться только параметрам обычных типов, указателям или множествам.
  • Значение по умолчанию может передаваться только по значению либо с модификатором const. Оно не может быть ссылкой или нетипизированным параметром.

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

function Add( I1, I2: integer ): integer;
begin
Result := I1 + I2;
end;

Предположим также, что исследования показали целесообразность добавления в программу возможности сложения трех чисел. Однако замена имеющейся функции функцией сложения трех чисел приведет к тому, что вам придется переправлять немало текста, который перестанет компилироваться из-за внесения в функцию еще одного параметра. Однако при использовании значений параметров по умолчанию проблема решается легко и просто. Достаточно изменить объявление функции так, как показано ниже.

function Add( I1, I2: integer; I3: integer = 0 ): integer;
begin
Result := I1 + I2 + I3;
end;

Директива

Директива <$X->запрещает вызов функций как процедур (с игнорированием возвращаемого результата). По умолчанию этот режим включен (<$X+>). Так вот, запомните, использование переменной Result недопустимо при сброшенном флажке опции Extended Syntax, расположенном во вкладке Compiler диалогового окна Project Options, или при указании директивы компилятора <$X->.

В каждой функции языка Objecl Pascal существует локальная переменная с именем Result, предназначенная для размещения возвращаемого значения. Кроме того, вернуть значение из функции можно также путем присвоения значения переменной, имеющей то же имя, что и данная функция. Это стандартный синтаксис языка Pascal, сохранившийся от его предыдущих версий. При использовании в теле функции переменной с ее именем не забывайте, что существуют большие отличия в обработке этого имени — все зависит от того, где она расположена — в левой части оператора присвоения или же в любом другом месте текста функции. Если имя функции указано в левой части оператора присвоения, то предполагается, что назначается возвращаемое функцией значение. Во всех других случаях предполагается, что осуществляется рекурсивный вызов этой функции.

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

Как создавать звуковые заметки в Delphi?

Есть ли команда, которую мы можем сделать нашим приложением Delphi для эмуляции звука, где мы можем выбрать числовой тон и продолжительность, как в основном?

Чтобы создать чистый синус, вы можете использовать

который будет воспроизводить чистый синусовый сигнал 400 Гц в течение 1000 миллисекунд.

Если вы хотите играть на реальном инструменте (фортепиано, гитара или любой из 125 (?) других опций), вы можете использовать MIDI. Просто используйте блок MMSystem и сделайте

После инициализации системы MIDI вы можете попробовать

MIDI-программирование настолько недооценено!

Процедура Beep, Система, Delphi, статті

Ця процедура не має ніяких параметрів. Її оголошення виглядає досить-таки просто:

Суть цієї процедури – відтворювати стандартний звуковий сигнал, встановлений в Windows, якщо є звукова карта і налаштований стандартний звук, якщо ж ні, то звук надійде через динамік комп’ютера у вигляді короткого клацання. Її можна використовувати, наприклад, при введенні користувачем не тих даних, або при закритті форми:

З першої процедурою ми розібралися. Тепер подивимося другу …

Функція MessageBeep

Ця функція є більш серйозною, вона визначена як:

Параметр uType вказує відтворений звук, як ідентифікатор розділу [Sounds] реєстру, в якому записані звуки, які супроводжують ті, чи інші події Windows. Параметр uType може приймати такі значення:


  • MB_ICONASTERISK – програє звук “Зірочка” (SystemAsterisk)
  • MB_ICONEXCLAMATION – програє звук “Вигук” (SystemExclamation)
  • MB_ICONHAND – програє звук “Критична помилка” (SystemHand)
  • MB_ICONQUESTION – програє звук “Питання” (SystemQuestion)
  • MB_OK – програє звук “Стандартний звук” (SystemDefault)

Треба зазначити, що ця функція відтворює звук асинхронно, тобто під час відтворення звуку Ваше додаток продовжує працювати. Після запиту звуку функція MessageBeep передає управління викликала її функції.

Якщо неможливо відтворити зазначений звук, то функція спробує відтворити стандартний системний звук, встановлений за умовчанням, якщо і це неможливо, то буде відтворено стандартний сигнал через динамік.

Ну і нарешті, залишилася сама цікава і корисна функція відтворення звуку, про неї ми зараз і поговоримо.

Функція PlaySound

Ця функція може відтворювати будь-які хвильові звуки, а не тільки звуки подій Windows. Функція API Windows, параметри якої описані в модулі mmsystem. Тому для використання цієї функції в Ваших програмах, необхідно включити в розділ uses модуль mmsystem. Функція PlaySound визначена так:

Параметр pszSound є нуль терминированной рядком (останній символ рядка має нульовий код), він визначає відтворений звук. Параметр hmod використовується у випадку, коли звук береться з ресурсу, оскільки ми цього робити не будемо, то можна цей параметр ставити рівним 0 або nil.

Останній параметр fdwSound є безліччю, яке визначає як буде відтворюватися звук (режим відтворення). Наведу найбільш важливі значення цієї множини для відтворення довільних хвильових прапорів.


  • SND_ASYNC – Звук відтворюється асинхронно і функція повертається відразу ж після початку відтворення. Щоб припинити відтворення потрібно викликати функцію PlaySound з параметром pszSound, рівним 0.
  • SND_LOOP – відтворення звуку постійно повторюється, одночасно треба встановити прапор SND_ASYNC.
  • SND_NOSTOP – Якщо заданий звук не може бути відтворений через зайнятість ресурсів, то функція негайно поверне false (і звук не буде відтворено). Якщо ж даний прапор не зазначений, то функція спробує зупинити відтворення іншого звуку, щоб звільнити ресурси.
  • SND_PURGE – Зупиняє відтворення будь-яких звуків, викликаних в даній завданню.
  • SND_SYNC – Синхронне відтворення звуку події. Функція PlaySound повертається тільки після закінчення відтворення.

Важливо: прапори можна комбінувати операцією or.

Зазначений параметром pszSound звук, повинен підходити для встановленого драйвера пристрою відтворення хвильових файлів, а також повинен міститися в доступну пам’ять.

Перервати відтворення звуку можна виконавши оператор

або шляхом завдання нового звуку.

Наприклад, щоб багаторазово і асинхронно програти небудь звук, вибраний за допомогою OpenDialog, можна написати такий код:

Ну ось, сподіваюся все ясно! Наступного разу буде що-небудь складніше і поцікавіше!

Схожі статті:

  • Час виконання скрипта на PHP. (0)
  • Функція пошуку в бета-версії Windows Vista SP1 (0)
  • Що таке драйвер? (0)
  • Офіційні WHQL-драйвери ForceWare v.93.71 (download) (0)
  • Відключення повідомлень про проблеми безпеки Windows Vista (0)
  • DriverMax 4.2 (download) (0)
  • Прикраса екрана привітання Windows XP (0)

Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML:

Подписка через RSS

Якщо вам сподобалася інформація на нашому сайті, ви можете підписатися на оновлення через RSS.

Beep Routine

Unit Edit

Description Edit

Definition (Delphi 6, 2007, 2009):

Definition (Delphi 2010):

Technical Comments Edit

(Known issues / Documentation clarifications / Things to be aware of)

Examples Edit

(Please provide links to articles/source code that show how to use this item.)

See Also Edit

(Please provide links to items specifically related to this item.)


User Comments/Tips Edit

(Please leave your name with your comment.)

Текст книги «Программирование в Delphi. Трюки и эффекты»

Это произведение, предположительно, находится в статусе ‘public domain’. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.

Автор книги: Александр Чиртик

Жанр: Программирование, Компьютеры

Текущая страница: 10 (всего у книги 24 страниц)

Глава 5
Мультимедиа

Воспроизведение звука с помощью системного динамика

Использование компонента MediaPlayer

Разработка звукового проигрывателя

Использование мультимедийных технологий позволяет повысить качество программ и придает им профессиональный, более привлекательный для пользователя, вид. Среди множества областей применения мультимедиа наиболее интересны аудио– и видеовозможности компьютера. Использование звуков и видео в программах позволяет иным образом взаимодействовать с пользователем: озвучивать его действия, информировать о различных событиях, просматривать видеоролики и т. п.

В рамках этой главы будут рассмотрены основные возможности мультимедийных средств и компонентов среды Delphi. Будут описаны компоненты Animate и MediaPLayer, способы использования API-функций для генерации звука системным динамиком и воспроизведения звука из ресурсных файлов.

В отличие от языков Turbo Pascal и Borland Pascal, Delphi не содержит процедур типа Sound или NoSound, предназначенных для работы со звуком. Для использования мультимедийных возможностей компьютера в Delphi служат специальные компоненты Animate и MediaPLayer.

Компонент MediaPLayer является основным элементом воспроизведения аудио– и видеофайлов. Многофункциональный элемент MediaPLayer обладает рядом возможностей и обеспечивает управление мультимедийными устройствами.

Для создания и воспроизведения простейшей анимации предназначен компонент Animate. Он позволяет воспроизводить файлы в формате AVI (Audio-Video Interleaved – аудио-и видеосмесь).

Воспроизведение звука с помощью системного динамика

Звуковое сопровождение является важной частью большинства современных мультимедийных приложений. В простейших случаях для генерации звукового сигнала достаточно использовать процедуру Beep модуля SysUtils. В этом случае отсутствует необходимость использовать компоненты Animate и MediaPLayer, а звук создается встроенным системным динамиком. Процедура Beep осуществляет вызов одноименной API-функции, поэтому ее использование не составляет большого труда (листинг 5.1).

Листинг 5.1. Генерация звукового сигнала посредством функции Beep

procedure TForm1.Button1Click(Sender: TObject);

Beep; //Генерация иязвукового огосигнала

MessageDlg(‘Звуковой сигнал был подан’ , mtError, [mbOK], 0);

Наряду с функцией Beep для получения звукового сигнала используется API-функция MessageBeep(uType: UINT): Boolean, генерирующая стандартный системный звук, тип которого указывается параметром uType. Параметр функции MessageBeep может задаваться двумя способами: в виде шестнадцатеричного числа и поименованной константы. Например, системный звук по умолчанию задается константой MB_OK, а стандартный системный звук задается шестнадцатеричным числом $FFFFFFFF. Функция возвращает параметр типа Boolean, который в случае успешного выполнения (воспроизведения звука) имеет значение True.

Использование компонента MediaPlayer

Мультимедийный проигрыватель MediaPlayer является многофункциональным управляющим элементом. Он предоставляет программисту набор свойств и методов, позволяющих манипулировать файлами и устройствами мультимедиа, воспроизводить файлы и перемещаться между фонограммами (дорожками, записями), а также идентифицировать подключенные устройства.

Компонент MediaPlayer содержит следующие кнопки (рис. 5.1, слева направо).

• Next – переход к следующей фонограмме (дорожке). Если в списке воспроизведения присутствует всего одна фонограмма, то выполняется переход в ее конец.

• Prev – переход к предыдущей фонограмме. Если в списке воспроизведения присутствует всего одна фонограмма, то выполняется переход в ее начало.

• Step – переход на несколько кадров вперед.

• Back – переход на несколько кадров назад.

• Record – включение режима записи.

• Eject – извлечение носителя.

Рис. 5.1. Вид компонента MediaPlayer

Компонент MediaPlayer обладает следующим рядом свойств, позволяющих управлять воспроизведением файлов.

• AutoOpen – определяет, должно ли устройство автоматически открываться после загрузки.

• AutoRewind – если свойство имеет значение True, то после завершения списка воспроизведения будет осуществлен переход в его начало.

• DeviceType – определяет тип устройства, которым должен управлять объект MediaPlayer. Свойство принимает одно из следующих значений:

· dtAVIVideo – файл AVI;

· dtCDAudio – аудио компакт-диски;

· dtDAT – цифровой кассетный аудиопроигрыватель;

· dtDigitalVideo – цифровое видео (AVI, MPG, MOV-файлы или ММ-фильм);

· dtMMMovie – формат multimedia movie;

· dtOther – неопределенный формат;

· dtVideodisc – проигрыватель видеодисков;

· dtWaveAudio – звуковой файл типа WAV;

· dtAutoSelect – компонент выбирает устройство автоматически (устанавливается по умолчанию).

• Display – задает оконный элемент, в котором будут воспроизводиться видеоданные. Если свойство не задано, то будет открываться новое дополнительное окно.

• DisplayRec – задает прямоугольную область для воспроизведения данных.

• EnableButtons – определяет набор командных кнопок, которые можно использовать в компоненте.

• StartPos – определяет начальную позицию для воспроизводимых данных. Если свойство не задано, то воспроизведение идет с начала.

• EndPos – определяет конечную позицию для воспроизведимых данных. Если свойство не задано, то воспроизведение идет до конца.

• Position – текущая позиция при воспроизведении.

• Tracks – определяет количество дорожек для компакт-дисков.

• Frames – определяет число кадров, на которое перемещается позиция устройства при вызове методов Back и Next.

• Length – длина файла (носителя).

• TimeFormat – устанавливает временной формат, используемый конкретным устройством.

• Wait – определяет, будет управление возвращено вызывающему приложению немедленно или после завершения воспроизведения.

Одним из важных свойств является свойство Capabilities типа TMPDevCapsSet, которое позволяет определить возможности выбранного и открытого устройства. Это свойство может принимать следующие значения, определяющие доступность соответствующих операций:

• mpCanEject – извлечение носителя;

• mpCanRecord – запись на носитель;

• mpCanStep – перемотка вперед или назад на определенное количество кадров;

• mpUsedWindow – использование окна для вывода изображения.

Перед использованием устройства его нужно открыть, поскольку большинство методов, например, Play и StartRecording, можно вызвать только после открытия устройства. Открытие выполняется путем вызова метода Open (листинг 5.2). Если необходимо выполнить автоматическое открытие устройства, то свойству AutoOpen типа Boolean следует присвоить значение True (по умолчанию ему присвоено значение False). После открытия какого-либо мультимедийного устройства свойство DeviseID типа Word проигрывателя будет содержать идентификатор открытого устройства. Если открытых устройств нет, то значение свойства DeviseID будет равно 0.

Листинг 5.2. Открытие устройства проигрывания компакт-дисков

procedure TForm1.Button2Click(Sender: TObject);

//Задаем устройства воспроизведения

После использования мультимедийного устройства его нужно закрыть, вызвав метод Close.

Открыв устройство с помощью свойства Tracks типа Longint, можно получить информацию о количестве фонограмм (дорожек). Если устройство не поддерживает дорожки, то значение этого свойства не определено. Свойство TrackLength [TrackNum: Integer] типа Longint содержит длину фонограммы с индексом TrackNum (отсчет начинается с единицы). Длина дорожки указывается в формате времени, заданным свойством TimeFormat.

Свойство TimeFormat типа TMPTimeFormats задает формат значений свойств, которые связаны со временем. Это свойство влияет на способ интерпретации и отображение значений таких свойств, как TrackLength, Length, StartPos, EndPos и Position. Основными значениями свойства TimeFormat являются следующие:

• tfMilliseconds – целое четырехбайтовое число (счетчик миллисекунд);

• tfHMS – количество часов, минут и секунд, размещенных побайтно, начиная с младшего байта, в четырехбайтовом целом (старший байт не учитывается);

• tfMSF – количество минут, секунд и кадров, размещенных побайтно, начиная с младшего байта, в четырехбайтовом целом (старший байт не учитывается);

• tfFrames – целое четырехбайтовое число, содержащее количество кадров.

Теперь, когда вы ознакомились с основными свойствами мультимедиа-компонента MediaPlayer, можно приступать к непосредственному применению его на практике. Ниже представлен пример исходного текста программы, при загрузке которой проигрывается звук (в формате WAV) (листинг 5.3).

Листинг 5.3. Воспроизведение звука при создании формы приложения

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

procedureTForm1. FormCreate (Sender: TObject);

//Автоматически определяем устройство воспроизведения

//Загружаем файл воспроизведения

if not MyMediaPlayer.AutoOpen then MyMediaPlayer.Open;

При создании формы Form1 воспроизводится звуковой файл start.wav.

В некоторых случаях удобнее хранить и использовать данные (например, звуковые записи) прямо в запускаемом модуле (EXE-файле). Такой метод предусматривает хранение звука в файлах ресурсов (RES). На этапе сборки программы файлы ресурсов прикрепляются к запускаемому модулю, тем самым увеличивая размер модуля, но количество файлов, необходимых для корректной работы программы, уменьшается. Так, в предыдущем примере для нормальной работы программы (воспроизведения звука при загрузке) необходим файл start. wav. Следующий пример демонстрирует создание приложения, запускаемый модуль которого будет содержать все необходимые ресурсы (в данном случае это звуковой файл).

В начале необходимо создать файл ресурса, который будет содержать звуковую запись. Для этого понадобится компилятор ресурсов, который находится в папке BorlandDelphi7Binи имеет имя brcc32.exe. Далее нужно создать файл ресурса. Все ресурсы (значки, указатели, изображения, таблицы строк и т. п.), используемые приложением, описываются в специальном файле. Такое описание имеет фиксированный формат:

Имя – это уникальное имя ресурса, которое используется в процедурах работы с ресурсами. Имя файла – строка, содержащая путь к файлу. В рассматриваемом случае строка, описывающая ресурс (звуковой файл в формате wav), имеет следующий вид:

LOADSOUND RCDATA LOADONCALL start.wav

Далее в командной строке нужно записать brcc32.exe source.rc, где source. rc – текстовый файл, содержащий описание ресурса.

После компиляции получается готовый файл ресурса source. res. Переместите его в папку проекта. На этом этапе ресурс уже может использоваться для сборки приложения.

Чтобы подключить файл ресурса, напишите в исходном тексте программы следующее:

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

Листинг 5.4. Использование ресурсов для хранения звуковых записей

//Функция, которая воспроизводит звук, находящийся в ресурсе

//Загружаем файл ресурса и находим звук под именем ‘LOADSOUND’

hResource:= LoadResource(hInstance, FindResource(hInstance, ‘LOADSOUND’, RT_RCDATA));

//Находим адрес загруженного ресурса

if pData = nil then raise Exception.Create(‘Ошибка чтения ресурса LOADSOUND’);

//Воспроизводим звуковой файл

Для работы функции RetrieveLoadSound понадобятся две переменные: hResource (дескриптор ресурса) и pData (указатель на память, расположение ресурса). Прежде чем приступить к непосредственному использованию, необходимо загрузить ресурс в память приложения (функция LoadResource), но, чтобы загрузить именно тот ресурс, который необходим (звук LOADSOUND), с помощью функции FindResource найдите LOADSOUND во всех ресурсах, подключенных к этому экземпляру приложения (hInstance). Теперь осталось получить указатель на память, в которой находится звуковой файл, и записать его в переменную pData. Если ресурс не будет найден, то программа выдаст сообщение об ошибке. После того как будет получен указатель на память, его можно будет использовать в функции sndPlaySound для воспроизведения звука. Параметр SND_MEMORY означает, что воспроизведение будет осуществляться из памяти приложения (а не из файла, как было показано ранее).

Функция RetrieveLoadSound может использоваться в любом месте программы для воспроизведения файла start.wav. При ее использовании данные звукового файла помещаются в запускаемый модуль, тем самым увеличивая его объем, но сокращая количество файлов приложения. Такой подход эффективен при создании небольших приложений, которые используют короткие звуковые сопровождения.

В конце главы будет подробно описан процесс создания универсального проигрывателя, работа которого целиком построена на использовании компонента MediaPLayer. Пока же рассмотрим следующий мультимедийный компонент Delphi – Animate, который позволяет воспроизводить как стандартную (встроенную в Windows), так и пользовательскую анимацию.

Компонент Animate

Видеоклип представляет собой файл в формате AVI, содержащий последовательность отдельных кадров, при отображении которых создается эффект движения. Наряду с изображением AVI-файлы могут содержать и звук. Для воспроизведения видеоклипов можно использовать любой из мультимедийных компонентов Delphi – Animate или MediaPLayer.

Компонент Animate позволяет проигрывать AVI-файлы, а также отображать стандартную анимацию, используемую в Windows. AVI-файлы, воспроизводимые компонентом Animate, имеют следующие ограничения:

• они не могут содержать звука;

• информация в них должна быть несжатой;

• размер файла не должен превышать 64 Кбайт.

Для определения воспроизводимого видеоклипа используются свойства FileName и CommonAVI, которые не могут использоваться одновременно. Проигрываемый AVI-файл, расположенный на диске, указывается с помощью свойства FileName, при этом свойству CommonAVI автоматически присваивается значение aviNone.

Свойство CommonAVI позволяет выбрать один из стандартных клипов Windows и принимает следующие значения:

• aviNone – стандартная анимация отсутствует;

• aviCopyFile – копирование файла;

• aviCopyFiles – копирование файлов;

• aviDeleteFile – удаление файла;

• aviEmptyRecycle – очистка Корзины;

• aviFindComputer – поиск компьютера;

• aviFindFile – поиск файла;

• aviFindFolder – поиск папки;

• aviRecycleFile – перемещение файла в Корзину.

При назначении свойству CommonAVI значения, отличного от aviNone, свойство FileName автоматически очищается, принимая в качестве значения пустую строку.

Для воспроизведения видеоклипа также можно использовать свойства ResHandle типа THandle и ResID типа Integer, которые составляют альтернативу свойствам CommonAVI и FileName. Значение свойства ResHandle содержит ссылку на модуль, содержащий изображение в виде ресурса, а значение свойства ResID в этом модуле содержит номер ресурса.

После выбора видеоклипа свойства FrameCount, FrameHeight и FrameWidth типа Integer определяют количество, высоту и ширину кадров (в пикселах) клипа соответственно. Эти свойства являются свойствами времени выполнения и, следовательно, доступны только для чтения.

По умолчанию размеры компонента Animate автоматически подстраиваются под размеры кадров видеоклипа, что определяется свойством AutoSize, имеющим значение True. Если этому свойству присвоить значение False, то отсечение части кадра изображения будет возможно, если его размеры превысят размеры компонента Animate.

Воспроизведение видеоклипа начинается при установке свойству Active значения True. Первый и последний кадры определяют диапазон воспроизведения и определяются значениями свойств StartFrame и StopFrame типа SmallInt соответственно. По умолчанию свойство StartFrame указывает на первый кадр анимации и его значение равно 1.

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

Для запуска и остановки воспроизведения клипов можно использовать методы Play, Stop и Reset. Процедура Play (FromFrame: Word, ToFrame: Word, Count: Integer) проигрывает видеоклип, начиная с кадра, заданного параметром FromFrame, и заканчивая кадром, заданным параметром ToFrame. Параметр Count определяет количество повторений. Таким образом, процедура Play позволяет одновременно управлять свойствами StartFrame, StopFrame и Repetitions, задавая для них требуемые при воспроизведении значения, а также устанавливает свойство Active в значение True.

Свойство Open типа Boolean доступно при выполнении программы и позволяет определить, готов ли компонент Animate к воспроизведению. Если выбор и загрузка видеоклипа выполнены успешно, то свойству Open автоматически устанавливается значение True (компонент можно открыть и воспроизвести анимацию). При неуспешной загрузке видеоклипа это свойство получает значение False. При необходимости программист может сам присваивать свойству Open значение False, тем самым отключая компонент Animate.

Процедура Stop прерывает воспроизведение видеоклипа и присваивает свойству Active значение False. Процедура Reset, кроме того, дополнительно сбрасывает свойства StartFrame и StopFrame, устанавливая им значения по умолчанию (первый и последний кадры воспроизводимой анимации).

В качестве примера, наглядно отражающего работу компонента Animate, будет рассмотрено приложение, позволяющее просматривать стандартную анимацию операционной системы Windows.

Стандартный видеоклип можно просмотреть, нажав кнопку Просмотр, предварительно выбрав анимацию с помощью группы независимых переключателей. Клип воспроизводится непрерывно с первого до последнего кадра до тех пор, пока не будет нажата кнопка Стоп. Вид окна приложения показан на рис. 5.2.

Рис. 5.2. Приложение для просмотра стандартной анимации

Рассмотрим исходный текст приложения подробно. Для работы программы необходим набор констант, значения которых может принимать свойство CommonAVI, поэтому в начале программы нужно объявить константный массив Typeof AVI типа TCommonAVI, который и будет содержать необходимые значения:

const TypeofAVI: array[0..8] of TCommonAVI =

(aviNone, aviCopyFile, aviCopyFiles,

aviDeleteFile, aviEmptyRecycle, aviFindComputer,

aviFindFile, aviFindFolder, aviRecycleFile);

При создании главного окна приложения определите положение переключателя в группе выбора стандартной анимации Windows:

procedure TFormViewAnim.FormCreate(Sender: TObject);

//Стандартная анимация “Копирование файла ”

Затем создайте обработчик выбора группы независимых переключателей. При выборе анимации первым делом устанавливается доступность кнопок управления. Далее задается вид воспроизводимого ролика (например Копирование файлов). В блоке if производится проверка индекса выбранной анимации и, если она не выбрана (индекс равен нулю), блокируется кнопка Просмотр, так как в этом случае просмотр стандартной анимации невозможен (листинг 5.5).

Листинг 5.5. Обработчик выбора анимационных роликов

//Выбор стандартной анимации

procedure TFormViewAnim.RadioGroupSelectAnimEffectsClick(Sender: TObject);

//Устанавливаем доступность кнопок управления

//Устанавливаем значение свойства CommonAVI

//Если анимация не выбрана, делаем недоступной кнопку старта показа

if RadioGroupSelectAnimEffects.ItemIndex = 0

then bnStartView.Enabled:= False

else bnStopView.Enabled:= True;

Значения индексов (RadioGroupSelectAnimEffects.ItemIndex) переключателей соответствуют порядковым номерам в массиве TypeofAVI, который содержит возможные значения свойства CommonAVI.

При нажатии кнопки начала показа производится вызов метода Play, компонента Animate и устанавливается доступность кнопок управления показом:

procedure TFormViewAnim.bnStartViewClick(Sender: TObject);

//Начинаем показ выбранной анимации

StandartAnimate.Play(1, StandartAnimate.FrameCount, 0);

Обработчик кнопки Стоп основан на вызове метода Stop компонента Animate и выглядит следующим образом:

procedure TFormViewAnim.bnStopViewClick(Sender: TObject);

//Остановка показа анимации

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

Компонент Animate обеспечивает воспроизведение только простых AVI-файлов. С этой же целью можно использовать компонент MediaPlayer, который, с функциональной точки зрения, значительно сложнее и обеспечивает больше мультимедийных возможностей.

Это произведение, предположительно, находится в статусе ‘public domain’. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.

Илон Маск рекомендует:  Что такое код invertrgn
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL