![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с системным динамиком)
La_Grange © (2005-12-14 19:39:00)В virtual pascal имеется внешняя процедура beep(freq,duration)
Очень нужен исходный код этой процедуры для vp.
Вообще мне просто надо разбить эту процедуру на 2: включение системного динамика и выключение.
Есть идеи?
Заранее благодарен.
La_Grange (2005-12-20 23:10:00) [1]Делаю для себя=)
А идти вроде должна под любой XP, мне других пока не надо))
Германн (2005-12-20 02:02:00) [2]
> Se (17.12.05 09:35) [7]
>
> А какой у тебя Windows?
> <Цитата>
> La_Grange (18.12.05 21:21) [8]
>
> Windows XP Corporate Edition SP2 RUS
>
А программу ты делаешь под себя? И под свою ОС?
La_Grange (2005-12-20 01:49:00) [3]Всем спасибо
Вроде сам разобрался
Просто вызываю через thread Windows.beep, а в нужный момент - прерываю=))
DC-AC (2005-12-19 09:14:00) [4]Под NT-системы нужно использовать драйвер прямого доступа к портам. Например DLPortIO. Ниже небольшая процедура извлечения довольно мелодичного звука.
procedure Sound;
var bTemp: Byte; Count: Integer;
begin
bTemp := DLPortIO.Port[$61];
DLPortIO.Port[$43] := 182;
for Count:=1 to 10 do
begin
DLPortIO.Port[$42] := $30; // set frequency
DLPortIO.Port[$42] := $4; // set frequency
DLPortIO.Port[$61] := bTemp or 3;
Sleep(50);
Application.ProcessMessages;
DLPortIO.Port[$42] := $30; // set frequency
DLPortIO.Port[$42] := $3; // set frequency
DLPortIO.Port[$61] := bTemp or 3;
Sleep(50);
Application.ProcessMessages;
end;
DLPortIO.Port[$61] := bTemp;
end;
Anatoly Podgoretsky (2005-12-18 21:27:00) [5]А какой код? Данный огрызок слишком маленькийю
La_Grange (2005-12-18 21:21:00) [6]Windows XP Corporate Edition SP2 RUS
Se (2005-12-17 09:35:00) [7]А какой у тебя Windows?
La_Grange (2005-12-16 16:26:00) [8]он падает на строчке:
out 43H, al
Пишет:
XCPT_PRIVILEGED_INSTRUCTION
(C0000096) at 00401005, TID = 0E40
Что с этим делать?
Se (2005-12-15 20:56:00) [9]procedure Sound(Frequency:word; Duration: Integer);
begin
if Win32Platform=VER_PLATFORM_WIN32_NT then begin
Windows.Beep(Frequency, Duration);
end
else begin
asm
mov al, 0b6H
out 43H, al
mov ax,Frequency
out 42h,al
ror ax,8
out 42h,al
in al, 61H
or al, 03H
out 61H, al
end;
sleep(Duration);
asm
in al, 61H
and al, 0fcH
out 61H, al
end;
end;
end;
procedure Delay(Duration: Integer);
begin
Windows.Sleep(Duration);
end;
La_Grange (2005-12-15 19:51:00) [10]Эмм, извините, Win32.
Если на 2 разбить никак, то может можно ее как-нибудь научиться прерывать?
PVOzerski (2005-12-15 15:17:00) [11]Ты ж даже платформу не указал. VP был под OS/2, под Win32 и под Linux. И исходники RTL в VP открыты. Beep реализован через SysBeep, а SysBeep - по-разному: в Win32 - через Win32-API-шный MessageBeep, в OS/2 - через PM_Alarm, в Linux - никак.
TUser (2005-12-15 12:18:00) [12]Это апи-функция. Соотв. в Delphi ты ее можешь использовать точно так же. Разбить на 2 нельзя, но можно сделать так, что пищать будет долго.
umbra (2005-12-15 11:46:00) [13]а разве он не включен постоянно во время работы компьютера?