Sound Blaster mixer

F.26. Pascal unit a Sound Blaster mixerének programozá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

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