Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Звук через системный динамик


Автор: andrey_post 24.3.2004, 06:38
Пытаюсь вывести звук через динамик, написал процедуру:

Код

procedure TForm1.Sound(Frequency, Duration: Integer);
asm
cmp  Win32Platform, VER_PLATFORM_WIN32_NT
jne  @@9X
push  edx
push  eax
call  Windows.Beep
ret
@@9X:
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
@@2:
pop  ebx
end;

Вызывается так:
Код

Sound(13,10);

Но звук не слышу... может подскажете в чем дело?

Автор: Петрович 24.3.2004, 08:22
Под XP такое работать не будет.

Автор: andrey_post 24.3.2004, 10:05
Я прогу врубаю в Win2000 и Win98. не там и там не робит. mad.gif

Автор: PILOT 24.3.2004, 10:16
Кинь мыло (в личные сообщения) я тебе вышлю описания всех портов компьютера.
А если хочешь расскажу принцип воспроизведения на динимаке музыки.

СУВ.
Добавлено @ 10:18
Да и кстати, если задаешь большее время процедура выполняется дольше?

Автор: Proximo_RZN 24.3.2004, 11:50
Sound(13,10);
Frequency = 13 - не маленькая ли частота что-бы что-то слышать?

Поменяй 13 на что-то большее и все запашет!
Проверено на Sound(130, 10) Delphi 5 + Win2k

Автор: andrey_post 24.3.2004, 12:55
PILOTIK, вот мыло apost@kazna.ru
Добавлено @ 12:59
Поменял, 30 на 130 все равно не хочет...
чувствую в другом проблема... bored.gif

Автор: Proximo_RZN 25.3.2004, 09:32
Ого! Знаешь какая интересная штука получилась:
функция описана как procedure TForm1.Sound(Frequency, Duration: Integer);
Т.е. она член класса TForm.

Но!!! Если функцию описать как procedure Sound(Frequency, Duration: Integer); и не заставлять ее быть методом класса TForm, то все работает!!! ПРОВЕРИЛ САМ ТОЛЬКО-ЧТО!

Точно не знаю, но видимо когда передаются параметры методу класса, то они передаются как-то по странному. Вот РАБОЧИЙ код:

Цитата

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

// твоя функция, но не член класса TForm1
procedure Sound(Frequency, Duration: Integer);
asm
cmp  Win32Platform, VER_PLATFORM_WIN32_NT
jne  @@9X
push  edx
push  eax
call  Windows.Beep
ret
@@9X:
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
@@2:
pop  ebx
end;

{$R *.DFM}

// нажимаешь на кнопку - слышишь звук
procedure TForm1.Button1Click(Sender: TObject);
begin
  Sound (130, 100);
end;

end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)