static void MIDAS_start(struct mpxplay_audioout_info_s *aui) { if(midashandle){ MIDASresumeStream(midashandle); }else{ midashandle=MIDASplayStreamPolling(4,aui->freq_card,1000); if(midashandle==NULL){ pds_textdisplay_printf("MIDAS error: "); pds_textdisplay_printf(MIDASgetErrorMessage(MIDASgetLastError())); MIDASclose(); exit(0); } MIDAS_setvol(); } aui->card_infobits|=AUINFOS_CARDINFOBIT_PLAYING; }
static int MIDAS_detect(struct mpxplay_audioout_info_s *aui) { unsigned int iscard,len; char midascnffile[300]; pds_getpath_from_fullname(midascnffile,freeopts[OPT_PROGNAME]); len=pds_strlen(midascnffile); if(len && (midascnffile[len-1]!=PDS_DIRECTORY_SEPARATOR_CHAR)) len+=pds_strcpy(&midascnffile[len],PDS_DIRECTORY_SEPARATOR_STR); pds_strcpy(&midascnffile[len],"mpxmidas.ini"); MIDASstartup(); MIDASsetOption(MIDAS_OPTION_MIXING_MODE,1); if(aui->card_controlbits&AUINFOS_CARDCNTRLBIT_MIDASMANUALCFG){ iscard=MIDASconfig(); MIDASsaveConfig(midascnffile); }else{ iscard=MIDASloadConfig(midascnffile); if(!iscard) iscard=MIDASdetectSoundCard(); } iscard+=MIDASinit(); iscard+=MIDASopenChannels(2); if(iscard==3){ midashandle=MIDASplayStreamPolling(4,aui->freq_card,1000); if(midashandle){ MIDASpauseStream(midashandle); iscard++; } } if(iscard<4){ pds_textdisplay_printf("MIDAS error: "); pds_textdisplay_printf(MIDASgetErrorMessage(MIDASgetLastError())); MIDASclose(); return 0; } return 1; }
static void soundPlay(struct Sound *s,char *filename,int fileofs,int filesize,int loop) { // read sound file header int err; fileHandle fh=0; long fsize; #define HEADSIZE 78 unsigned char buf[HEADSIZE]; memset(buf,0,HEADSIZE); #ifdef EXTENDFILE rfSuperStart=fileofs; rfSuperSize=filesize; #endif s->loop=loop; #define MCALL1(f) err=f;if(err) {reportErr(err); return;} #define MCALL2(f) err=f;if(err) {reportErr(err); err=fileClose(fh); if(err) reportErr(err); return;} MCALL1(fileOpen(filename,fileOpenRead,&fh)); MCALL2(fileGetSize(fh,&fsize)); MCALL2(fileRead(fh,buf,fsize<HEADSIZE?fsize:HEADSIZE)); MCALL1(fileClose(fh)); // analyze sound file header // waw sample? starts with "RIFF" with fmt!=55h if (buf[0]=='R' && buf[1]=='I' && buf[2]=='F' && buf[3]=='F' /*&& buf[8]=='W' && buf[9]=='A' && buf[10]=='V' && buf[11]=='E'*/ && buf[20]!=0x55) { extern int lastWAVfreq; s->type=Sample; s->datahandle=(int)MIDASloadWaveSample(filename,loop?MIDAS_LOOP_YES:MIDAS_LOOP_NO); if(s->datahandle) s->playhandle=(int)MIDASplaySample((MIDASsample)s->datahandle,MIDAS_CHANNEL_AUTO,0/*priority*/,lastWAVfreq,64,MIDAS_PAN_MIDDLE); } #ifdef EXTENDFILE // iff sample with 0x16 characters long name? (FT2 makes them) // it isn't ment as IFF support, just quick 99% working hack else if (buf[0]=='F' && buf[1]=='O' && buf[2]=='R' && buf[3]=='M' && buf[8]=='8' && buf[9]=='S' && buf[10]=='V' && buf[11]=='X' && buf[12]=='N' && buf[13]=='A' && buf[14]=='M' && buf[15]=='E' && buf[16]==0 && buf[17]==0 && buf[18]==0 && buf[19]==0x16) { int rate=(buf[62]<<8)+buf[63]; rfSuperStart+=78; rfSuperSize=MIN(fsize-78,(buf[74]<<24)+(buf[75]<<16)+(buf[76]<<8)+buf[77]); rfSuperXor=128; s->type=Sample; s->datahandle=(int)MIDASloadRawSample(filename,MIDAS_SAMPLE_8BIT_MONO,loop?MIDAS_LOOP_YES:MIDAS_LOOP_NO); if(s->datahandle) s->playhandle=(int)MIDASplaySample((MIDASsample)s->datahandle,MIDAS_CHANNEL_AUTO,0/*priority*/,rate,64,MIDAS_PAN_MIDDLE); } #endif // mp3 stream? starts with FF Fx or FF Ex or "ID3" or "RIFF" with fmt=55h else if ( (buf[0]==0xff && (buf[1] & 0xe0)==0xe0) || (buf[0]=='I' && buf[1]=='D' && buf[2]=='3') || (buf[0]=='R' && buf[1]=='I' && buf[2]=='F' && buf[3]=='F' && buf[20]==0x55) ) { int rate,stereo; s->type=Stream; s->datahandle=(int)MP3open(filename,fileofs,filesize,&rate,&stereo,errAdd); if(s->datahandle) s->playhandle=(int)MIDASplayStreamPolling(stereo?MIDAS_SAMPLE_16BIT_STEREO:MIDAS_SAMPLE_16BIT_MONO,rate,1000*MP3PRECALCSEC); s->bufferbytes=rate*(stereo?4:2)*MP3PRECALCSEC; } // maybe module? else { s->type=Module; s->datahandle=(int)MIDASloadModule(filename); if(s->datahandle) s->playhandle=(int)MIDASplayModule((MIDASmodule)s->datahandle,loop); } #ifdef EXTENDFILE rfSuperStart=0; rfSuperSize=0; rfSuperXor=0; #endif MIDASreportErr(); }