home *** CD-ROM | disk | FTP | other *** search
- //
- //===========================================================================
- //
- // C-interface for SoundSystem3
- //
- // Written for Borland C 3.1 & Tasm 3.1
- //
- // (pd)1995 by the Frontman of Crew242
- //
- //
- // .model MEDIUM
- //
- //===========================================================================
- //
-
- /***************************************************************************
-
- Player definitions
-
- ***************************************************************************/
-
- #include <dos.h>
-
- extern void far MAIN0(void); // auto-detection
- extern void far MAIN1(void);
- extern void far MAIN2(void);
- extern void far MAIN3(void);
- extern void far MAIN4(void);
- int near call_function(int player,int func,int param_ax,int param_bx,int param_cx,int param_dx,int param_ds,int *handle,int *param);
- typedef struct pblock
- { int baseport;
- char dma_number;
- char irq_number;
- unsigned int samplerate;
- char intern_type;
- char irq_type;
- char start_pos;
- char loop_pos;
- char song_mod;
- unsigned char master_vol;
- unsigned char music_vol;
- unsigned char fx_vol;
- };
-
- /***************************************************************************
-
- Player functions
-
- ***************************************************************************/
-
- int autodetect(struct pblock *paramblock)
- { int handle, param;
- call_function(0,0,0,FP_OFF(paramblock),0,0,FP_SEG(paramblock),&handle,¶m);
- return handle;
- }
-
- int config_init(int player, int code, struct pblock *paramblock)
- { int c, handle, param;
- c= call_function(player,1,0,FP_OFF(paramblock),code,0,FP_SEG(paramblock),&handle,¶m);
- return c;
- }
-
- int load_mod(int player, char *filename)
- { int c, handle, param;
- c= call_function(player,2,0,0,0,FP_OFF(filename),FP_SEG(filename),&handle,¶m);
- return c;
- }
-
- int play_music(int player)
- { int c, handle, param;
- c= call_function(player,3,0,0,0,0,0,&handle,¶m);
- return c;
- }
-
- int stop_music(int player)
- { int c, handle, param;
- c= call_function(player,4,0,0,0,0,0,&handle,¶m);
- return c;
- }
-
- int end_music(int player)
- { int c, handle, param;
- c= call_function(player,5,0,0,0,0,0,&handle,¶m);
- return c;
- }
-
- int load_sample(int player, char *filename, int amiga_pc, int *handle)
- { int c, param;
- c= call_function(player,6,0,0,amiga_pc & 0x80,FP_OFF(filename),FP_SEG(filename),handle,¶m);
- return c;
- }
-
- int play_sample(int player, int handle, int freq_in_hz, int panning)
- { int c, param;
- c= call_function(player,7,panning & 255,handle,freq_in_hz,0,0,&handle,¶m);
- return c;
- }
-
- int end_sample(int player)
- { int c, handle, param;
- c= call_function(player,8,0,0,0,0,0,&handle,¶m);
- return c;
- }
-
- int set_samplerate(int player, int freq_in_hz)
- { int c, handle, param;
- c= call_function(player,9,freq_in_hz,0,0,0,0,&handle,¶m);
- return c;
- }
-
- int get_volume(int player, int *master_vol, int *music_vol, int *fx_vol)
- { int c, handle, param;
- c= call_function(player,10,0,0,0,0,0,&handle,¶m);
- *master_vol= handle & 255;
- *music_vol= param & 255;
- *fx_vol= param >> 8;
- return c;
- }
-
- int set_volume(int player, int master_vol, int music_vol, int fx_vol)
- { int c, handle, param;
- c= call_function(player,11,master_vol & 255,(fx_vol << 8)+(music_vol & 255),0,0,0,&handle,¶m);
- return c;
- }
-
- int set_songloop(int player, int loop_position)
- { int c, handle, param;
- c= call_function(player,12,loop_position & 255,0,0,0,0,&handle,¶m);
- return c;
- }
-
- int get_songposition(int player, int *song_position)
- { int c, handle, param;
- c= call_function(player,13,0,0,0,0,0,&handle,¶m);
- *song_position= handle & 127;
- return c;
- }
-
- int set_songposition(int player, int song_position)
- { int c, handle, param;
- c= call_function(player,14,song_position & 127,0,0,0,0,&handle,¶m);
- return c;
- }
-
- int get_songmod(int player, int *song_modus)
- { int c, handle, param;
- c= call_function(player,15,0,0,0,0,0,&handle,¶m);
- *song_modus= handle & 3;
- return c;
- }
-
- int set_songmod(int player, int song_modus)
- { int c, handle, param;
- c= call_function(player,16,song_modus & 3,0,0,0,0,&handle,¶m);
- return c;
- }
-
- /***************************************************************************
-
- Player interface subroutines
-
- ***************************************************************************/
-
- int near call_function(int player,int func,int param_ax,int param_bx,int param_cx,int param_dx,int param_ds,int *handle,int *param)
- { int c,ra,rb,rc;
- switch(player){
- case 0:
- {asm{ pusha /* VERY IMPORTANT, BECAUSE C USES */
- mov ax,param_ax /* SI AND DI AS TEMP VAR */
- mov bx,param_bx
- mov cx,param_cx
- mov dx,param_dx
- mov es,param_ds
- mov di,func};
- MAIN0();
- asm{ mov ra,ax
- mov rb,bx
- mov rc,cx
- mov c,dx
- popa};
- break;
- };
- case 1:
- {asm{ pusha /* VERY IMPORTANT, BECAUSE C USES */
- mov ax,param_ax /* SI AND DI AS TEMP VAR */
- mov bx,param_bx
- mov cx,param_cx
- mov dx,param_dx
- mov es,param_ds
- mov di,func};
- MAIN1();
- asm{ mov ra,ax
- mov rb,bx
- mov rc,cx
- mov c,dx
- popa};
- break;
- };
- case 2:
- {asm{ pusha /* VERY IMPORTANT, BECAUSE C USES */
- mov ax,param_ax /* SI AND DI AS TEMP VAR */
- mov bx,param_bx
- mov cx,param_cx
- mov dx,param_dx
- mov es,param_ds
- mov di,func};
- MAIN2();
- asm{ mov ra,ax
- mov rb,bx
- mov rc,cx
- mov c,dx
- popa};
- break;
- };
- case 3:
- {asm{ pusha /* VERY IMPORTANT, BECAUSE C USES */
- mov ax,param_ax /* SI AND DI AS TEMP VAR */
- mov bx,param_bx
- mov cx,param_cx
- mov dx,param_dx
- mov es,param_ds
- mov di,func};
- MAIN3();
- asm{ mov ra,ax
- mov rb,bx
- mov rc,cx
- mov c,dx
- popa};
- break;
- };
- case 4:
- {asm{ pusha /* VERY IMPORTANT, BECAUSE C USES */
- mov ax,param_ax /* SI AND DI AS TEMP VAR */
- mov bx,param_bx
- mov cx,param_cx
- mov dx,param_dx
- mov es,param_ds
- mov di,func};
- MAIN4();
- asm{ mov ra,ax
- mov rb,bx
- mov rc,cx
- mov c,dx
- popa};
- break;
- };
- }
- *handle= ra;
- *param= rb;
- return c;
- }
- //
- //===========================================================================
- //