[Back to SOUND SWAG index] [Back to Main SWAG index] [Original]
{
As I promised, here is the other reply that I am sending you containing the
information on Programming the SB via CT-VOICE.DRV.
Before I begin, This message may be a little long, so if for any reason, you
loose the end of it or sumthin', let me know, and I'll repost it split up
into sections, but right now I'll just make one long message.
O.K. Here we go...
The information supplied will concern playback and recording of digital
samples on the SB's digital channel(s) using the driver supplied by
Creative Labs, CT-VOICE.DRV.
There should be a lot of information available on BBS's if you look for it
and want to follow up anything, but for the meaan time, this information
is taken from a book called "The Sound Blaster Book" by Axel Stolz,
published by Abacus ISBN 1-55755-164-2.
Let me first correct myself about the comment that the driver is executed
as an interrupt... Similar, but not quite... You don't actually make and
interrupt call (i.e: INT n), but rather make the actual call to the address
that the driver was loaded into (i.e: CALL n).
The first thing you need to do is load the driver into memory. Note, the
segment may be anywhere (you store the pointer as a reference), but the
offset MUST be zero. The loading is done as follows...
1.) Allocate memory and get pointer to the block.
2.) Load the driver from disk into the allocated space.
Note: I am not going into much detail regarding error checking, but you
should do checking on things such as allocation being ok and not NULL, and
see whether the file exists on the disk, and whether or not it is a valid
driver (this can be done by checking to see that the letters "CT" are
contained in bytes 3 and 4).
The code is as follows (in Pascal):
(Please forgive any minor discrepencies, as I am not a Pascal programmer,
but a C programmer, and I'm only trying to extract those sections that seem
inportant, so I may not know which functions are Pascal's and which are
user defined, but you should get the general idea. )
}
VAR
F : File;
PtrToDrv : Pointer;
BEGIN
Assign( F, 'CT-VOICE.DRV' );
Reset( F, 1 );
AllocateMem( PtrToDrv, FileSize(F) );
Blockread( F, PtrToDrv^, FileSize(F) );
Close( F );
END;
{
NOTE: The varible PtrToDrv should be global, as you will be needing it to
reference the memory at a later stage.
Now that you have the driver loaded, you can start to make function calls
to it. This is done by setting the register BX to the number of the
function that you want to execute, and various other memory registers to
the parameters, and then calling the address stored in the "PtrToDrv"
varible. Return values are usually stored in the register AX.
EXAMPLE: Function 6: Play a sample:
-------- Input registers: BX = Function number
ES:DI = Pointer to sample
Return registers: None.
}
PROCEDURE PlaySample( BufferAddr : Pointer );
VAR
VSeg, VOfs : WORD;
BEGIN
VSeg := Seg( BufferAddr^ );
VOfs := Ofs( BufferAddr^ );
ASM
MOV BX, 6
MOV ES, VSeg
MOV Di, VOfs
CALL PtrToDrv
END;
END;
{
The following are a list of all the function available from the CT-VOICE.DRV
driver. Note, you will call them by setting BX = function number, setting
the other registers, and then executing "CALL PtrToDrv":
----------------------------------------------------------------------------
#: Description: Parameters:
-- ------------------------- -------------------------------------------
0 Determain driver version AH=Main number (on return)
AL=Sub number (on return)
1 Set port address AX=Port address
2 Set interrupt AX=Interrupt number
3 Initialize driver AX=0 Successfull (on return)
AX=1 SB not found (on return)
AX=2 Port address error (on return)
AX=3 Interrupt error (on return)
4 Loudspeaker on/off AL=0 off
AL=1 on
5 Set "StatusWord" address ES:DI=Status address
(The WORD varible at this address will store
the status of the playback so that you can
monitor the playback of the sample.)
6 Sample playback ES:DI=Sample address
7 Record sample AX=Sampling rate
DX:CX=Length
ES:DI=Sample address
8 Abort sample none
9 De-Install driver none
10 Pause Sample AX=0 Successfull (on return)
AX=1 Not successfull (on return)
11 Continue sample AX=0 Successfull (on return)
AX=1 Not successfull (on return)
12 Interrupt loop AX=0 At end of loop
AX=1 Immediately
AX=0 Successfull (on return)
AX=1 No loop being executed
13 User defined driver function DX:AX=Function address
ES:BX=Address of the current data block
}
[Back to SOUND SWAG index] [Back to Main SWAG index] [Original]