ورود

View Full Version : گذاشتن صدای speker در بلنگو بایوس



yashar666
شنبه 11 فروردین 1386, 20:05 عصر
آیا راهی است برای قرار دادن صدای که از کارت صدا می آید به buzeer بایوس

hr110
شنبه 11 فروردین 1386, 22:04 عصر
اسپیکر PC ذاتاً ضعیف است و نمیتوان هر صدایی که مورد نظر شما است را از آن انتظار داشت ولی توابعی وجود دارد که میتوانید برخی از ملودیها را تولید کرد.

yashar666
شنبه 11 فروردین 1386, 22:58 عصر
می دونم که نمی تونه همه صدا ها رو بخش کنه اون هم بخاطر ذاتی ضعیف بودنش نیست علت دیگه ای داره( اگه کسی خواست بدونه براش ایمیل می کنم ) ولی من همون توابع رو می خوام اگه می شه که ارتباط بین کارت صدا و buzeer باشه

ghabil
یک شنبه 12 فروردین 1386, 02:02 صبح
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(aFreq, aDelay: Integer) ;

procedure DoSound(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 Delay(MSecs: Integer) ;
var
FirstTickCount: LongInt;
begin
FirstTickCount := GetTickCount;
repeat
Sleep(1) ;
//or use Application.ProcessMessages instead of Sleep
until ((GetTickCount - FirstTickCount) >= Longint(MSecs)) ;
end;

begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
Windows.Beep(aFreq, aDelay) ;
end
else
begin
DoSound(aFreq) ;
Delay(aDelay) ;
end;
end;

procedure NoSound;
var
Value: Word;
begin
if not (Win32Platform = VER_PLATFORM_WIN32_NT) then
begin
Value := GetPort($61) and $FC;
SetPort($61, Value) ;
end;
end;


// Example:

procedure TForm1.Button1Click(Sender: TObject) ;
begin
Sound(500, 1000) ;
Sound(700, 1000) ;
Sound(900, 1000) ;
NoSound;
end;


منبع (http://delphi.about.com/cs/adptips2003/a/bltip0303_3.htm)

Inprise
یک شنبه 12 فروردین 1386, 04:49 صبح
کد فوق روی NT همان Beep است . علتش هم عدم امکان دسترسی مستقیم به سخت افزار در حالت Protected Mode است .

آپدیت :

چون این جواب را قبلا نوشته بودم به این سوالت و سوال قبلی ات که تکرار همین بود جوابی ندادم اما حالا که جستجو کردم پیدا نشد پس دوباره :

برای صحبت کردن با بلندگوی MotherBoard باید شماره پورت و IRQی مناسب استفاده کنی ، که وقتی از ویندوزهای مبتنی بر NT که در وضعیت Protected Mode کار میکنند استفاده میکنی ، دسترسی به اونها در حالت UserMode امکان پذیر نیست . پس نه دلفی و نه ویژوال بیسیک با کدهای معمول نمیتوانند چنین صوتی تولید کنند ، مگر با استفاده از یک کتابخانه جانبی که تغییر Context را خودش انجام دهد . ساده ترین مثال DDK ، یک Beeper ساده هست که اگر کسی واقعا نیاز داشته باشد میتواند همان را کامپایل و استفاده کند . روی خانوادهء NT برای بصورت خودکار از کارت صوتی و طبیعتا اسپیکرهای External استفاده میشود .

برای اینکه نتیجهء فراخوانی Privileged Instruction ها در فضای Usermode را ببینید در کد فوق شرط if Win32Platform = VER_PLATFORM_WIN32_NT then را حذف کنید و نتیجه را ببینید