Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа системного динамика, Помогите, не могу заставить пищать систе 
:(
    Опции темы
Albinos_x
Дата 27.5.2004, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 3
Всего: 108



Помогите, не могу заставить пищать системный динамик!

Привожу код

Код
unit Unit1;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls, Spin, ExtCtrls,unit2;
type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    SpeedButton2: TSpeedButton;
    procedure SpeedButton1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject); 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}

procedure TForm1.SpeedButton1Click(Sender: TObject);
var fr:word;
begin
Timer1.Interval:=SpinEdit2.Value;
fr:=SpinEdit1.Value;
sound1(fr);
Timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
nsound1;
Timer1.Enabled:=false;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
var HToken:THandle;
    Luid:TLargeInteger;
    Tkp:TTokenPrivileges;
    ReturnLength:Cardinal;
begin
if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,HToken) THEN
   begin
   LookupPrivilegeValue(nil,'SeShutdownPrivilege',Luid);
   Tkp.Privileges[0].Luid:=Luid;
   Tkp.PrivilegeCount:=1;
   Tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
   if AdjustTokenPrivileges(HToken,false,Tkp,0,nil,ReturnLength) then
      begin
      MessageDlg('Получены привилегии',mtInformation,[mbOk],0);
      end
      else
      MessageDlg('Привилегии не получены',mtInformation,[mbOk],0);
   end
   else
   MessageDlg('Получение привилегий не возможно',mtInformation,[mbOk],0);
end;
end.

unit Unit2;

interface

    procedure sound1(var f:word);
    procedure nsound1;
    
implementation

function getport1(addres:word):word;
var b:byte;
begin
 asm
  mov dx,addres
  in al,dx
  mov b,al
  end;
  getport1:=b;
end;

function setport1(addres,v:word):word;
var b:byte;
begin
b:=trunc(v and 255);
 asm
  mov dx,addres
  mov al,b
  out dx,al
  end;
end;

procedure sound1(var f:word);
var z,sss:byte;
begin
if f>18 then
   begin
   f:=word(1193181 div longint(f));
   z:=getport1($61);
   if (z and 3)=0 then
      begin
      setport1($61,z);
      setport1($43,$b6);
      end;
   setport1($42,f);
   setport1($42,f shr 8);
   end;
end;

procedure nsound1;
var v:word;
begin
v:=getport1($61) and $fc;
  setport1($61,v)
end;

end.


Если кто знает напишите в чём ошибка, и если возможно то под ХР тоже.

Это сообщение отредактировал(а) p0s0l - 29.9.2005, 11:24


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
p0s0l
Дата 27.5.2004, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Есть функция Beep, но под 9x она издает монотонный звук, т.е. частота не меняется...
Вот универсальный код:
Код

Procedure  BeepEx(Freq:  Word;  Duration:  Integer);
 var  
     Ver:  TOsVersionInfo;
 begin
     Ver.dwOSVersionInfoSize  :=  SizeOf(Ver);
     GetVersionEx(Ver);
     if  Ver.dwPlatformId  =  VER_PLATFORM_WIN32_NT  then  
         Windows.Beep(Freq,  Duration)  
     else  begin
         asm
             movzx  ecx,  Freq
             mov  eax,  1193180            //  тактовая  частота
             sub  edx,  edx
             div  ecx                              //  преобразование  частоты  в  делитель
             mov  ecx,  eax
             mov  al,0b6H
             out  43H,al                        //  управляющие  слово
             mov  al,cl
             out  42h,al                        //  младший  байт  делителя
             mov  al,ch
             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                        //  выключить  звук  по  окончанию  Duration
         end;
     end;
 end;




--------------------
С уважением, г-н Посол.
PM   Вверх
Albinos_x
Дата 27.5.2004, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 3
Всего: 108



Спасибо за ответ, но
функция Beep, согласно описания, не заставит пищать системный динамик если установлена звуковая карта (я проверял).
Мне нужно, чтобы он пищал независимо от этого, длительностью и частотой заданной пользователем.
К тому же Beep( Freg, Duration) почему-то, у меня отказываеся компилироваться!!! exclamation.gif

Это сообщение отредактировал(а) Albinos_x - 28.5.2004, 00:04


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
p0s0l
Дата 28.5.2004, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Ну, у меня XP, звуковая есть - и всё пищит нормально...
И компилируется нормально - прямо отсюда вставил в проект...
Какая ошибка выдаётся ?

И надо писать не Beep(Freq, Duration), а Windows.Beep(Freq, Duration), т.к. процедура Beep есть и в Windows.pas, и в SysUtils.pas...

Пример вызова приведенной выше функции:
BeepEx(555, 100);



--------------------
С уважением, г-н Посол.
PM   Вверх
Albinos_x
Дата 28.5.2004, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 3
Всего: 108



exclamation.gif Спасибо!!! exclamation.gif
Теперь всё работает.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.