Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.056 c
1-1110915877
AlexLines
2005-03-15 22:44
2005.03.27
Вопрос по интернационализации


3-1109041953
Киря
2005-02-22 06:12
2005.03.27
Проблема с отображением кириллицы


3-1109090017
fess
2005-02-22 19:33
2005.03.27
Импорт записей ADO


3-1109233636
Death.
2005-02-24 11:27
2005.03.27
Как отредактировать данные БД


1-1110777184
LEXX_55
2005-03-14 08:13
2005.03.27
Трей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский