Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Работа с ситемным динамиком   Найти похожие ветки 

 
Babay ©   (2005-02-14 07:55) [0]

Подскажите как реализовать работу с системным динамиком под Windows NT/XP. Т.е. нужно что -то вроде процедур Sound, NoSound в TurboPascal-е. Нашел пару примеров (сделано через ассемблер),но они все работают только в 95/98/Me. Подскажите где копать то? а мож у кого пример есть?


 
WondeRu ©   (2005-02-14 09:13) [1]

на асме, но в ХР работает)

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;


 
Babay ©   (2005-02-14 10:24) [2]

Спасибо действительно работает.
Но мне всетаки надо как ТР, что бы включался по одной команде, а выключался по другой. К сожалению несилен в асме, подскажите можно ли эту процедуру как то разбить на две. Если можно то как?


 
WondeRu ©   (2005-02-14 11:03) [3]

Babay ©   (14.02.05 10:24) [2]
разве что отдельный поток создавать... а асм знать не нада, в этой функции если у тя ВинХР, то будет выполняться стандартная функция Windows.Beep


 
Babay ©   (2005-02-14 11:11) [4]

> то будет выполняться стандартная функция Windows.Beep

вот это как раз и неустраивает. Нашел вот такой пример, в описании говорится что вроде как версия винды проверяется. На самом деле не пашет. Может можно как то заставить?

procedure SetPort(address, Value:Word);
var
 bValue: byte;
begin
 bValue := trunc(Value and 255);
 asm
   mov dx, address
   mov al, bValue
   out dx, al
 end;
end;

function GetPort(address:word):word;
var
 bValue: byte;
begin
 asm
   mov dx, address
   in al, dx   // <- здесь дает ошибку говорит нет привелегий
   mov bValue, al
 end;
 GetPort := bValue;
end;

procedure Sound(Freq : Word);
var
 B : Byte;
begin
 if Freq > 18 then
 begin
   Freq := Word(1193181 div LongInt(Freq));
   B := Byte(GetPort($61));
   if (B and 3) = 0 then
   begin
     SetPort($61, Word(B or 3));
     SetPort($43, $B6);
   end;
   SetPort($42, Freq);
   SetPort($42, Freq shr 8);
 end;
end;

procedure NoSound;
var
 Value: Word;
begin
 Value := GetPort($61) and $FC;
 SetPort($61, Value);
end;


 
Babay ©   (2005-02-14 11:18) [5]

>разве что отдельный поток создавать...

а поподробнее можно. В смысле как с потоками работать я в курсе. А чего туда засунуть? постоянный повтор бипа? так это будет не то.


 
WondeRu ©   (2005-02-14 13:30) [6]

Babay ©   (14.02.05 11:11) [4]
в описании говорится что вроде как версия винды проверяется.


где там проверяется? мура это!!!!

если хочешь в точности сделать такой же код, то используй GiveIO.sys

Google  в помощь!


 
grom   (2005-02-14 19:23) [7]

>отдельный поток
Будильник v 1.2
http://i-s-v.org.ua/



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
1-1110998105
Alex Romanskiy
2005-03-16 21:35
2005.03.27
GIF в Image


3-1109681857
Arazel
2005-03-01 15:57
2005.03.27
Есть ли аналог поле счетчика в MSSQL Srv


11-1093868976
ecm
2004-08-30 16:29
2005.03.27
xHelpGen ?


3-1109330164
Inoemy
2005-02-25 14:16
2005.03.27
Как взять значение DataSet по заданному номеру строки грида?


14-1110135243
Vasya.ru
2005-03-06 21:54
2005.03.27
Сегодня веселая книжка по информатике в руки попалась