aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authornotaz2012-07-04 18:25:11 +0300
committernotaz2012-07-09 02:35:59 +0300
commit6d75977b13fede33db381324c610561c6e723a8b (patch)
tree53755c52d6f84c91ad08735d5e7022ecc8c659dc /plugins
parent8048a6d763a5d74c6887ea511ba43e3124cd1bff (diff)
downloadpcsx_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.c161
-rw-r--r--plugins/dfsound/cfg.h19
-rw-r--r--plugins/dfsound/externals.h3
-rw-r--r--plugins/dfsound/freeze.c8
-rw-r--r--plugins/dfsound/spu.c108
-rw-r--r--plugins/dfsound/spu.h3
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);