Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с ситемным динамиком [D7, Win2k, WinXP]


Babay ©   (2005-02-14 07:55:00) 

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


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

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


WondeRu   (2005-02-14 13:30:00) [2]

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


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

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

Google  в помощь!


Babay   (2005-02-14 11:18:00) [3]

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

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


Babay   (2005-02-14 11:11:00) [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;


WondeRu   (2005-02-14 11:03:00) [5]

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


Babay   (2005-02-14 10:24:00) [6]

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


WondeRu   (2005-02-14 09:13:00) [7]

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

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо