diff options
author | notaz | 2012-07-04 18:25:11 +0300 |
---|---|---|
committer | notaz | 2012-07-09 02:35:59 +0300 |
commit | 6d75977b13fede33db381324c610561c6e723a8b (patch) | |
tree | 53755c52d6f84c91ad08735d5e7022ecc8c659dc /plugins | |
parent | 8048a6d763a5d74c6887ea511ba43e3124cd1bff (diff) | |
download | pcsx_rearmed-6d75977b13fede33db381324c610561c6e723a8b.tar.gz pcsx_rearmed-6d75977b13fede33db381324c610561c6e723a8b.tar.bz2 pcsx_rearmed-6d75977b13fede33db381324c610561c6e723a8b.zip |
spu: remove all threading code
it is broken for a while now, and I have no intention to fix it.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/dfsound/cfg.c | 161 | ||||
-rw-r--r-- | plugins/dfsound/cfg.h | 19 | ||||
-rw-r--r-- | plugins/dfsound/externals.h | 3 | ||||
-rw-r--r-- | plugins/dfsound/freeze.c | 8 | ||||
-rw-r--r-- | plugins/dfsound/spu.c | 108 | ||||
-rw-r--r-- | plugins/dfsound/spu.h | 3 |
6 files changed, 24 insertions, 278 deletions
diff --git a/plugins/dfsound/cfg.c b/plugins/dfsound/cfg.c deleted file mode 100644 index 5801453..0000000 --- a/plugins/dfsound/cfg.c +++ /dev/null @@ -1,161 +0,0 @@ -/***************************************************************************
- cfg.c - description
- -------------------
- begin : Wed May 15 2002
- copyright : (C) 2002 by Pete Bernert
- email : BlackDove@addcom.de
- ***************************************************************************/
-/***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. See also the license.txt file for *
- * additional informations. *
- * *
- ***************************************************************************/
-
-#include "stdafx.h"
-
-#define _IN_CFG
-
-#include "externals.h"
-
-////////////////////////////////////////////////////////////////////////
-// LINUX CONFIG/ABOUT HANDLING
-////////////////////////////////////////////////////////////////////////
-
-#include <unistd.h>
-
-////////////////////////////////////////////////////////////////////////
-// START EXTERNAL CFG TOOL
-////////////////////////////////////////////////////////////////////////
-
-void StartCfgTool(char * pCmdLine)
-{
- FILE * cf;
- char filename[255];
-
- strcpy(filename,"cfgDFSound");
- cf=fopen(filename,"rb");
- if(cf!=NULL)
- {
- fclose(cf);
- if(fork()==0)
- {
- execl("./cfgDFSound","cfgDFSound",pCmdLine,NULL);
- exit(0);
- }
- }
- else
- {
- strcpy(filename,"cfg/cfgDFSound");
- cf=fopen(filename,"rb");
- if(cf!=NULL)
- {
- fclose(cf);
- if(fork()==0)
- {
- chdir("cfg");
- execl("./cfgDFSound","cfgDFSound",pCmdLine,NULL);
- exit(0);
- }
- }
- else
- {
- sprintf(filename,"%s/cfgDFSound",getenv("HOME"));
- cf=fopen(filename,"rb");
- if(cf!=NULL)
- {
- fclose(cf);
- if(fork()==0)
- {
- chdir(getenv("HOME"));
- execl("./cfgDFSound","cfgDFSound",pCmdLine,NULL);
- exit(0);
- }
- }
- else printf("Sound error: cfgDFSound not found!\n");
- }
- }
-}
-
-/////////////////////////////////////////////////////////
-// READ LINUX CONFIG FILE
-/////////////////////////////////////////////////////////
-
-static void ReadConfigFile(void)
-{
- FILE *in;char t[256];int len;
- char * pB, * p;
-
- strcpy(t,"dfsound.cfg");
- in = fopen(t,"rb");
- if(!in)
- {
- strcpy(t,"cfg/dfsound.cfg");
- in = fopen(t,"rb");
- if(!in)
- {
- sprintf(t,"%s/dfsound.cfg",getenv("HOME"));
- in = fopen(t,"rb");
- if(!in) return;
- }
- }
-
- pB = (char *)malloc(32767);
- memset(pB,0,32767);
-
- len = fread(pB, 1, 32767, in);
- fclose(in);
-
- strcpy(t,"\nVolume");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
- if(p) iVolume=4-atoi(p+len);
- if(iVolume<1) iVolume=1;
- if(iVolume>4) iVolume=4;
-
- strcpy(t,"\nXAPitch");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
- if(p) iXAPitch=atoi(p+len);
- if(iXAPitch<0) iXAPitch=0;
- if(iXAPitch>1) iXAPitch=1;
-
- strcpy(t,"\nHighCompMode");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
- if(p) iUseTimer=atoi(p+len);
- if(iUseTimer<0) iUseTimer=0;
- // note: timer mode 1 (win time events) is not supported
- // in linux. But timer mode 2 (spuupdate) is safe to use.
- if(iUseTimer) iUseTimer=2;
-
- strcpy(t,"\nSPUIRQWait");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
- if(p) iSPUIRQWait=atoi(p+len);
- if(iSPUIRQWait<0) iSPUIRQWait=0;
- if(iSPUIRQWait>1) iSPUIRQWait=1;
-
- strcpy(t,"\nUseReverb");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
- if(p) iUseReverb=atoi(p+len);
- if(iUseReverb<0) iUseReverb=0;
- if(iUseReverb>2) iUseReverb=2;
-
- strcpy(t,"\nUseInterpolation");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
- if(p) iUseInterpolation=atoi(p+len);
- if(iUseInterpolation<0) iUseInterpolation=0;
- if(iUseInterpolation>3) iUseInterpolation=3;
-
- free(pB);
-}
-
-/////////////////////////////////////////////////////////
-// READ CONFIG called by spu funcs
-/////////////////////////////////////////////////////////
-
-void ReadConfigSPU(void)
-{
- iVolume=2;
- iXAPitch=0;
- iSPUIRQWait=0;
- iUseTimer=2;
- iUseReverb=2;
- iUseInterpolation=2;
-
- ReadConfigFile();
-}
diff --git a/plugins/dfsound/cfg.h b/plugins/dfsound/cfg.h deleted file mode 100644 index 14f3a8d..0000000 --- a/plugins/dfsound/cfg.h +++ /dev/null @@ -1,19 +0,0 @@ -/***************************************************************************
- cfg.h - description
- -------------------
- begin : Wed May 15 2002
- copyright : (C) 2002 by Pete Bernert
- email : BlackDove@addcom.de
- ***************************************************************************/
-/***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. See also the license.txt file for *
- * additional informations. *
- * *
- ***************************************************************************/
-
-void ReadConfigSPU(void);
-void StartCfgTool(char * pCmdLine);
diff --git a/plugins/dfsound/externals.h b/plugins/dfsound/externals.h index c9f20ca..18521ce 100644 --- a/plugins/dfsound/externals.h +++ b/plugins/dfsound/externals.h @@ -203,7 +203,6 @@ extern unsigned char * pSpuBuffer; extern int iVolume;
extern int iXAPitch;
-extern int iUseTimer;
extern int iSPUIRQWait;
extern int iDebugMode;
extern int iRecordMode;
@@ -221,8 +220,6 @@ extern unsigned short spuCtrl; extern unsigned short spuStat;
extern unsigned short spuIrq;
extern unsigned long spuAddr;
-extern int bEndThread;
-extern int bThreadEnded;
extern int bSpuInit;
extern unsigned int dwNewChannel;
extern unsigned int dwChannelOn;
diff --git a/plugins/dfsound/freeze.c b/plugins/dfsound/freeze.c index 1c037fe..d7e45b1 100644 --- a/plugins/dfsound/freeze.c +++ b/plugins/dfsound/freeze.c @@ -214,8 +214,6 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode,SPUFreeze_t * pF) if(ulFreezeMode==2) return 1; // info mode? ok, bye
// save mode:
- RemoveTimer(); // stop timer
-
memcpy(pF->cSPURam,spuMem,0x80000); // copy common infos
memcpy(pF->cSPUPort,regArea,0x200);
@@ -246,16 +244,12 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode,SPUFreeze_t * pF) pFO->s_chan[i].pLoop-=(unsigned long)spuMemC;
}
- SetupTimer(); // sound processing on again
-
return 1;
//--------------------------------------------------//
}
if(ulFreezeMode!=0) return 0; // bad mode? bye
- RemoveTimer(); // we stop processing while doing the save!
-
memcpy(spuMem,pF->cSPURam,0x80000); // get ram
memcpy(regArea,pF->cSPUPort,0x200);
@@ -286,7 +280,7 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode,SPUFreeze_t * pF) // fix to prevent new interpolations from crashing
for(i=0;i<MAXCHAN;i++) s_chan[i].SB[28]=0;
- SetupTimer(); // start sound processing again
+ ClearWorkingState();
return 1;
}
diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c index 7c12cdc..f5aab9f 100644 --- a/plugins/dfsound/spu.c +++ b/plugins/dfsound/spu.c @@ -24,7 +24,6 @@ #include "externals.h" #include "registers.h" -#include "cfg.h" #include "dsoundoss.h" #ifdef ENABLE_NLS @@ -80,7 +79,6 @@ unsigned char * pMixIrq=0; int iVolume=768; // 1024 is 1.0 int iXAPitch=1; -int iUseTimer=2; int iSPUIRQWait=1; int iDebugMode=0; int iRecordMode=0; @@ -100,13 +98,9 @@ unsigned short spuCtrl=0; // some vars to store psx unsigned short spuStat=0; unsigned short spuIrq=0; unsigned long spuAddr=0xffffffff; // address into spu mem -int bEndThread=0; // thread handlers -int bThreadEnded=0; int bSpuInit=0; int bSPUIsOpen=0; -static pthread_t thread = (pthread_t)-1; // thread id (linux) - unsigned int dwNewChannel=0; // flags for faster testing, if new channel starts unsigned int dwChannelOn=0; // not silent channels unsigned int dwPendingChanOff=0; @@ -668,27 +662,18 @@ static void mix_chan_rvb(int start, int count, int lv, int rv) //////////////////////////////////////////////////////////////////////// // MAIN SPU FUNCTION -// here is the main job handler... thread, timer or direct func call +// here is the main job handler... // basically the whole sound processing is done in this fat func! //////////////////////////////////////////////////////////////////////// -// 5 ms waiting phase, if buffer is full and no new sound has to get started -// .. can be made smaller (smallest val: 1 ms), but bigger waits give -// better performance - -#define PAUSE_W 5 -#define PAUSE_L 5000 - -//////////////////////////////////////////////////////////////////////// - -static void *MAINThread(void *arg) +static int do_samples(void) { int volmult = iVolume; int ns,ns_from,ns_to; int ch,d,silentch; int bIRQReturn=0; - while(!bEndThread) // until we are shutting down + while(1) { // ok, at the beginning we are looking if there is // enuff free place in the dsound/oss buffer to @@ -704,15 +689,10 @@ static void *MAINThread(void *arg) } else iSecureStart=0; // 0: no new channel should start - while(!iSecureStart && !bEndThread && // no new start? no thread end? + if(!iSecureStart && // no new start? (SoundGetBytesBuffered()>TESTSIZE)) // and still enuff data in sound buffer? { - iSecureStart=0; // reset secure - - if(iUseTimer) return 0; // linux no-thread mode? bye - usleep(PAUSE_L); // else sleep for x ms (linux) - - if(dwNewChannel) iSecureStart=1; // if a new channel kicks in (or, of course, sound buffer runs low), we will leave the loop + return 0; } //--------------------------------------------------// continue from irq handling in timer mode? @@ -797,19 +777,7 @@ static void *MAINThread(void *arg) { iSpuAsyncWait=1; bIRQReturn=0; - if(iUseTimer!=2) - { - DWORD dwWatchTime=timeGetTime_spu()+2500; - - while(iSpuAsyncWait && !bEndThread && - timeGetTime_spu()<dwWatchTime) - usleep(1000L); - continue; - } - else - { - return 0; - } + return 0; } @@ -894,10 +862,6 @@ static void *MAINThread(void *arg) } } - // end of big main loop... - - bThreadEnded = 1; - return 0; } @@ -911,21 +875,18 @@ void CALLBACK SPUasync(unsigned long cycle) if(iSpuAsyncWait) { iSpuAsyncWait++; - if(iSpuAsyncWait<=16/2) return; + if(iSpuAsyncWait<=16/FRAG_MSECS) return; iSpuAsyncWait=0; } - if(iUseTimer==2) // special mode, only used in Linux by this spu (or if you enable the experimental Windows mode) - { - if(!bSpuInit) return; // -> no init, no call + if(!bSpuInit) return; // -> no init, no call - MAINThread(0); // -> linux high-compat mode + do_samples(); - // abuse iSpuAsyncWait mechanism to reduce calls to above function - // to make it do larger chunks - // note: doing it less often than once per frame causes skips - iSpuAsyncWait=1; - } + // abuse iSpuAsyncWait mechanism to reduce calls to above function + // to make it do larger chunks + // note: doing it less often than once per frame causes skips + iSpuAsyncWait=1; } // SPU UPDATE... new epsxe func @@ -961,37 +922,12 @@ int CALLBACK SPUplayCDDAchannel(short *pcm, int nbytes) return FeedCDDA((unsigned char *)pcm, nbytes); } -// SETUPTIMER: init of certain buffers and threads/timers -void SetupTimer(void) +// to be called after state load +void ClearWorkingState(void) { memset(SSumLR,0,sizeof(SSumLR)); // init some mixing buffers - memset(iFMod,0,NSSIZE*sizeof(int)); + memset(iFMod,0,sizeof(iFMod)); pS=(short *)pSpuBuffer; // setup soundbuffer pointer - - bEndThread=0; // init thread vars - bThreadEnded=0; - bSpuInit=1; // flag: we are inited - - if(!iUseTimer) // linux: use thread - { - pthread_create(&thread, NULL, MAINThread, NULL); - } -} - -// REMOVETIMER: kill threads/timers -void RemoveTimer(void) -{ - bEndThread=1; // raise flag to end thread - - if(!iUseTimer) // linux tread? - { - int i=0; - while(!bThreadEnded && i<2000) {usleep(1000L);i++;} // -> wait until thread has ended - if(thread!=(pthread_t)-1) {pthread_cancel(thread);thread=(pthread_t)-1;} // -> cancel thread anyway - } - - bThreadEnded=0; // no more spu is running - bSpuInit=0; } // SETUPSTREAMS: init most of the spu buffers @@ -1031,7 +967,11 @@ void SetupStreams(void) s_chan[i].pCurr=spuMemC; } - pMixIrq=spuMemC; // enable decoded buffer irqs by setting the address + pMixIrq=spuMemC; // enable decoded buffer irqs by setting the address + + ClearWorkingState(); + + bSpuInit=1; // flag: we are inited } // REMOVESTREAMS: free most buffer @@ -1058,8 +998,6 @@ long CALLBACK SPUinit(void) spuIrq = 0; spuAddr = 0xffffffff; - bEndThread = 0; - bThreadEnded = 0; spuMemC = (unsigned char *)spuMem; pMixIrq = 0; memset((void *)s_chan, 0, (MAXCHAN + 1) * sizeof(SPUCHAN)); @@ -1067,7 +1005,6 @@ long CALLBACK SPUinit(void) //iSPUIRQWait = 0; lastch = -1; - //ReadConfigSPU(); // read user stuff SetupStreams(); // prepare streaming return 0; @@ -1079,7 +1016,6 @@ long CALLBACK SPUopen(void) if (bSPUIsOpen) return 0; // security for some stupid main emus SetupSound(); // setup sound (before init!) - SetupTimer(); // timer for feeding data bSPUIsOpen = 1; @@ -1093,7 +1029,6 @@ long CALLBACK SPUclose(void) bSPUIsOpen = 0; // no more open - RemoveTimer(); // no more feeding RemoveSound(); // no more sound handling return 0; @@ -1104,6 +1039,7 @@ long CALLBACK SPUshutdown(void) { SPUclose(); RemoveStreams(); // no more streaming + bSpuInit=0; return 0; } diff --git a/plugins/dfsound/spu.h b/plugins/dfsound/spu.h index 048f643..d42425d 100644 --- a/plugins/dfsound/spu.h +++ b/plugins/dfsound/spu.h @@ -15,7 +15,6 @@ * *
***************************************************************************/
-void SetupTimer(void);
-void RemoveTimer(void);
+void ClearWorkingState(void);
void CALLBACK SPUplayADPCMchannel(xa_decode_t *xap);
int CALLBACK SPUplayCDDAchannel(short *pcm, int bytes);
|