Hangállomány lejátszása

F.29. „Nyers”  hangállomány lejátszását, SB hangkártya segítségével megvalósító program kódja

uses crt,sb16mix,sb_aidma;

var    rs: word;

filehandle: file;

filename: string;

procedure Setmix; { A mixer regisztereinek beállítása. }

begin

SetMasterVolume($ff,$ff);   { Bemeneti eszközök hangereje maximumon. }

SetDSPVolume($ff,$ff);      { DSP hangereje max. }

InputSelect($00,$00);       { Minden bemenet letiltva. }

OutputSelect($00);          { Minden kimeneti eszköz letiltva. }

OutPutGain($40,$40);        { 4-szeres erősítés a kimeneten. }

BassLevel($88,$88);         { Mély beállítása. }

TrebleLevel($88,$88);       { Magas beállítása. }

SetPlaySampleRate(44100);   { Lejátszási mintavételi frekvencia. }

end;

BEGIN

clrscr;

if paramcount=0 then

begin

writeln;

writeln(‘Usage: PLAY <path>’);

delay(5000);

exit;

end;

filename:=paramstr(1);

assign(filehandle,filename);

reset(filehandle,1);  { Megnyitjuk a hangmintát tartalmazó fájlt. }

if IOResult<>0 then

begin

writeln(‘Error opening file!’);

delay(5000);

exit;

end;

if AllocDMAbuffer(16384)<0 then

begin

writeln(‘Failed to alloc DMA buffer.’);

halt;

end;

SetMix; { A mixer regisztereinek beállítása }

{SetSampleRate(44100); { Beállítjuk a mintavételi frekvenciát. }

InitInterrupt(nil);   { Beállítjuk a megszakításvezérlőt. }

SetDMAblockSize(8192);{ Beállítjuk a DSP blokkméretét. }

InitDMAcontroller(PlayMode);{ Inicializáljuk a DMA vezérlőt (PLAY).}

{ A teljes buffert feltöltjük. }

blockread(filehandle,DMAbuffer^,BufferSize,rs);

rs:=Halfsize;

writeln(‘Playing…’);

writeln(‘Press any key to stop’);

StartAutoInitDMAplay; { Elindítjuk a lejátszást. }

repeat

if RfshRequest then  { Ha a fél buffert lejátszotta… }

begin

RfshRequest:=false;  { RfshRequest= FALSE ! }

{ Beolvasunk egy újabb blokkot. }

blockread(filehandle,DMAptr^,HalfSize,rs);

{ Ha a fájl végére értünk, a fennmaradó részt törölni kell. }

if rs<>Halfsize then

fillchar(DMAptr^[rs],HalfSize-rs,$80);

write(‘*’);

NextBuffer;  {A következő félbufferre váltunk. }

end;

until (rs<>Halfsize) or keypressed;

while keypressed do

readkey;       { Kiürítjük a billentyűzet buffert. }

while not RfshRequest do

begin

{ Megvárjuk a félbuffer lejátszását. }

end;

close(filehandle);  { Lezárjuk a fájlt. }

writeln;

StopAutoInitDMA;    { Leállítjuk a DMA átvitelt. }

DoneDMAcontroller;  { Tiltjuk a DMA csatornát. }

DoneInterrupt;      { Visszaállítjuk a megszakítást. }

FreeDMAbuffer;      { Felszabadítjuk a DMA buffert. }

END.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s