7 These routines are used to access the available soundcard drivers.
10 All systems - all compilers
17 DRIVER *firstdriver=NULL,*md_driver;
20 UWORD md_mixfreq =44100;
22 UWORD md_dmabufsize =8192;
26 static void dummyplay(void)
30 void (*md_player)(void)=dummyplay;
34 static UWORD sl_infmt;
35 static UWORD sl_outfmt;
36 static SWORD sl_buffer[1024];
38 static BOOL isplaying=0;
41 void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt)
55 void SL_Load(void *buffer,ULONG length)
57 SBYTE *bptr=(SBYTE *)buffer;
58 SWORD *wptr=(SWORD *)buffer;
62 /* compute number of samples to load */
63 if(sl_outfmt & SF_16BITS) length>>=1;
67 stodo=(length<1024) ? length : 1024;
69 if(sl_infmt&SF_16BITS){
70 fread(sl_buffer,sizeof(SWORD),stodo,sl_fp);
72 if(!(sl_infmt&SF_BIG_ENDIAN))
73 swab((char *)sl_buffer,(char *)sl_buffer,stodo<<1);
75 /* assume machine is little endian by default */
76 if(sl_infmt&SF_BIG_ENDIAN)
77 swab((char *)sl_buffer,(char *)sl_buffer,stodo<<1);
84 fread(sl_buffer,sizeof(SBYTE),stodo,sl_fp);
98 if(sl_infmt & SF_DELTA){
100 sl_buffer[t]+=sl_old;
105 if((sl_infmt^sl_outfmt) & SF_SIGNED){
106 for(t=0;t<stodo;t++){
107 sl_buffer[t]^=0x8000;
111 if(sl_outfmt & SF_16BITS){
112 for(t=0;t<stodo;t++) *(wptr++)=sl_buffer[t];
115 for(t=0;t<stodo;t++) *(bptr++)=sl_buffer[t]>>8;
123 void MD_InfoDriver(void)
128 /* list all registered devicedrivers: */
130 for(t=1,l=firstdriver; l!=NULL; l=l->next, t++){
131 printf("%d. %s\n",t,l->Version);
136 void MD_RegisterDriver(DRIVER *drv)
138 if(firstdriver==NULL){
143 drv->next=firstdriver;
149 SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags)
151 SWORD result=md_driver->SampleLoad(fp,size,reppos,repend,flags);
157 void MD_SampleUnLoad(SWORD handle)
159 md_driver->SampleUnLoad(handle);
167 /* if md_device==0, try to find a device number */
171 for(t=1,md_driver=firstdriver; md_driver!=NULL; md_driver=md_driver->next, t++){
172 if(md_driver->IsPresent()) break;
176 myerr="You don't have any of the supported sound-devices";
183 /* if n>0 use that driver */
185 for(t=1,md_driver=firstdriver; md_driver!=NULL && t!=md_device; md_driver=md_driver->next, t++);
188 myerr="Device number out of range";
192 return(md_driver->Init());
202 void MD_PlayStart(void)
204 /* safety valve, prevents entering
207 if(isplaying) return;
208 md_driver->PlayStart();
213 void MD_PlayStop(void)
215 /* safety valve, prevents calling playStop when playstart
216 hasn't been called: */
220 md_driver->PlayStop();
225 void MD_SetBPM(UBYTE bpm)
231 void MD_RegisterPlayer(void (*player)(void))
239 if(isplaying) md_driver->Update();
243 void MD_VoiceSetVolume(UBYTE voice,UBYTE vol)
245 md_driver->VoiceSetVolume(voice,vol);
249 void MD_VoiceSetFrequency(UBYTE voice,ULONG frq)
251 md_driver->VoiceSetFrequency(voice,frq);
255 void MD_VoiceSetPanning(UBYTE voice,ULONG pan)
257 md_driver->VoiceSetPanning(voice,pan);
261 void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags)
263 md_driver->VoicePlay(voice,handle,start,size,reppos,repend,flags);