Sound Blaster mixer

F.26. Pascal unit a Sound Blaster mixerének programoz i uukuk: ujjúására

unit sb16mix;ú

interface uses DSP;

const

{ Hardver alapbeállítások. }

Base : word = $220; { I/O báziscím. }

IRQnumber : byte = $05; { Megszakítási vonal. }

LowDMAch : byte = $01; { 8 bites DMA csatornaszám. }

HighDMAch : byte = $01; { 16 bites DMA csatornaszám. }

On = true; { Bekapcsolás (AGC). }

Off = false; { Kikapcsolás (AGC). }

{ Az analóg eszközöket definiáló konstansok (dmXXXX). }

dmMic = $01; { Mikrofon. }

dmCDright = $02; { Audio CD bal oldal. }

dmCDleft = $04; { Audio CD jobb oldal. }

dmLineLeft = $08; { Vonali bemenet bal oldal. }

dmLineRight = $10; { Vonali bemenet jobb oldal. }

dmMIDIleft = $20; { FM/MIDI bal oldal. }

dmMIDIright = $40; { FM/MIDI jobb oldal. }

dmOutputAll = $1F; { Minden kierősített eszköz. }

dmInputAll = $7F; { Minden bemeneti eszköz. }

dmCD = $06; { Audio CD mindkét oldal. }

dmLine = $18; { Vonali bemenet mindkét oldal. }

dmMIDI = $60; { FM/MIDI mindkét oldal. }

dmLeftAll = $55; { Minden bal oldali eszköz. }

dmRightAll = $2A; { Minden jobb oldali eszköz. }

Gain_1x = $00; { Normál, egyszeres erősítés. }

Gain_2x = $40; { Kétszeres erősítés. }

Gain_4x = $80; { Négyszeres erősítés. }

Gain_8x = $C0; { Nyolcszoros erősítés. }

{ A megszakítási vonalat definiáló állandók (imXXXX). }

imIRQ10 = $08; { IRQ 10, INT $72. }

imIRQ7 = $04; { IRQ 7, INT $0F. }

imIRQ5 = $02; { IRQ 5, INT $0D. }

imIRQ2 = $01; { IRQ 2, INT $0A. }

{ A DMA csatornákat definiáló állandók (dcXXXX). }

dcDMA0 = $01; { DMA 0 }

dcDMA1 = $02; { DMA 1 }

dcDMA3 = $08; { DMA 3 }

dcDMA5 = $20; { DMA 5 }

dcDMA6 = $40; { DMA 6 }

dcDMA7 = $80; { DMA 7 }

dcDMAlow = $00; { Low }

{ DSP definíciók (dspXXXX). }

{ T-mode bájt }

dspMode8bit = $C2; { 8 bites átvitel. }

dspMode16bit = $B2; { 16 bites átvitel. }

dspRecord = $08; { Felvétel. }

dspPlay = $00; { Lejátszás. }

dspAutoInit = $04; { Auto-init típusú DMA. }

dspSingleCycle = $00; { Single-cycle típusú DMA. }

{ M/S-mode bájt }

dspStereo = $20; { Sztereó üzemmód. }

dspMono = $00; { Mono üzemmód. }

dspSigned = $10; { Előjeles adatok. }

dspUnsigned = $00; { Előjel nélküli adatok. }

{ ******** Alacsonyszintű rutinok ******** }

procedure ResetMixer; { Mixer inicializálása. }

procedure SetMixer(RegNum,Value:byte); { Mixer regiszterének írása. }

function GetMixer(Regnum:byte):byte; { Mixer regiszterének olvasása. }

{ ****** Hangerő-szabályzó eljárások ****** }

procedure SetMasterVolume(Left,Right:byte); { Kimeneti hangerő állítása.}

procedure SetDSPVolume(Left,Right:byte); { DSP hangerő állítása. }

procedure SetMIDIVolume(Left,Right:byte); { MIDI/FM hangerő állítása. }

procedure SetCDVolume(Left,Right:byte); { Audio-CD hangerő állítása. }

procedure SetLineVolume(Left,Right:byte); { Vonali hangerő állítása. }

procedure SetMicVolume(Volume:byte); { Mikrofon hangerő állítása. }

procedure SetSpeakerVolume(Volume:byte); { Speaker hangerő állítása. }

{ *********** Egyéb beállítások *********** }

{ Kimeneten erősített eszközök kiválasztása. }

procedure OutputSelect(mask:byte);

{ Bemeneti eszközök kiválasztása. }

procedure InputSelect(leftmask,rightmask:byte);

{ Bemeneti erősítés beállítása. }

procedure InputGain(LeftGain,RightGain:byte);

{ Kimeneti erősítés beállítása. }

procedure OutputGain(LeftGain,RightGain:byte);

{ Mikrofon FGC/AGC erősítési mód beállítása. }

procedure MicAGC(state:boolean);

{ Magas szint beállítása. }

procedure TrebleLevel(Left,Right:byte);

{ Mély szint beállítása. }

procedure BassLevel(Left,Right:byte);

{ Megszakítást kérő vonal kiválasztása. }

procedure IRQselect(mask:byte);

{ Aktív DMA csatorna kiválasztása. }

procedure DMAselect(HighDMA,LowDMA:byte);

{ Lejátszási mintavételi frekvencia beállítása. }

procedure SetPlaySampleRate(SR:word);

{ Felvételi mintavételi frekvencia beállítása. }

procedure SetRecordSampleRate(SR:word);

{ DMA ciklusos DSP átvitel elkezdése. }

procedure StartDSPtransfer(Tmode,MSmode:byte; Size:word);

implementation

procedure SetMixer(RegNum,Value:byte); assembler;

asm

mov dx,Base

add dx,$0004

mov al,RegNum

out dx,al

inc dx

mov al,Value

out dx,al

end;

function GetMixer(Regnum:byte):byte; assembler;

asm

mov dx,Base

add dx,$0004

mov al,Regnum

out dx,al

inc dx

in al,dx

end;

procedure ResetMixer;

begin

SetMixer($00,$00);

end;

procedure SetMasterVolume(Left,Right:byte);

begin

SetMixer($30,Left);

SetMixer($31,Right);

end;

procedure SetDSPVolume(Left,Right:byte);

begin

SetMixer($32,Left);

SetMixer($33,Right);

end;

procedure SetMIDIVolume(Left,Right:byte);

begin

SetMixer($34,Left);

SetMixer($35,Right);

end;

procedure SetCDVolume(Left,Right:byte);

begin

SetMixer($36,Left);

SetMixer($37,Right);

end;

procedure SetLineVolume(Left,Right:byte);

begin

SetMixer($38,Left);

SetMixer($39,Right);

end;

procedure SetMicVolume(Volume:byte);

begin

SetMixer($3A,Volume);

end;

procedure SetSpeakerVolume(Volume:byte);

begin

SetMixer($3B,Volume);

end;

procedure OutputSelect(Mask:byte);

begin

SetMixer($3C,Mask and $1F);

end;

procedure InputSelect(LeftMask,RightMask:byte);

begin

SetMixer($3D,LeftMask and $7F);

SetMixer($3E,RightMask and $7F);

end;

procedure InputGain(LeftGain,RightGain:byte);

begin

SetMixer($3F,LeftGain and $C0);

SetMixer($40,RightGain and $C0);

end;

procedure OutputGain(LeftGain,RightGain:byte);

begin

SetMixer($41,LeftGain and $C0);

SetMixer($42,RightGain and $C0);

end;

procedure MicAGC(State:boolean);

begin

SetMixer($43,byte(State) and 1);

end;

procedure TrebleLevel(Left,Right:byte);

begin

SetMixer($44,Left);

SetMixer($45,Right);

end;

procedure BassLevel(Left,Right:byte);

begin

SetMixer($46,Left);

SetMixer($47,Right);

end;

procedure IRQselect(Mask:byte);

begin

SetMixer($80,Mask);

case Mask of

imIRQ10 : IRQnumber:=10;

imIRQ7 : IRQnumber:=7;

imIRQ5 : IRQnumber:=5;

imIRQ2 : IRQnumber:=2;

end;

end;

procedure DMAselect(HighDMA,LowDMA:byte);

begin

SetMixer($81,(HighDMA shl 4)or(LowDMA and 15));

LowDMAch:=LowDMA and 15;

HighDMAch:=HighDMA and 15;

end;

procedure SetPlaySampleRate(SR:word);

begin

DSPwrite($41);

DSPwrite(hi(SR));

DSPwrite(lo(SR));

end;

procedure SetRecordSampleRate(SR:word);

begin

DSPwrite($42);

DSPwrite(hi(SR));

DSPwrite(lo(SR));

end;

procedure StartDSPtransfer(Tmode,MSmode:byte; Size:word);

begin

DSPwrite(Tmode);

DSPwrite(MSmode);

DSPwrite(lo(Size));

DSPwrite(hi(Size));

end;

BEGIN

{ Esetleges inicializálás. }

ResetMixer;

IRQselect(imIRQ5);

DMAselect(dcDMA5,dcDMA1);

OutputSelect(dmOutputAll);

InputSelect(dmLeftAll,dmRightAll);

InputGain(Gain_1x,Gain_1x);

OutputGain(Gain_1x,Gain_1x);

MicAGC(On);

END. of unit

Alábbi forrás alapján:

[4] László József: Hangkártya programozása Pascal és Assembly nyelven, Computer Books, Budapest, 1999

Reklámok

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

Please log in using one of these methods to post your comment:

WordPress.com Logo

Hozzászólhat a WordPress.com 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 )

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 )

Kapcsolódás: %s