SoundManager.cpp 84 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830
  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4. #include "SoundManager.h"
  5. #include "SoundBackend.h"
  6. #include "backends/SoundBackendSDL.h"
  7. #ifdef _MSC_VER
  8. #include <windows.h>
  9. #else
  10. #include <sys/time.h>
  11. #endif
  12. SoundManager *SOUNDMAN = NULL;
  13. SoundBackend *SBE = NULL;
  14. #ifndef HIWORD
  15. #define HIWORD(l) ((WORD) (((DWORD) (l) >> 16) & 0xFFFF))
  16. #endif
  17. #ifndef LOWORD
  18. #define LOWORD(a) ((WORD)(a))
  19. #endif
  20. typedef unsigned short int WORD;
  21. #ifndef _MSC_VER
  22. typedef unsigned int DWORD;
  23. #endif
  24. unsigned long RateTable[160];
  25. // REVERB info and timing vars...
  26. int *sRVBPlay = NULL;
  27. int *sRVBEnd = NULL;
  28. int *sRVBStart = NULL;
  29. // some delay factor for reverb
  30. int iReverbOff = -1;
  31. int iReverbRepeat = 0;
  32. int iReverbNum = 1;
  33. xa_decode_t * xapGlobal=0;
  34. u32 * XAFeed = NULL;
  35. u32 * XAPlay = NULL;
  36. u32 * XAStart = NULL;
  37. u32 * XAEnd = NULL;
  38. u32 XARepeat = 0;
  39. u32 XALastVal = 0;
  40. int iLeftXAVol = 32767;
  41. int iRightXAVol = 32767;
  42. static int gauss_ptr = 0;
  43. static int gauss_window[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  44. #define gvall0 gauss_window[gauss_ptr]
  45. #define gvall(x) gauss_window[(gauss_ptr+x)&3]
  46. #define gvalr0 gauss_window[4+gauss_ptr]
  47. #define gvalr(x) gauss_window[4+((gauss_ptr+x)&3)]
  48. void SetupTimer();
  49. void RemoveTimer();
  50. const unsigned char version = 1;
  51. const unsigned char revision = 0;
  52. const unsigned char build = 0;
  53. // psx buffer / addresses
  54. unsigned short regArea[10000];
  55. unsigned short spuMem[256 * 1024];
  56. unsigned char * spuMemC;
  57. unsigned char * pSpuIrq = 0;
  58. unsigned char * pSpuBuffer;
  59. // user settings
  60. int iUseXA = 1;
  61. int iVolume = 3;
  62. int iXAPitch = 1;
  63. int iUseTimer = 2;
  64. int iSPUIRQWait = 1;
  65. int iDebugMode = 0;
  66. int iRecordMode = 0;
  67. int iUseReverb = 2;
  68. int iUseInterpolation = 2;
  69. //int iDisStereo = 0;
  70. // MAIN infos struct for each channel
  71. // channel + 1 infos (1 is security for fmod handling)
  72. SPUCHAN s_chan[MAXCHAN + 1];
  73. REVERBInfo rvb;
  74. // global noise generator
  75. unsigned long dwNoiseVal = 1;
  76. int iWatchDog = 0;
  77. // some vars to store psx reg infos
  78. unsigned short spuCtrl = 0;
  79. unsigned short spuStat = 0;
  80. unsigned short spuIrq = 0;
  81. // address into spu mem
  82. unsigned long spuAddr = 0xffffffff;
  83. // thread handlers
  84. int bEndThread = 0;
  85. int bThreadEnded = 0;
  86. int bSpuInit = 0;
  87. int bSPUIsOpen = 0;
  88. // flags for faster testing, if new channel starts
  89. unsigned long dwNewChannel = 0;
  90. // func of main emu, called on spu irq
  91. void (*irqCallback)(void) = 0;
  92. void (*cddavCallback)(unsigned short, unsigned short) = 0;
  93. // certain globals (were local before, but
  94. // with the new timeproc I need em global)
  95. static const int f[5][2] =
  96. {
  97. { 0, 0},
  98. { 60, 0},
  99. {115, -52},
  100. { 98, -55},
  101. {122, -60}
  102. };
  103. int SSumR[NSSIZE];
  104. int SSumL[NSSIZE];
  105. int iCycle = 0;
  106. short * pS;
  107. // last channel processed on spu irq in timer mode
  108. static int lastch = -1;
  109. // last ns pos
  110. static int lastns = 0;
  111. // secure start counter
  112. static int iSecureStart = 0;
  113. SoundManager::SoundManager()
  114. {
  115. u8 *buffer;
  116. /* SPU initialization */
  117. SPUinit();
  118. SPUopen();
  119. /* base initialization of main registers */
  120. u16 temp;
  121. SPUwriteRegister(0x1f801d80, 0x0000);
  122. SPUwriteRegister(0x1f801d82, 0x0000);
  123. // H_SPUctrl
  124. SPUwriteRegister(0x1f801daa, 0x0000);
  125. SPUwriteRegister(0x1f801d80, 0x0000);
  126. SPUwriteRegister(0x1f801d82, 0x0000);
  127. // returns 0x0000
  128. temp = SPUreadRegister(0x1f801dae);
  129. SPUwriteRegister(0x1f801dac, 0x0004);
  130. // H_SPUvolL
  131. SPUwriteRegister(0x1f801d84, 0x0000);
  132. // H_SPUvolR
  133. SPUwriteRegister(0x1f801d86, 0x0000);
  134. // H_SPUoff1
  135. SPUwriteRegister(0x1f801d8c, 0xffff);
  136. // H_SPUoff2
  137. SPUwriteRegister(0x1f801d8e, 0xffff);
  138. // H_RVBon1
  139. SPUwriteRegister(0x1f801d98, 0x0000);
  140. // H_RVBon2
  141. SPUwriteRegister(0x1f801d9a, 0x0000);
  142. // H_Fmod1
  143. SPUwriteRegister(0x1f801d90, 0x0000);
  144. // H_Fmod2
  145. SPUwriteRegister(0x1f801d92, 0x0000);
  146. // H_Noise1
  147. SPUwriteRegister(0x1f801d94, 0x0000);
  148. // H_Noise2
  149. SPUwriteRegister(0x1f801d96, 0x0000);
  150. // H_CDLeft
  151. SPUwriteRegister(0x1f801db0, 0x0000);
  152. // H_CDRight
  153. SPUwriteRegister(0x1f801db2, 0x0000);
  154. SPUwriteRegister(0x1f801db4, 0x0000);
  155. SPUwriteRegister(0x1f801db6, 0x0000);
  156. // returns 0x0000
  157. temp = SPUreadRegister(0x1f801dae);
  158. // H_SPUaddr
  159. SPUwriteRegister(0x1f801da6, 0x0200);
  160. // H_SPUdata, hmmm... why 8 times??
  161. for(int i = 0; i < 8; ++i)
  162. SPUwriteRegister(0x1f801da8, 0x0707);
  163. // returns 0x0000
  164. temp = SPUreadRegister(0x1f801daa);
  165. // H_SPUctrl
  166. SPUwriteRegister(0x1f801daa, 0x0010);
  167. // returns 0x0000
  168. temp = SPUreadRegister(0x1f801dae);
  169. // returns 0x0010
  170. temp = SPUreadRegister(0x1f801daa);
  171. // H_SPUctrl
  172. SPUwriteRegister(0x1f801daa, 0x0000);
  173. // returns 0x0000
  174. temp = SPUreadRegister(0x1f801dae);
  175. /* clear channels */
  176. for(int i = 0; i < 24; ++i)
  177. {
  178. // left volume
  179. SPUwriteRegister(m_REGISTER_BASE + 16 * i + 0x00, 0x0000);
  180. // right volume
  181. SPUwriteRegister(m_REGISTER_BASE + 16 * i + 0x02, 0x0000);
  182. // pitch
  183. SPUwriteRegister(m_REGISTER_BASE + 16 * i + 0x04, 0x3fff);
  184. // start address
  185. SPUwriteRegister(m_REGISTER_BASE + 16 * i + 0x06, 0x0200);
  186. // level with pre-calcs
  187. SPUwriteRegister(m_REGISTER_BASE + 16 * i + 0x08, 0x0000);
  188. // adsr times with precalcs
  189. SPUwriteRegister(m_REGISTER_BASE + 16 * i + 0x0a, 0x0000);
  190. }
  191. /* on/off SPU channels, why?? ;) */
  192. // H_SPUon1
  193. SPUwriteRegister(0x1f801d88, 0xffff);
  194. // H_SPUon2
  195. SPUwriteRegister(0x1f801d8a, 0x00ff);
  196. // H_SPUoff1
  197. SPUwriteRegister(0x1f801d8c, 0xffff);
  198. // H_SPUoff2
  199. SPUwriteRegister(0x1f801d8e, 0x00ff);
  200. /* reverb initialization */
  201. // H_SPUctrl
  202. SPUwriteRegister(0x1f801daa, 0xc000);
  203. // H_SPUReverbAddr
  204. SPUwriteRegister(0x1f801da2, 0xfffe);
  205. /* another dma transfer [unknown yet] */
  206. // temporary writing another dma dump gotten with real emu
  207. {
  208. std::ifstream iF;
  209. iF.open("data/dmadump2.bin", std::ios_base::binary);
  210. u32 datasize = 64;
  211. buffer = new u8[datasize];
  212. iF.read((char *)buffer, datasize);
  213. iF.close();
  214. if(!this->PsxWriteDMA(0xedfc, buffer, datasize))
  215. {
  216. std::cout << "[SoundManager] error: failed to DMA write unknown data" << std::endl;
  217. exit(EXIT_FAILURE);
  218. }
  219. delete [] buffer;
  220. }
  221. /* CDaudio controls? */
  222. SPUwriteRegister(0x1f801d80, 0x3fff);
  223. SPUwriteRegister(0x1f801d82, 0x3fff);
  224. // H_CDLeft
  225. SPUwriteRegister(0x1f801db0, 0x7fff);
  226. // H_CDRight
  227. SPUwriteRegister(0x1f801db2, 0x7fff);
  228. SPUwriteRegister(0x1f801db4, 0x0000);
  229. SPUwriteRegister(0x1f801db6, 0x0000);
  230. /* here turning something important on, or clear something, me thinks... */
  231. // returns 0xc0000
  232. temp = SPUreadRegister(0x1f801daa);
  233. // H_SPUctrl
  234. SPUwriteRegister(0x1f801daa, 0xc000);
  235. // returns 0xc000
  236. temp = SPUreadRegister(0x1f801daa);
  237. // H_SPUctrl
  238. SPUwriteRegister(0x1f801daa, 0xc001);
  239. // returns 0xc001
  240. temp = SPUreadRegister(0x1f801daa);
  241. // H_SPUctrl
  242. SPUwriteRegister(0x1f801daa, 0xc001);
  243. // returns 0xc001
  244. temp = SPUreadRegister(0x1f801daa);
  245. // H_SPUctrl
  246. SPUwriteRegister(0x1f801daa, 0xc001);
  247. /* clear channels volume again, for safe?? (cleared before) */
  248. for(int i = 0; i < 24; ++i)
  249. {
  250. // left volume
  251. SPUwriteRegister(m_REGISTER_BASE + 16 * i + 0x00, 0x0000);
  252. // right volume
  253. SPUwriteRegister(m_REGISTER_BASE + 16 * i + 0x02, 0x0000);
  254. }
  255. /* another init ;) */
  256. // returns 0xc001
  257. temp = SPUreadRegister(0x1f801daa);
  258. // H_SPUctrl
  259. SPUwriteRegister(0x1f801daa, 0xc001);
  260. // returns 0xc001
  261. temp = SPUreadRegister(0x1f801daa);
  262. // H_SPUoff1
  263. SPUwriteRegister(0x1f801d8c, 0x0000);
  264. // H_SPUoff2
  265. SPUwriteRegister(0x1f801d8e, 0x0000);
  266. // returns 0x0000
  267. temp = SPUreadRegister(0x1f801d9a);
  268. // returns 0x0000
  269. temp = SPUreadRegister(0x1f801d98);
  270. // returns 0x0000
  271. temp = SPUreadRegister(0x1f801d98);
  272. // H_RVBon1
  273. SPUwriteRegister(0x1f801d98, 0x0000);
  274. // returns 0x0000
  275. temp = SPUreadRegister(0x1f801d9a);
  276. // H_RVBon2
  277. SPUwriteRegister(0x1f801d9a, 0x0000);
  278. // returns 0x0000
  279. temp = SPUreadRegister(0x1f801d9a);
  280. // returns 0x0000
  281. temp = SPUreadRegister(0x1f801d98);
  282. // returns 0x0000
  283. temp = SPUreadRegister(0x1f801d98);
  284. // H_RVBon1
  285. SPUwriteRegister(0x1f801d98, 0x0000);
  286. // returns 0x0000
  287. temp = SPUreadRegister(0x1f801d9a);
  288. // H_RVBon2
  289. SPUwriteRegister(0x1f801d9a, 0x0000);
  290. // returns 0x0000
  291. temp = SPUreadRegister(0x1f801d92);
  292. // returns 0x0000
  293. temp = SPUreadRegister(0x1f801d90);
  294. // returns 0x0000
  295. temp = SPUreadRegister(0x1f801d90);
  296. // H_FMod1
  297. SPUwriteRegister(0x1f801d90, 0x0000);
  298. // returns 0x0000
  299. temp = SPUreadRegister(0x1f801d92);
  300. // H_FMod2
  301. SPUwriteRegister(0x1f801d92, 0x0000);
  302. // returns 0x0000
  303. temp = SPUreadRegister(0x1f801d92);
  304. // returns 0x0000
  305. temp = SPUreadRegister(0x1f801d90);
  306. // returns 0x0000
  307. temp = SPUreadRegister(0x1f801d90);
  308. // H_FMod1
  309. SPUwriteRegister(0x1f801d90, 0x0000);
  310. // returns 0x0000
  311. temp = SPUreadRegister(0x1f801d92);
  312. // H_FMod2
  313. SPUwriteRegister(0x1f801d92, 0x0000);
  314. // returns 0x0000
  315. temp = SPUreadRegister(0x1f801d96);
  316. // returns 0x0000
  317. temp = SPUreadRegister(0x1f801d94);
  318. // returns 0x0000
  319. temp = SPUreadRegister(0x1f801d94);
  320. // H_Noise1
  321. SPUwriteRegister(0x1f801d94, 0x0000);
  322. // returns 0x0000
  323. temp = SPUreadRegister(0x1f801d96);
  324. // H_Noise2
  325. SPUwriteRegister(0x1f801d96, 0x0000);
  326. // returns 0x0000
  327. temp = SPUreadRegister(0x1f801d96);
  328. // returns 0x0000
  329. temp = SPUreadRegister(0x1f801d94);
  330. // returns 0x0000
  331. temp = SPUreadRegister(0x1f801d94);
  332. // H_Noise1
  333. SPUwriteRegister(0x1f801d94, 0x0000);
  334. // returns 0x0000
  335. temp = SPUreadRegister(0x1f801d96);
  336. // H_Noise2
  337. SPUwriteRegister(0x1f801d96, 0x0000);
  338. // returns 0xc001
  339. temp = SPUreadRegister(0x1f801daa);
  340. // H_SPUctrl
  341. SPUwriteRegister(0x1f801daa, 0xc001);
  342. // returns 0xc001
  343. temp = SPUreadRegister(0x1f801daa);
  344. // H_SPUrvolL
  345. SPUwriteRegister(0x1f801d84, 0x0000);
  346. // H_SPUrvolR
  347. SPUwriteRegister(0x1f801d86, 0x0000);
  348. /* set reverb parameters?? */
  349. // H_Reverb
  350. SPUwriteRegister(0x1f801dc0, 0x00e3);
  351. SPUwriteRegister(0x1f801dc2, 0x00a9);
  352. SPUwriteRegister(0x1f801dc4, 0x6f60);
  353. SPUwriteRegister(0x1f801dc6, 0x4fa8);
  354. SPUwriteRegister(0x1f801dc8, 0xbce0);
  355. SPUwriteRegister(0x1f801dca, 0x4510);
  356. SPUwriteRegister(0x1f801dcc, 0xbef0);
  357. SPUwriteRegister(0x1f801dce, 0xa680);
  358. SPUwriteRegister(0x1f801dd0, 0x5680);
  359. SPUwriteRegister(0x1f801dd2, 0x52c0);
  360. SPUwriteRegister(0x1f801dd4, 0x0dfb);
  361. SPUwriteRegister(0x1f801dd6, 0x0b58);
  362. SPUwriteRegister(0x1f801dd8, 0x0d09);
  363. SPUwriteRegister(0x1f801dda, 0x0a3c);
  364. SPUwriteRegister(0x1f801ddc, 0x0bd9);
  365. SPUwriteRegister(0x1f801dde, 0x0973);
  366. SPUwriteRegister(0x1f801de0, 0x0b59);
  367. SPUwriteRegister(0x1f801de2, 0x08da);
  368. SPUwriteRegister(0x1f801de4, 0x08d9);
  369. SPUwriteRegister(0x1f801de6, 0x05e9);
  370. SPUwriteRegister(0x1f801de8, 0x07ec);
  371. SPUwriteRegister(0x1f801dea, 0x04b0);
  372. SPUwriteRegister(0x1f801dec, 0x06ef);
  373. SPUwriteRegister(0x1f801dee, 0x03d2);
  374. SPUwriteRegister(0x1f801df0, 0x05ea);
  375. SPUwriteRegister(0x1f801df2, 0x031d);
  376. SPUwriteRegister(0x1f801df4, 0x031c);
  377. SPUwriteRegister(0x1f801df6, 0x0238);
  378. SPUwriteRegister(0x1f801df8, 0x0154);
  379. SPUwriteRegister(0x1f801dfa, 0x00aa);
  380. SPUwriteRegister(0x1f801dfc, 0x8000);
  381. SPUwriteRegister(0x1f801dfe, 0x8000);
  382. /* and finishing dma transfer of zeroes :), phew */
  383. {
  384. u32 datasize = 1024;
  385. u8 *buffer = new u8[datasize];
  386. memset((void *)buffer, 0x00, datasize);
  387. for(int i = 0; i < 28; ++i)
  388. {
  389. if(!this->PsxWriteDMA(0xf204 + 128 * i, buffer, datasize))
  390. {
  391. std::cout << "[SoundManager] error: failed to DMA write 0x00 data" << std::endl;
  392. exit(EXIT_FAILURE);
  393. }
  394. }
  395. delete [] buffer;
  396. }
  397. /* last init */
  398. // H_SPUReverbAddr
  399. SPUwriteRegister(0x1f801da2, 0xf204);
  400. // returns 0xc001
  401. temp = SPUreadRegister(0x1f801daa);
  402. // H_SPUctrl
  403. SPUwriteRegister(0x1f801daa, 0xc081);
  404. // returns 0x0000
  405. temp = SPUreadRegister(0x1f801d96);
  406. // returns 0x0000
  407. temp = SPUreadRegister(0x1f801d94);
  408. // returns 0x0000
  409. temp = SPUreadRegister(0x1f801d94);
  410. // H_Noise1
  411. SPUwriteRegister(0x1f801d94, 0x0000);
  412. // returns 0x0000
  413. temp = SPUreadRegister(0x1f801d96);
  414. // H_Noise2
  415. SPUwriteRegister(0x1f801d96, 0x0000);
  416. // returns 0x0000
  417. temp = SPUreadRegister(0x1f801d96);
  418. // returns 0x0000
  419. temp = SPUreadRegister(0x1f801d94);
  420. // returns 0x0000
  421. temp = SPUreadRegister(0x1f801d94);
  422. // H_Noise1
  423. SPUwriteRegister(0x1f801d94, 0x0000);
  424. // returns 0x0000
  425. temp = SPUreadRegister(0x1f801d96);
  426. // H_Noise2
  427. SPUwriteRegister(0x1f801d96, 0x0000);
  428. // returns 0x0000
  429. temp = SPUreadRegister(0x1f801d9a);
  430. // returns 0x0000
  431. temp = SPUreadRegister(0x1f801d98);
  432. // returns 0x0000
  433. temp = SPUreadRegister(0x1f801d98);
  434. // H_RVBon1
  435. SPUwriteRegister(0x1f801d98, 0x0000);
  436. // returns 0x0000
  437. temp = SPUreadRegister(0x1f801d9a);
  438. // H_RVBon2
  439. SPUwriteRegister(0x1f801d9a, 0x0000);
  440. // returns 0x0000
  441. temp = SPUreadRegister(0x1f801d9a);
  442. // returns 0x0000
  443. temp = SPUreadRegister(0x1f801d98);
  444. // returns 0x0000
  445. temp = SPUreadRegister(0x1f801d98);
  446. // H_RVBon1
  447. SPUwriteRegister(0x1f801d98, 0x0000);
  448. // returns 0x0000
  449. temp = SPUreadRegister(0x1f801d9a);
  450. // H_RVBon2
  451. SPUwriteRegister(0x1f801d9a, 0x0000);
  452. // returns 0x0000
  453. temp = SPUreadRegister(0x1f801d92);
  454. // returns 0x0000
  455. temp = SPUreadRegister(0x1f801d90);
  456. // returns 0x0000
  457. temp = SPUreadRegister(0x1f801d90);
  458. // H_FMod1
  459. SPUwriteRegister(0x1f801d90, 0x0000);
  460. // returns 0x0000
  461. temp = SPUreadRegister(0x1f801d92);
  462. // H_FMod2
  463. SPUwriteRegister(0x1f801d92, 0x0000);
  464. // returns 0x0000
  465. temp = SPUreadRegister(0x1f801d92);
  466. // returns 0x0000
  467. temp = SPUreadRegister(0x1f801d90);
  468. // returns 0x0000
  469. temp = SPUreadRegister(0x1f801d90);
  470. // H_FMod1
  471. SPUwriteRegister(0x1f801d90, 0x0000);
  472. // returns 0x0000
  473. temp = SPUreadRegister(0x1f801d92);
  474. // H_FMod2
  475. SPUwriteRegister(0x1f801d92, 0x0000);
  476. // H_SPUoff1
  477. SPUwriteRegister(0x1f801d8c, 0xffff);
  478. // H_SPUoff2
  479. SPUwriteRegister(0x1f801d8e, 0x00ff);
  480. }
  481. bool SoundManager::PsxWriteDMA(u16 arg_address, u8 *arg_data, u32 arg_length)
  482. {
  483. u16 temp;
  484. // write and verify destination address
  485. SPUwriteRegister(0x1f801da6, arg_address);
  486. if(SPUreadRegister(0x1f801da6) != arg_address)
  487. return false;
  488. // set and verify dma operation
  489. temp = SPUreadRegister(0x1f801daa);
  490. temp |= 32;
  491. SPUwriteRegister(0x1f801daa, temp);
  492. if(SPUreadRegister(0x1f801daa) != temp)
  493. return false;
  494. SPUwriteDMAMem((unsigned short *)arg_data, arg_length / 2);
  495. // clear and verify dma operation
  496. temp = SPUreadRegister(0x1f801daa);
  497. temp &= ~32;
  498. SPUwriteRegister(0x1f801daa, temp);
  499. if(SPUreadRegister(0x1f801daa) != temp)
  500. return false;
  501. return true;
  502. }
  503. SoundManager::~SoundManager()
  504. {
  505. // close SPU
  506. SPUclose();
  507. }
  508. void SoundManager::Update()
  509. {
  510. SPUasync(0xc000);
  511. }
  512. void
  513. SoundManager::PsxChannelPlay( u8 arg_channel )
  514. {
  515. if( arg_channel < 16 )
  516. {
  517. // H_SPUon1
  518. SPUwriteRegister( 0x1f801d88, 1 << arg_channel );
  519. }
  520. else if( arg_channel >= 16 && arg_channel < 24 )
  521. {
  522. // H_SPUon2
  523. SPUwriteRegister( 0x1f801d8a, 1 << ( arg_channel - 16 ) );
  524. }
  525. }
  526. void
  527. SoundManager::PsxChannelStop( u8 arg_channel )
  528. {
  529. if( arg_channel < 16 )
  530. {
  531. // H_SPUoff1
  532. SPUwriteRegister( 0x1f801d8c, 1 << arg_channel );
  533. }
  534. else if( arg_channel >= 16 && arg_channel < 24 )
  535. {
  536. // H_SPUoff2
  537. SPUwriteRegister( 0x1f801d8e, 1 << ( arg_channel - 16 ) );
  538. }
  539. }
  540. void
  541. SoundManager::PsxReverbOn( u8 arg_channel )
  542. {
  543. if( arg_channel < 16 )
  544. {
  545. // H_RVBon1
  546. SPUwriteRegister( 0x1f801d98, 1 << arg_channel );
  547. }
  548. else if( arg_channel >= 16 && arg_channel < 24 )
  549. {
  550. // H_RVBon2
  551. SPUwriteRegister( 0x1f801d9a, 1 << ( arg_channel - 16 ) );
  552. }
  553. }
  554. void
  555. SoundManager::PsxSetReverbDepth( u16 arg_left, u16 arg_right )
  556. {
  557. SPUwriteRegister( 0x1f801d84, arg_left );
  558. SPUwriteRegister( 0x1f801d86, arg_right );
  559. }
  560. void
  561. SoundManager::SetVoiceStartAddress( u8 arg_voice, u32 arg_address )
  562. {
  563. if( arg_voice < 0x18 )
  564. {
  565. // if address isn't divisible by 8, it's
  566. // increased to the next value divisible by 8
  567. if( arg_address % 8 )
  568. {
  569. arg_address += 8;
  570. arg_address &= ~7;
  571. }
  572. SPUwriteRegister( m_PSX_SPU_BASE + arg_voice * 0x10 + 0x06, ( u16 )( arg_address / 8 ) );
  573. }
  574. }
  575. void SoundManager::SetVoiceLoopAddress(u8 arg_voice, u32 arg_address)
  576. {
  577. if(arg_voice >= 0x18)
  578. {
  579. std::cout << "*** error: wrong channel!" << std::endl;
  580. return;
  581. }
  582. // if address isn't divisible by 8, it's
  583. // increased to the next value divisible by 8
  584. if(arg_address % 8)
  585. {
  586. arg_address += 8;
  587. arg_address &= ~7;
  588. }
  589. SPUwriteRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x0e, (u16)(arg_address / 8));
  590. }
  591. // +++
  592. void SoundManager::SetVoiceVolume(u8 arg_voice,
  593. s16 arg_volume_left, s16 arg_volume_right)
  594. {
  595. if(arg_voice >= 0x18)
  596. {
  597. std::cout << "*** error: wrong channel!" << std::endl;
  598. return;
  599. }
  600. SPUwriteRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x00,
  601. arg_volume_left & 0x7fff);
  602. SPUwriteRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x02,
  603. arg_volume_right & 0x7fff);
  604. }
  605. // +++
  606. void SoundManager::SetVoicePitch(u8 arg_voice, u16 arg_pitch)
  607. {
  608. if(arg_voice >= 0x18)
  609. {
  610. std::cout << "*** error: wrong channel!" << std::endl;
  611. return;
  612. }
  613. if(arg_pitch >= 0x4000)
  614. {
  615. std::cout << "*** error: wrong pitch!" << std::endl;
  616. return;
  617. }
  618. SPUwriteRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x04, arg_pitch);
  619. }
  620. // +++
  621. void SoundManager::SetVoiceAttackRate(u8 arg_voice,
  622. u16 arg_rate, SpuRateMode arg_mode)
  623. {
  624. if(arg_voice >= 0x18)
  625. {
  626. std::cout << "*** error: wrong channel!" << std::endl;
  627. return;
  628. }
  629. if(arg_rate >= 0x80)
  630. {
  631. std::cout << "*** error: wrong attack rate!" << std::endl;
  632. return;
  633. }
  634. u16 value = (arg_mode == SPU_VOICE_EXPIncN) ? (1 << 7) : 0;
  635. value |= arg_rate;
  636. value <<= 8;
  637. u16 temp = SPUreadRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x08) & 0xFF;
  638. temp |= value;
  639. SPUwriteRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x08, temp);
  640. }
  641. // +++
  642. void SoundManager::SetVoiceSustainRate(u8 arg_voice,
  643. u16 arg_rate, SpuRateMode arg_mode)
  644. {
  645. if(arg_voice >= 0x18)
  646. {
  647. std::cout << "*** error: wrong channel!" << std::endl;
  648. return;
  649. }
  650. if(arg_rate >= 0x80)
  651. {
  652. std::cout << "*** error: wrong sustain rate!" << std::endl;
  653. return;
  654. }
  655. u16 value;
  656. switch(arg_mode)
  657. {
  658. case SPU_VOICE_EXPIncN:
  659. value = 0x200;
  660. break;
  661. case SPU_VOICE_LINEARDecN:
  662. value = 0x100;
  663. break;
  664. case SPU_VOICE_EXPDec:
  665. value = 0x300;
  666. break;
  667. default:
  668. std::cout << "*** error: wrong sustain rate mode!" << std::endl;
  669. case SPU_VOICE_LINEARIncN:
  670. value = 0x000;
  671. break;
  672. }
  673. u16 temp = SPUreadRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x0a) & 0x3F;
  674. temp |= (arg_rate | value) << 6;
  675. SPUwriteRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x0a, temp);
  676. }
  677. // +++
  678. void SoundManager::SetVoiceReleaseRate(u8 arg_voice,
  679. u16 arg_rate, SpuRateMode arg_mode)
  680. {
  681. if(arg_voice >= 0x18)
  682. {
  683. std::cout << "*** error: wrong channel!" << std::endl;
  684. return;
  685. }
  686. if(arg_rate >= 0x20)
  687. {
  688. std::cout << "*** error: wrong release rate!" << std::endl;
  689. return;
  690. }
  691. u16 value = (arg_mode == SPU_VOICE_EXPDec) ? (1 << 5) : 0;
  692. value |= arg_rate;
  693. u16 temp = SPUreadRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x0a)
  694. & 0xFFC0;
  695. temp |= value;
  696. SPUwriteRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x0a, temp);
  697. }
  698. // +++
  699. void SoundManager::SetVoiceDecayRate(u8 arg_voice, u16 arg_rate)
  700. {
  701. if(arg_voice >= 0x18)
  702. {
  703. std::cout << "*** error: wrong channel!" << std::endl;
  704. return;
  705. }
  706. if(arg_rate >= 0x10)
  707. {
  708. std::cout << "*** error: wrong decay rate!" << std::endl;
  709. return;
  710. }
  711. u16 temp = SPUreadRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x08)
  712. & 0xFF0F;
  713. temp |= arg_rate << 4;
  714. SPUwriteRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x08, temp);
  715. }
  716. // +++
  717. void SoundManager::SetVoiceSustainLevel(u8 arg_voice, u16 arg_level)
  718. {
  719. if(arg_voice >= 0x18)
  720. {
  721. std::cout << "*** error: wrong channel!" << std::endl;
  722. return;
  723. }
  724. if(arg_level >= 0x10)
  725. {
  726. std::cout << "*** error: wrong sustain level!" << std::endl;
  727. return;
  728. }
  729. u16 temp = SPUreadRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x08)
  730. & 0xFFF0;
  731. temp |= arg_level;
  732. SPUwriteRegister(m_PSX_SPU_BASE + arg_voice * 0x10 + 0x08, temp);
  733. }
  734. void InitADSR()
  735. {
  736. unsigned long r = 3;
  737. unsigned long rs = 1;
  738. unsigned long rd = 0;
  739. int i;
  740. // build the rate table according to Neill's rules
  741. memset(RateTable, 0, sizeof(unsigned long) * 160);
  742. // we start at pos 32 with the real values... everything before is 0
  743. for(i = 32; i < 160; i++)
  744. {
  745. if(r < 0x3FFFFFFF)
  746. {
  747. r += rs;
  748. rd++;
  749. if(rd == 5)
  750. {
  751. rd = 1;
  752. rs *= 2;
  753. }
  754. }
  755. if(r > 0x3FFFFFFF)
  756. r = 0x3FFFFFFF;
  757. RateTable[i] = r;
  758. }
  759. }
  760. void StartADSR(int ch)
  761. {
  762. s_chan[ch].ADSRX.lVolume = 1;
  763. s_chan[ch].ADSRX.State = 0;
  764. s_chan[ch].ADSRX.EnvelopeVol = 0;
  765. }
  766. int MixADSR(int ch)
  767. {
  768. // channel stopped
  769. if(s_chan[ch].bStop)
  770. {
  771. // release
  772. if(s_chan[ch].ADSRX.ReleaseModeExp)
  773. {
  774. switch((s_chan[ch].ADSRX.EnvelopeVol >> 28) & 0x07)
  775. {
  776. case 0:
  777. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  778. (s_chan[ch].ADSRX.ReleaseRate^0x1F)) - 0x18 + 0 + 32];
  779. break;
  780. case 1:
  781. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  782. (s_chan[ch].ADSRX.ReleaseRate^0x1F)) - 0x18 + 4 + 32];
  783. break;
  784. case 2:
  785. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  786. (s_chan[ch].ADSRX.ReleaseRate^0x1F)) - 0x18 + 6 + 32];
  787. break;
  788. case 3:
  789. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  790. (s_chan[ch].ADSRX.ReleaseRate^0x1F)) - 0x18 + 8 + 32];
  791. break;
  792. case 4:
  793. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  794. (s_chan[ch].ADSRX.ReleaseRate^0x1F)) - 0x18 + 9 + 32];
  795. break;
  796. case 5:
  797. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  798. (s_chan[ch].ADSRX.ReleaseRate^0x1F)) - 0x18 + 10 + 32];
  799. break;
  800. case 6:
  801. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  802. (s_chan[ch].ADSRX.ReleaseRate^0x1F)) - 0x18 + 11 + 32];
  803. break;
  804. case 7:
  805. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  806. (s_chan[ch].ADSRX.ReleaseRate^0x1F)) - 0x18 + 12 + 32];
  807. break;
  808. }
  809. }
  810. else
  811. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  812. (s_chan[ch].ADSRX.ReleaseRate^0x1F)) - 0x0C + 32];
  813. if(s_chan[ch].ADSRX.EnvelopeVol < 0)
  814. {
  815. s_chan[ch].ADSRX.EnvelopeVol = 0;
  816. s_chan[ch].bOn = 0;
  817. }
  818. s_chan[ch].ADSRX.lVolume = s_chan[ch].ADSRX.EnvelopeVol >> 21;
  819. return s_chan[ch].ADSRX.lVolume;
  820. }
  821. // channel not stopped
  822. else
  823. {
  824. // attack
  825. if(s_chan[ch].ADSRX.State == 0)
  826. {
  827. if(s_chan[ch].ADSRX.AttackModeExp)
  828. {
  829. if(s_chan[ch].ADSRX.EnvelopeVol < 0x60000000)
  830. s_chan[ch].ADSRX.EnvelopeVol += RateTable[
  831. (s_chan[ch].ADSRX.AttackRate^0x7F) - 0x10 + 32];
  832. else
  833. s_chan[ch].ADSRX.EnvelopeVol += RateTable[
  834. (s_chan[ch].ADSRX.AttackRate^0x7F) - 0x18 + 32];
  835. }
  836. else
  837. s_chan[ch].ADSRX.EnvelopeVol += RateTable[
  838. (s_chan[ch].ADSRX.AttackRate^0x7F) - 0x10 + 32];
  839. if(s_chan[ch].ADSRX.EnvelopeVol < 0)
  840. {
  841. s_chan[ch].ADSRX.EnvelopeVol = 0x7FFFFFFF;
  842. s_chan[ch].ADSRX.State = 1;
  843. }
  844. s_chan[ch].ADSRX.lVolume = s_chan[ch].ADSRX.EnvelopeVol >> 21;
  845. return s_chan[ch].ADSRX.lVolume;
  846. }
  847. // decay
  848. if(s_chan[ch].ADSRX.State == 1)
  849. {
  850. switch((s_chan[ch].ADSRX.EnvelopeVol >> 28) & 0x07)
  851. {
  852. case 0:
  853. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  854. (s_chan[ch].ADSRX.DecayRate^0x1F)) - 0x18 + 0 + 32];
  855. break;
  856. case 1:
  857. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  858. (s_chan[ch].ADSRX.DecayRate^0x1F)) - 0x18 + 4 + 32];
  859. break;
  860. case 2:
  861. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  862. (s_chan[ch].ADSRX.DecayRate^0x1F)) - 0x18 + 6 + 32];
  863. break;
  864. case 3:
  865. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  866. (s_chan[ch].ADSRX.DecayRate^0x1F)) - 0x18 + 8 + 32];
  867. break;
  868. case 4:
  869. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  870. (s_chan[ch].ADSRX.DecayRate^0x1F)) - 0x18 + 9 + 32];
  871. break;
  872. case 5:
  873. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  874. (s_chan[ch].ADSRX.DecayRate^0x1F)) - 0x18 + 10 + 32];
  875. break;
  876. case 6:
  877. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  878. (s_chan[ch].ADSRX.DecayRate^0x1F)) - 0x18 + 11 + 32];
  879. break;
  880. case 7:
  881. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[(4 *
  882. (s_chan[ch].ADSRX.DecayRate^0x1F)) - 0x18 + 12 + 32];
  883. break;
  884. }
  885. if(s_chan[ch].ADSRX.EnvelopeVol < 0)
  886. s_chan[ch].ADSRX.EnvelopeVol = 0;
  887. if(((s_chan[ch].ADSRX.EnvelopeVol >> 27) & 0xF) <=
  888. s_chan[ch].ADSRX.SustainLevel)
  889. s_chan[ch].ADSRX.State = 2;
  890. s_chan[ch].ADSRX.lVolume = s_chan[ch].ADSRX.EnvelopeVol >> 21;
  891. return s_chan[ch].ADSRX.lVolume;
  892. }
  893. // sustain
  894. if(s_chan[ch].ADSRX.State == 2)
  895. {
  896. if(s_chan[ch].ADSRX.SustainIncrease)
  897. {
  898. if(s_chan[ch].ADSRX.SustainModeExp)
  899. {
  900. if(s_chan[ch].ADSRX.EnvelopeVol < 0x60000000)
  901. s_chan[ch].ADSRX.EnvelopeVol += RateTable[
  902. (s_chan[ch].ADSRX.SustainRate^0x7F) - 0x10 + 32];
  903. else
  904. s_chan[ch].ADSRX.EnvelopeVol += RateTable[
  905. (s_chan[ch].ADSRX.SustainRate^0x7F) - 0x18 + 32];
  906. }
  907. else
  908. s_chan[ch].ADSRX.EnvelopeVol += RateTable[
  909. (s_chan[ch].ADSRX.SustainRate^0x7F) - 0x10 + 32];
  910. if(s_chan[ch].ADSRX.EnvelopeVol < 0)
  911. s_chan[ch].ADSRX.EnvelopeVol = 0x7FFFFFFF;
  912. }
  913. else
  914. {
  915. if(s_chan[ch].ADSRX.SustainModeExp)
  916. {
  917. switch((s_chan[ch].ADSRX.EnvelopeVol >> 28) & 0x7)
  918. {
  919. case 0:
  920. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[
  921. ((s_chan[ch].ADSRX.SustainRate^0x7F))
  922. - 0x1B + 0 + 32];
  923. break;
  924. case 1:
  925. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[
  926. ((s_chan[ch].ADSRX.SustainRate^0x7F))
  927. - 0x1B + 4 + 32];
  928. break;
  929. case 2:
  930. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[
  931. ((s_chan[ch].ADSRX.SustainRate^0x7F))
  932. - 0x1B + 6 + 32];
  933. break;
  934. case 3:
  935. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[
  936. ((s_chan[ch].ADSRX.SustainRate^0x7F))
  937. - 0x1B + 8 + 32];
  938. break;
  939. case 4:
  940. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[
  941. ((s_chan[ch].ADSRX.SustainRate^0x7F))
  942. - 0x1B + 9 + 32];
  943. break;
  944. case 5:
  945. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[
  946. ((s_chan[ch].ADSRX.SustainRate^0x7F))
  947. - 0x1B + 10 + 32];
  948. break;
  949. case 6:
  950. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[
  951. ((s_chan[ch].ADSRX.SustainRate^0x7F))
  952. - 0x1B + 11 + 32];
  953. break;
  954. case 7:
  955. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[
  956. ((s_chan[ch].ADSRX.SustainRate^0x7F))
  957. - 0x1B + 12 + 32];
  958. break;
  959. }
  960. }
  961. else
  962. s_chan[ch].ADSRX.EnvelopeVol -= RateTable[
  963. ((s_chan[ch].ADSRX.SustainRate^0x7F)) - 0x0F + 32];
  964. if(s_chan[ch].ADSRX.EnvelopeVol < 0)
  965. s_chan[ch].ADSRX.EnvelopeVol = 0;
  966. }
  967. s_chan[ch].ADSRX.lVolume = s_chan[ch].ADSRX.EnvelopeVol >> 21;
  968. return s_chan[ch].ADSRX.lVolume;
  969. }
  970. }
  971. return 0;
  972. }
  973. unsigned short SPUreadDMA()
  974. {
  975. #ifdef DEBUG_OUTPUT
  976. std::cout << "SPUreadDMA()" << std::endl;
  977. #endif
  978. unsigned short s = spuMem[spuAddr >> 1];
  979. spuAddr += 2;
  980. if(spuAddr > 0x7ffff)
  981. spuAddr = 0;
  982. iWatchDog = 0;
  983. return s;
  984. }
  985. void SPUreadDMAMem(unsigned short *pusPSXMem, int iSize)
  986. {
  987. #ifdef DEBUG_OUTPUT
  988. std::cout << "SPUreadDMAMem()" << std::endl;
  989. #endif
  990. int i;
  991. for(i = 0; i < iSize; i++)
  992. {
  993. // spu addr got by writeregister
  994. *pusPSXMem++ = spuMem[spuAddr >> 1];
  995. // inc spu addr
  996. spuAddr += 2;
  997. // wrap
  998. if(spuAddr > 0x7ffff)
  999. spuAddr = 0;
  1000. }
  1001. iWatchDog = 0;
  1002. }
  1003. // to investigate: do sound data updates by writedma affect spu
  1004. // irqs? Will an irq be triggered, if new data is written to
  1005. // the memory irq address?
  1006. void SPUwriteDMA(unsigned short val)
  1007. {
  1008. #ifdef DEBUG_OUTPUT
  1009. std::cout << "SPUwriteDMA()" << std::endl;
  1010. #endif
  1011. // spu addr got by writeregister
  1012. spuMem[spuAddr >> 1] = val;
  1013. // inc spu addr
  1014. spuAddr += 2;
  1015. // wrap
  1016. if(spuAddr > 0x7ffff)
  1017. spuAddr = 0;
  1018. iWatchDog = 0;
  1019. }
  1020. void SPUwriteDMAMem(unsigned short *pusPSXMem, int iSize)
  1021. {
  1022. int i;
  1023. for ( i = 0; i < iSize; i++ )
  1024. {
  1025. // spu addr got by writeregister
  1026. spuMem[spuAddr >> 1] = *pusPSXMem++;
  1027. // inc spu addr
  1028. spuAddr += 2;
  1029. // wrap
  1030. if(spuAddr > 0x7ffff)
  1031. {
  1032. spuAddr = 0;
  1033. }
  1034. }
  1035. iWatchDog = 0;
  1036. }
  1037. const int gauss[] =
  1038. {
  1039. 0x172, 0x519, 0x176, 0x000, 0x16E, 0x519, 0x17A, 0x000,
  1040. 0x16A, 0x518, 0x17D, 0x000, 0x166, 0x518, 0x181, 0x000,
  1041. 0x162, 0x518, 0x185, 0x000, 0x15F, 0x518, 0x189, 0x000,
  1042. 0x15B, 0x518, 0x18D, 0x000, 0x157, 0x517, 0x191, 0x000,
  1043. 0x153, 0x517, 0x195, 0x000, 0x150, 0x517, 0x19A, 0x000,
  1044. 0x14C, 0x516, 0x19E, 0x000, 0x148, 0x516, 0x1A2, 0x000,
  1045. 0x145, 0x515, 0x1A6, 0x000, 0x141, 0x514, 0x1AA, 0x000,
  1046. 0x13E, 0x514, 0x1AE, 0x000, 0x13A, 0x513, 0x1B2, 0x000,
  1047. 0x137, 0x512, 0x1B7, 0x001, 0x133, 0x511, 0x1BB, 0x001,
  1048. 0x130, 0x511, 0x1BF, 0x001, 0x12C, 0x510, 0x1C3, 0x001,
  1049. 0x129, 0x50F, 0x1C8, 0x001, 0x125, 0x50E, 0x1CC, 0x001,
  1050. 0x122, 0x50D, 0x1D0, 0x001, 0x11E, 0x50C, 0x1D5, 0x001,
  1051. 0x11B, 0x50B, 0x1D9, 0x001, 0x118, 0x50A, 0x1DD, 0x001,
  1052. 0x114, 0x508, 0x1E2, 0x001, 0x111, 0x507, 0x1E6, 0x002,
  1053. 0x10E, 0x506, 0x1EB, 0x002, 0x10B, 0x504, 0x1EF, 0x002,
  1054. 0x107, 0x503, 0x1F3, 0x002, 0x104, 0x502, 0x1F8, 0x002,
  1055. 0x101, 0x500, 0x1FC, 0x002, 0x0FE, 0x4FF, 0x201, 0x002,
  1056. 0x0FB, 0x4FD, 0x205, 0x003, 0x0F8, 0x4FB, 0x20A, 0x003,
  1057. 0x0F5, 0x4FA, 0x20F, 0x003, 0x0F2, 0x4F8, 0x213, 0x003,
  1058. 0x0EF, 0x4F6, 0x218, 0x003, 0x0EC, 0x4F5, 0x21C, 0x004,
  1059. 0x0E9, 0x4F3, 0x221, 0x004, 0x0E6, 0x4F1, 0x226, 0x004,
  1060. 0x0E3, 0x4EF, 0x22A, 0x004, 0x0E0, 0x4ED, 0x22F, 0x004,
  1061. 0x0DD, 0x4EB, 0x233, 0x005, 0x0DA, 0x4E9, 0x238, 0x005,
  1062. 0x0D7, 0x4E7, 0x23D, 0x005, 0x0D4, 0x4E5, 0x241, 0x005,
  1063. 0x0D2, 0x4E3, 0x246, 0x006, 0x0CF, 0x4E0, 0x24B, 0x006,
  1064. 0x0CC, 0x4DE, 0x250, 0x006, 0x0C9, 0x4DC, 0x254, 0x006,
  1065. 0x0C7, 0x4D9, 0x259, 0x007, 0x0C4, 0x4D7, 0x25E, 0x007,
  1066. 0x0C1, 0x4D5, 0x263, 0x007, 0x0BF, 0x4D2, 0x267, 0x008,
  1067. 0x0BC, 0x4D0, 0x26C, 0x008, 0x0BA, 0x4CD, 0x271, 0x008,
  1068. 0x0B7, 0x4CB, 0x276, 0x009, 0x0B4, 0x4C8, 0x27B, 0x009,
  1069. 0x0B2, 0x4C5, 0x280, 0x009, 0x0AF, 0x4C3, 0x284, 0x00A,
  1070. 0x0AD, 0x4C0, 0x289, 0x00A, 0x0AB, 0x4BD, 0x28E, 0x00A,
  1071. 0x0A8, 0x4BA, 0x293, 0x00B, 0x0A6, 0x4B7, 0x298, 0x00B,
  1072. 0x0A3, 0x4B5, 0x29D, 0x00B, 0x0A1, 0x4B2, 0x2A2, 0x00C,
  1073. 0x09F, 0x4AF, 0x2A6, 0x00C, 0x09C, 0x4AC, 0x2AB, 0x00D,
  1074. 0x09A, 0x4A9, 0x2B0, 0x00D, 0x098, 0x4A6, 0x2B5, 0x00E,
  1075. 0x096, 0x4A2, 0x2BA, 0x00E, 0x093, 0x49F, 0x2BF, 0x00F,
  1076. 0x091, 0x49C, 0x2C4, 0x00F, 0x08F, 0x499, 0x2C9, 0x00F,
  1077. 0x08D, 0x496, 0x2CE, 0x010, 0x08B, 0x492, 0x2D3, 0x010,
  1078. 0x089, 0x48F, 0x2D8, 0x011, 0x086, 0x48C, 0x2DC, 0x011,
  1079. 0x084, 0x488, 0x2E1, 0x012, 0x082, 0x485, 0x2E6, 0x013,
  1080. 0x080, 0x481, 0x2EB, 0x013, 0x07E, 0x47E, 0x2F0, 0x014,
  1081. 0x07C, 0x47A, 0x2F5, 0x014, 0x07A, 0x477, 0x2FA, 0x015,
  1082. 0x078, 0x473, 0x2FF, 0x015, 0x076, 0x470, 0x304, 0x016,
  1083. 0x075, 0x46C, 0x309, 0x017, 0x073, 0x468, 0x30E, 0x017,
  1084. 0x071, 0x465, 0x313, 0x018, 0x06F, 0x461, 0x318, 0x018,
  1085. 0x06D, 0x45D, 0x31D, 0x019, 0x06B, 0x459, 0x322, 0x01A,
  1086. 0x06A, 0x455, 0x326, 0x01B, 0x068, 0x452, 0x32B, 0x01B,
  1087. 0x066, 0x44E, 0x330, 0x01C, 0x064, 0x44A, 0x335, 0x01D,
  1088. 0x063, 0x446, 0x33A, 0x01D, 0x061, 0x442, 0x33F, 0x01E,
  1089. 0x05F, 0x43E, 0x344, 0x01F, 0x05E, 0x43A, 0x349, 0x020,
  1090. 0x05C, 0x436, 0x34E, 0x020, 0x05A, 0x432, 0x353, 0x021,
  1091. 0x059, 0x42E, 0x357, 0x022, 0x057, 0x42A, 0x35C, 0x023,
  1092. 0x056, 0x425, 0x361, 0x024, 0x054, 0x421, 0x366, 0x024,
  1093. 0x053, 0x41D, 0x36B, 0x025, 0x051, 0x419, 0x370, 0x026,
  1094. 0x050, 0x415, 0x374, 0x027, 0x04E, 0x410, 0x379, 0x028,
  1095. 0x04D, 0x40C, 0x37E, 0x029, 0x04C, 0x408, 0x383, 0x02A,
  1096. 0x04A, 0x403, 0x388, 0x02B, 0x049, 0x3FF, 0x38C, 0x02C,
  1097. 0x047, 0x3FB, 0x391, 0x02D, 0x046, 0x3F6, 0x396, 0x02E,
  1098. 0x045, 0x3F2, 0x39B, 0x02F, 0x043, 0x3ED, 0x39F, 0x030,
  1099. 0x042, 0x3E9, 0x3A4, 0x031, 0x041, 0x3E5, 0x3A9, 0x032,
  1100. 0x040, 0x3E0, 0x3AD, 0x033, 0x03E, 0x3DC, 0x3B2, 0x034,
  1101. 0x03D, 0x3D7, 0x3B7, 0x035, 0x03C, 0x3D2, 0x3BB, 0x036,
  1102. 0x03B, 0x3CE, 0x3C0, 0x037, 0x03A, 0x3C9, 0x3C5, 0x038,
  1103. 0x038, 0x3C5, 0x3C9, 0x03A, 0x037, 0x3C0, 0x3CE, 0x03B,
  1104. 0x036, 0x3BB, 0x3D2, 0x03C, 0x035, 0x3B7, 0x3D7, 0x03D,
  1105. 0x034, 0x3B2, 0x3DC, 0x03E, 0x033, 0x3AD, 0x3E0, 0x040,
  1106. 0x032, 0x3A9, 0x3E5, 0x041, 0x031, 0x3A4, 0x3E9, 0x042,
  1107. 0x030, 0x39F, 0x3ED, 0x043, 0x02F, 0x39B, 0x3F2, 0x045,
  1108. 0x02E, 0x396, 0x3F6, 0x046, 0x02D, 0x391, 0x3FB, 0x047,
  1109. 0x02C, 0x38C, 0x3FF, 0x049, 0x02B, 0x388, 0x403, 0x04A,
  1110. 0x02A, 0x383, 0x408, 0x04C, 0x029, 0x37E, 0x40C, 0x04D,
  1111. 0x028, 0x379, 0x410, 0x04E, 0x027, 0x374, 0x415, 0x050,
  1112. 0x026, 0x370, 0x419, 0x051, 0x025, 0x36B, 0x41D, 0x053,
  1113. 0x024, 0x366, 0x421, 0x054, 0x024, 0x361, 0x425, 0x056,
  1114. 0x023, 0x35C, 0x42A, 0x057, 0x022, 0x357, 0x42E, 0x059,
  1115. 0x021, 0x353, 0x432, 0x05A, 0x020, 0x34E, 0x436, 0x05C,
  1116. 0x020, 0x349, 0x43A, 0x05E, 0x01F, 0x344, 0x43E, 0x05F,
  1117. 0x01E, 0x33F, 0x442, 0x061, 0x01D, 0x33A, 0x446, 0x063,
  1118. 0x01D, 0x335, 0x44A, 0x064, 0x01C, 0x330, 0x44E, 0x066,
  1119. 0x01B, 0x32B, 0x452, 0x068, 0x01B, 0x326, 0x455, 0x06A,
  1120. 0x01A, 0x322, 0x459, 0x06B, 0x019, 0x31D, 0x45D, 0x06D,
  1121. 0x018, 0x318, 0x461, 0x06F, 0x018, 0x313, 0x465, 0x071,
  1122. 0x017, 0x30E, 0x468, 0x073, 0x017, 0x309, 0x46C, 0x075,
  1123. 0x016, 0x304, 0x470, 0x076, 0x015, 0x2FF, 0x473, 0x078,
  1124. 0x015, 0x2FA, 0x477, 0x07A, 0x014, 0x2F5, 0x47A, 0x07C,
  1125. 0x014, 0x2F0, 0x47E, 0x07E, 0x013, 0x2EB, 0x481, 0x080,
  1126. 0x013, 0x2E6, 0x485, 0x082, 0x012, 0x2E1, 0x488, 0x084,
  1127. 0x011, 0x2DC, 0x48C, 0x086, 0x011, 0x2D8, 0x48F, 0x089,
  1128. 0x010, 0x2D3, 0x492, 0x08B, 0x010, 0x2CE, 0x496, 0x08D,
  1129. 0x00F, 0x2C9, 0x499, 0x08F, 0x00F, 0x2C4, 0x49C, 0x091,
  1130. 0x00F, 0x2BF, 0x49F, 0x093, 0x00E, 0x2BA, 0x4A2, 0x096,
  1131. 0x00E, 0x2B5, 0x4A6, 0x098, 0x00D, 0x2B0, 0x4A9, 0x09A,
  1132. 0x00D, 0x2AB, 0x4AC, 0x09C, 0x00C, 0x2A6, 0x4AF, 0x09F,
  1133. 0x00C, 0x2A2, 0x4B2, 0x0A1, 0x00B, 0x29D, 0x4B5, 0x0A3,
  1134. 0x00B, 0x298, 0x4B7, 0x0A6, 0x00B, 0x293, 0x4BA, 0x0A8,
  1135. 0x00A, 0x28E, 0x4BD, 0x0AB, 0x00A, 0x289, 0x4C0, 0x0AD,
  1136. 0x00A, 0x284, 0x4C3, 0x0AF, 0x009, 0x280, 0x4C5, 0x0B2,
  1137. 0x009, 0x27B, 0x4C8, 0x0B4, 0x009, 0x276, 0x4CB, 0x0B7,
  1138. 0x008, 0x271, 0x4CD, 0x0BA, 0x008, 0x26C, 0x4D0, 0x0BC,
  1139. 0x008, 0x267, 0x4D2, 0x0BF, 0x007, 0x263, 0x4D5, 0x0C1,
  1140. 0x007, 0x25E, 0x4D7, 0x0C4, 0x007, 0x259, 0x4D9, 0x0C7,
  1141. 0x006, 0x254, 0x4DC, 0x0C9, 0x006, 0x250, 0x4DE, 0x0CC,
  1142. 0x006, 0x24B, 0x4E0, 0x0CF, 0x006, 0x246, 0x4E3, 0x0D2,
  1143. 0x005, 0x241, 0x4E5, 0x0D4, 0x005, 0x23D, 0x4E7, 0x0D7,
  1144. 0x005, 0x238, 0x4E9, 0x0DA, 0x005, 0x233, 0x4EB, 0x0DD,
  1145. 0x004, 0x22F, 0x4ED, 0x0E0, 0x004, 0x22A, 0x4EF, 0x0E3,
  1146. 0x004, 0x226, 0x4F1, 0x0E6, 0x004, 0x221, 0x4F3, 0x0E9,
  1147. 0x004, 0x21C, 0x4F5, 0x0EC, 0x003, 0x218, 0x4F6, 0x0EF,
  1148. 0x003, 0x213, 0x4F8, 0x0F2, 0x003, 0x20F, 0x4FA, 0x0F5,
  1149. 0x003, 0x20A, 0x4FB, 0x0F8, 0x003, 0x205, 0x4FD, 0x0FB,
  1150. 0x002, 0x201, 0x4FF, 0x0FE, 0x002, 0x1FC, 0x500, 0x101,
  1151. 0x002, 0x1F8, 0x502, 0x104, 0x002, 0x1F3, 0x503, 0x107,
  1152. 0x002, 0x1EF, 0x504, 0x10B, 0x002, 0x1EB, 0x506, 0x10E,
  1153. 0x002, 0x1E6, 0x507, 0x111, 0x001, 0x1E2, 0x508, 0x114,
  1154. 0x001, 0x1DD, 0x50A, 0x118, 0x001, 0x1D9, 0x50B, 0x11B,
  1155. 0x001, 0x1D5, 0x50C, 0x11E, 0x001, 0x1D0, 0x50D, 0x122,
  1156. 0x001, 0x1CC, 0x50E, 0x125, 0x001, 0x1C8, 0x50F, 0x129,
  1157. 0x001, 0x1C3, 0x510, 0x12C, 0x001, 0x1BF, 0x511, 0x130,
  1158. 0x001, 0x1BB, 0x511, 0x133, 0x001, 0x1B7, 0x512, 0x137,
  1159. 0x000, 0x1B2, 0x513, 0x13A, 0x000, 0x1AE, 0x514, 0x13E,
  1160. 0x000, 0x1AA, 0x514, 0x141, 0x000, 0x1A6, 0x515, 0x145,
  1161. 0x000, 0x1A2, 0x516, 0x148, 0x000, 0x19E, 0x516, 0x14C,
  1162. 0x000, 0x19A, 0x517, 0x150, 0x000, 0x195, 0x517, 0x153,
  1163. 0x000, 0x191, 0x517, 0x157, 0x000, 0x18D, 0x518, 0x15B,
  1164. 0x000, 0x189, 0x518, 0x15F, 0x000, 0x185, 0x518, 0x162,
  1165. 0x000, 0x181, 0x518, 0x166, 0x000, 0x17D, 0x518, 0x16A,
  1166. 0x000, 0x17A, 0x519, 0x16E, 0x000, 0x176, 0x519, 0x172
  1167. };
  1168. void SPUwriteRegister(unsigned long reg, unsigned short val)
  1169. {
  1170. #ifdef DEBUG_OUTPUT
  1171. std::cout << setfill('0');
  1172. std::cout << "*** SPUwriteRegister() " << "[address 0x"
  1173. << hex << setw(8) << reg << "] ";
  1174. #endif
  1175. const unsigned long r = reg & 0xfff;
  1176. regArea[(r - 0xc00) >> 1] = val;
  1177. // some channel info?
  1178. if(r >= 0x0c00 && r < 0x0d80)
  1179. {
  1180. // calc channel
  1181. int ch = (r >> 4) - 0xc0;
  1182. switch(r & 0x0f)
  1183. {
  1184. // l volume
  1185. case 0:
  1186. #ifdef DEBUG_OUTPUT
  1187. std::cout << "Left Volume - ";
  1188. #endif
  1189. SetVolumeL((unsigned char)ch, val);
  1190. break;
  1191. // r volume
  1192. case 2:
  1193. #ifdef DEBUG_OUTPUT
  1194. std::cout << "Right Volume - ";
  1195. #endif
  1196. SetVolumeR((unsigned char)ch, val);
  1197. break;
  1198. // pitch
  1199. case 4:
  1200. #ifdef DEBUG_OUTPUT
  1201. std::cout << "Pitch - ";
  1202. #endif
  1203. SetPitch(ch, val);
  1204. break;
  1205. // start
  1206. case 6:
  1207. #ifdef DEBUG_OUTPUT
  1208. std::cout << "Start Address - ";
  1209. #endif
  1210. s_chan[ch].pStart = spuMemC + ((unsigned long)val << 3);
  1211. break;
  1212. // level with pre-calcs
  1213. case 8:
  1214. #ifdef DEBUG_OUTPUT
  1215. std::cout << "Level with Pre-Calcs - ";
  1216. #endif
  1217. {
  1218. const unsigned long lval = val;
  1219. s_chan[ch].ADSRX.AttackModeExp=(lval&0x8000)?1:0;
  1220. s_chan[ch].ADSRX.AttackRate=(lval>>8) & 0x007f;
  1221. s_chan[ch].ADSRX.DecayRate=(lval>>4) & 0x000f;
  1222. s_chan[ch].ADSRX.SustainLevel=lval & 0x000f;
  1223. }
  1224. break;
  1225. // adsr times with pre-calcs
  1226. case 10:
  1227. #ifdef DEBUG_OUTPUT
  1228. std::cout << "ADSR Times with Pre-Calcs - ";
  1229. #endif
  1230. {
  1231. const unsigned long lval = val;
  1232. s_chan[ch].ADSRX.SustainModeExp = (lval & 0x8000) ? 1 : 0;
  1233. s_chan[ch].ADSRX.SustainIncrease = (lval & 0x4000) ? 0 : 1;
  1234. s_chan[ch].ADSRX.SustainRate = (lval >> 6) & 0x007f;
  1235. s_chan[ch].ADSRX.ReleaseModeExp = (lval & 0x0020) ? 1 : 0;
  1236. s_chan[ch].ADSRX.ReleaseRate = lval & 0x001f;
  1237. }
  1238. break;
  1239. // adsr volume... mmm have to investigate this
  1240. case 12:
  1241. #ifdef DEBUG_OUTPUT
  1242. std::cout << "ADSR Volume - ";
  1243. #endif
  1244. break;
  1245. // loop
  1246. case 14:
  1247. #ifdef DEBUG_OUTPUT
  1248. std::cout << "Loop Address - ";
  1249. #endif
  1250. s_chan[ch].pLoop = spuMemC + ((unsigned long)val << 3);
  1251. s_chan[ch].bIgnoreLoop = 1;
  1252. break;
  1253. }
  1254. iWatchDog = 0;
  1255. #ifdef DEBUG_OUTPUT
  1256. std::cout << "0x" << hex << setw(4) << val << std::endl;
  1257. #endif
  1258. return;
  1259. }
  1260. switch(r)
  1261. {
  1262. case H_SPUaddr:
  1263. #ifdef DEBUG_OUTPUT
  1264. std::cout << "H_SPUaddr - ";
  1265. #endif
  1266. spuAddr = (unsigned long)val << 3;
  1267. break;
  1268. case H_SPUdata:
  1269. #ifdef DEBUG_OUTPUT
  1270. std::cout << "H_SPUdata - ";
  1271. #endif
  1272. spuMem[spuAddr >> 1] = val;
  1273. spuAddr += 2;
  1274. if(spuAddr > 0x7ffff)
  1275. spuAddr = 0;
  1276. break;
  1277. case H_SPUctrl:
  1278. #ifdef DEBUG_OUTPUT
  1279. std::cout << "H_SPUctrl - ";
  1280. #endif
  1281. spuCtrl = val;
  1282. break;
  1283. case H_SPUstat:
  1284. #ifdef DEBUG_OUTPUT
  1285. std::cout << "H_SPUstat - ";
  1286. #endif
  1287. spuStat = val & 0xf800;
  1288. break;
  1289. case H_SPUReverbAddr:
  1290. #ifdef DEBUG_OUTPUT
  1291. std::cout << "H_SPUReverbAddr - ";
  1292. #endif
  1293. if(val == 0xFFFF || val <= 0x200)
  1294. rvb.StartAddr = rvb.CurrAddr = 0;
  1295. else
  1296. {
  1297. const long iv = (unsigned long)val << 2;
  1298. if(rvb.StartAddr != iv)
  1299. {
  1300. rvb.StartAddr = (unsigned long)val << 2;
  1301. rvb.CurrAddr = rvb.StartAddr;
  1302. }
  1303. }
  1304. break;
  1305. case H_SPUirqAddr:
  1306. #ifdef DEBUG_OUTPUT
  1307. std::cout << "H_SPUirqAddr - ";
  1308. #endif
  1309. spuIrq = val;
  1310. pSpuIrq = spuMemC + ((unsigned long) val << 3);
  1311. break;
  1312. case H_SPUrvolL:
  1313. #ifdef DEBUG_OUTPUT
  1314. std::cout << "H_SPUrvolL - ";
  1315. #endif
  1316. rvb.VolLeft = val;
  1317. break;
  1318. case H_SPUrvolR:
  1319. #ifdef DEBUG_OUTPUT
  1320. std::cout << "H_SPUrvolR - ";
  1321. #endif
  1322. rvb.VolRight = val;
  1323. break;
  1324. case H_SPUon1:
  1325. #ifdef DEBUG_OUTPUT
  1326. std::cout << "H_SPUon1 - ";
  1327. #endif
  1328. SoundOn(0, 16, val);
  1329. break;
  1330. case H_SPUon2:
  1331. #ifdef DEBUG_OUTPUT
  1332. std::cout << "H_SPUon2 - ";
  1333. #endif
  1334. SoundOn(16, 24, val);
  1335. break;
  1336. case H_SPUoff1:
  1337. #ifdef DEBUG_OUTPUT
  1338. std::cout << "H_SPUoff1 - ";
  1339. #endif
  1340. SoundOff(0, 16, val);
  1341. break;
  1342. case H_SPUoff2:
  1343. #ifdef DEBUG_OUTPUT
  1344. std::cout << "H_SPUoff2 - ";
  1345. #endif
  1346. SoundOff(16, 24, val);
  1347. break;
  1348. case H_CDLeft:
  1349. #ifdef DEBUG_OUTPUT
  1350. std::cout << "H_CDLeft - ";
  1351. #endif
  1352. iLeftXAVol = val & 0x7fff;
  1353. if(cddavCallback)
  1354. cddavCallback(0, val);
  1355. break;
  1356. case H_CDRight:
  1357. #ifdef DEBUG_OUTPUT
  1358. std::cout << "H_CDRight - ";
  1359. #endif
  1360. iRightXAVol = val & 0x7fff;
  1361. if(cddavCallback)
  1362. cddavCallback(1, val);
  1363. break;
  1364. case H_FMod1:
  1365. #ifdef DEBUG_OUTPUT
  1366. std::cout << "H_FMod1 - ";
  1367. #endif
  1368. FModOn(0, 16, val);
  1369. break;
  1370. case H_FMod2:
  1371. #ifdef DEBUG_OUTPUT
  1372. std::cout << "H_FMod2 - ";
  1373. #endif
  1374. FModOn(16, 24, val);
  1375. break;
  1376. case H_Noise1:
  1377. #ifdef DEBUG_OUTPUT
  1378. std::cout << "H_Noise1 - ";
  1379. #endif
  1380. NoiseOn(0, 16, val);
  1381. break;
  1382. case H_Noise2:
  1383. #ifdef DEBUG_OUTPUT
  1384. std::cout << "H_Noise2 - ";
  1385. #endif
  1386. NoiseOn(16, 24, val);
  1387. break;
  1388. case H_RVBon1:
  1389. #ifdef DEBUG_OUTPUT
  1390. std::cout << "H_RVBon1 - ";
  1391. #endif
  1392. ReverbOn(0, 16, val);
  1393. break;
  1394. case H_RVBon2:
  1395. #ifdef DEBUG_OUTPUT
  1396. std::cout << "H_RVBon2 - ";
  1397. #endif
  1398. ReverbOn(16, 24, val);
  1399. break;
  1400. case H_Reverb + 0:
  1401. #ifdef DEBUG_OUTPUT
  1402. std::cout << "H_Reverb - ";
  1403. #endif
  1404. rvb.FB_SRC_A = val;
  1405. // OK, here's the fake REVERB stuff...
  1406. // depending on effect we do more or less delay and repeats... bah
  1407. // still... better than nothing :)
  1408. SetREVERB(val);
  1409. break;
  1410. case H_Reverb+2 : rvb.FB_SRC_B=(short)val; break;
  1411. case H_Reverb+4 : rvb.IIR_ALPHA=(short)val; break;
  1412. case H_Reverb+6 : rvb.ACC_COEF_A=(short)val; break;
  1413. case H_Reverb+8 : rvb.ACC_COEF_B=(short)val; break;
  1414. case H_Reverb+10 : rvb.ACC_COEF_C=(short)val; break;
  1415. case H_Reverb+12 : rvb.ACC_COEF_D=(short)val; break;
  1416. case H_Reverb+14 : rvb.IIR_COEF=(short)val; break;
  1417. case H_Reverb+16 : rvb.FB_ALPHA=(short)val; break;
  1418. case H_Reverb+18 : rvb.FB_X=(short)val; break;
  1419. case H_Reverb+20 : rvb.IIR_DEST_A0=(short)val; break;
  1420. case H_Reverb+22 : rvb.IIR_DEST_A1=(short)val; break;
  1421. case H_Reverb+24 : rvb.ACC_SRC_A0=(short)val; break;
  1422. case H_Reverb+26 : rvb.ACC_SRC_A1=(short)val; break;
  1423. case H_Reverb+28 : rvb.ACC_SRC_B0=(short)val; break;
  1424. case H_Reverb+30 : rvb.ACC_SRC_B1=(short)val; break;
  1425. case H_Reverb+32 : rvb.IIR_SRC_A0=(short)val; break;
  1426. case H_Reverb+34 : rvb.IIR_SRC_A1=(short)val; break;
  1427. case H_Reverb+36 : rvb.IIR_DEST_B0=(short)val; break;
  1428. case H_Reverb+38 : rvb.IIR_DEST_B1=(short)val; break;
  1429. case H_Reverb+40 : rvb.ACC_SRC_C0=(short)val; break;
  1430. case H_Reverb+42 : rvb.ACC_SRC_C1=(short)val; break;
  1431. case H_Reverb+44 : rvb.ACC_SRC_D0=(short)val; break;
  1432. case H_Reverb+46 : rvb.ACC_SRC_D1=(short)val; break;
  1433. case H_Reverb+48 : rvb.IIR_SRC_B1=(short)val; break;
  1434. case H_Reverb+50 : rvb.IIR_SRC_B0=(short)val; break;
  1435. case H_Reverb+52 : rvb.MIX_DEST_A0=(short)val; break;
  1436. case H_Reverb+54 : rvb.MIX_DEST_A1=(short)val; break;
  1437. case H_Reverb+56 : rvb.MIX_DEST_B0=(short)val; break;
  1438. case H_Reverb+58 : rvb.MIX_DEST_B1=(short)val; break;
  1439. case H_Reverb+60 : rvb.IN_COEF_L=(short)val; break;
  1440. case H_Reverb+62 : rvb.IN_COEF_R=(short)val; break;
  1441. }
  1442. iWatchDog = 0;
  1443. #ifdef DEBUG_OUTPUT
  1444. std::cout << "0x" << hex << setw(4) << val << std::endl;
  1445. #endif
  1446. }
  1447. unsigned short SPUreadRegister(unsigned long reg)
  1448. {
  1449. #ifdef DEBUG_OUTPUT
  1450. std::cout << setfill('0');
  1451. std::cout << "*** SPUreadRegister(0x" << hex << setw(8) << reg << "), returned ";
  1452. #endif
  1453. const unsigned long r = reg & 0xfff;
  1454. iWatchDog = 0;
  1455. if(r >= 0x0c00 && r < 0x0d80)
  1456. {
  1457. switch(r & 0x0f)
  1458. {
  1459. // get adsr vol
  1460. case 12:
  1461. {
  1462. const int ch = (r >> 4) - 0xc0;
  1463. // we are started, but not processed? return 1
  1464. if(s_chan[ch].bNew)
  1465. {
  1466. #ifdef DEBUG_OUTPUT
  1467. std::cout << "0x" << hex << setw(4) << 1 << std::endl;
  1468. #endif
  1469. return 1;
  1470. }
  1471. // same here... we haven't decoded one sample
  1472. // yet, so no envelope yet. return 1 as well
  1473. if(s_chan[ch].ADSRX.lVolume &&
  1474. !s_chan[ch].ADSRX.EnvelopeVol)
  1475. {
  1476. #ifdef DEBUG_OUTPUT
  1477. std::cout << "0x" << hex << setw(4) << 1 << std::endl;
  1478. #endif
  1479. return 1;
  1480. }
  1481. #ifdef DEBUG_OUTPUT
  1482. std::cout << "0x" << hex << setw(4)
  1483. << (unsigned short)(s_chan[ch].ADSRX.EnvelopeVol >> 16)
  1484. << std::endl;
  1485. #endif
  1486. return (unsigned short)(s_chan[ch].ADSRX.EnvelopeVol >> 16);
  1487. }
  1488. // get loop address
  1489. case 14:
  1490. {
  1491. const int ch = (r >> 4) - 0xc0;
  1492. if(s_chan[ch].pLoop == NULL)
  1493. {
  1494. #ifdef DEBUG_OUTPUT
  1495. std::cout << "0x" << hex << setw(4) << 0 << std::endl;
  1496. #endif
  1497. return 0;
  1498. }
  1499. #ifdef DEBUG_OUTPUT
  1500. std::cout << "0x" << hex << setw(4)
  1501. << (unsigned short)((s_chan[ch].pLoop - spuMemC) >> 3)
  1502. << std::endl;
  1503. #endif
  1504. return (unsigned short)((s_chan[ch].pLoop - spuMemC) >> 3);
  1505. }
  1506. }
  1507. }
  1508. switch(r)
  1509. {
  1510. case H_SPUctrl:
  1511. #ifdef DEBUG_OUTPUT
  1512. std::cout << "0x" << hex << setw(4) << spuCtrl << std::endl;
  1513. #endif
  1514. return spuCtrl;
  1515. case H_SPUstat:
  1516. #ifdef DEBUG_OUTPUT
  1517. std::cout << "0x" << hex << setw(4) << spuStat << std::endl;
  1518. #endif
  1519. return spuStat;
  1520. case H_SPUaddr:
  1521. #ifdef DEBUG_OUTPUT
  1522. std::cout << "0x" << hex
  1523. << setw(4) << (unsigned short)(spuAddr >> 3) << std::endl;
  1524. #endif
  1525. return (unsigned short)(spuAddr >> 3);
  1526. case H_SPUdata:
  1527. {
  1528. unsigned short s = spuMem[spuAddr >> 1];
  1529. spuAddr += 2;
  1530. if(spuAddr > 0x7ffff)
  1531. spuAddr = 0;
  1532. #ifdef DEBUG_OUTPUT
  1533. std::cout << "0x" << hex << setw(4) << s << std::endl;
  1534. #endif
  1535. return s;
  1536. }
  1537. case H_SPUirqAddr:
  1538. #ifdef DEBUG_OUTPUT
  1539. std::cout << "0x" << hex << setw(4) << spuIrq << std::endl;
  1540. #endif
  1541. return spuIrq;
  1542. }
  1543. #ifdef DEBUG_OUTPUT
  1544. std::cout << "0x" << hex << setw(4) << regArea[(r - 0xc00) >> 1] << std::endl;
  1545. #endif
  1546. return regArea[(r - 0xc00) >> 1];
  1547. }
  1548. void SoundOn(int start, int end, unsigned short val)
  1549. {
  1550. int ch;
  1551. // loop channels
  1552. for(ch = start; ch < end; ch++, val >>= 1)
  1553. {
  1554. if((val & 1) && s_chan[ch].pStart)
  1555. // mmm... start has to be set before key on !?!
  1556. {
  1557. s_chan[ch].bIgnoreLoop = 0;
  1558. s_chan[ch].bNew = 1;
  1559. // bitfield for faster testing
  1560. dwNewChannel |= (1 << ch);
  1561. }
  1562. }
  1563. }
  1564. void SoundOff(int start, int end, unsigned short val)
  1565. {
  1566. int ch;
  1567. // loop channels
  1568. for(ch = start; ch < end; ch++, val >>= 1)
  1569. {
  1570. if(val & 1) // && s_chan[i].bOn) mmm...
  1571. s_chan[ch].bStop = 1;
  1572. }
  1573. }
  1574. void FModOn(int start, int end, unsigned short val)
  1575. {
  1576. int ch;
  1577. // loop channels
  1578. for(ch = start; ch < end; ch++, val >>= 1)
  1579. {
  1580. // fmod on/off
  1581. if(val & 1)
  1582. {
  1583. if(ch > 0)
  1584. {
  1585. // sound channel
  1586. s_chan[ch].bFMod = 1;
  1587. // freq channel
  1588. s_chan[ch - 1].bFMod = 2;
  1589. }
  1590. }
  1591. else
  1592. s_chan[ch].bFMod = 0;
  1593. }
  1594. }
  1595. void NoiseOn(int start, int end, unsigned short val)
  1596. {
  1597. int ch;
  1598. // loop channels
  1599. for(ch = start; ch < end; ch++, val >>= 1)
  1600. {
  1601. // noise on/off
  1602. if(val & 1)
  1603. {
  1604. s_chan[ch].bNoise = 1;
  1605. }
  1606. else
  1607. {
  1608. s_chan[ch].bNoise = 0;
  1609. }
  1610. }
  1611. }
  1612. // please note: sweep and phase invert are wrong... but I've never seen
  1613. // them used
  1614. void SetVolumeL(unsigned char ch, short vol)
  1615. {
  1616. s_chan[ch].iLeftVolRaw = vol;
  1617. // sweep
  1618. if(vol & 0x8000)
  1619. {
  1620. short sInc = 1;
  1621. if(vol & 0x2000)
  1622. sInc = -1;
  1623. // -> mmm... phase inverted? have to investigate this
  1624. if(vol & 0x1000)
  1625. vol ^= 0xffff;
  1626. // -> sweep: 0..127 -> 0..64
  1627. vol = ((vol & 0x7f) + 1) / 2;
  1628. // -> HACK: we don't sweep right now, so we
  1629. // just raise/lower the volume by the half!
  1630. vol += vol / (2 * sInc);
  1631. vol *= 128;
  1632. }
  1633. // no sweep
  1634. else
  1635. {
  1636. // -> mmm... phase inverted? have to investigate this
  1637. if(vol & 0x4000)
  1638. vol = 0x3fff - (vol & 0x3fff);
  1639. }
  1640. vol &= 0x3fff;
  1641. // store volume
  1642. s_chan[ch].iLeftVolume = vol;
  1643. }
  1644. void SetVolumeR(unsigned char ch, short vol)
  1645. {
  1646. s_chan[ch].iRightVolRaw = vol;
  1647. // comments... see above :)
  1648. if(vol & 0x8000)
  1649. {
  1650. short sInc = 1;
  1651. if(vol & 0x2000)
  1652. sInc = -1;
  1653. if(vol & 0x1000)
  1654. vol ^= 0xffff;
  1655. vol = ((vol & 0x7f) + 1) / 2;
  1656. vol += vol / (2 * sInc);
  1657. vol *= 128;
  1658. }
  1659. else
  1660. {
  1661. if(vol & 0x4000)
  1662. vol = 0x3fff - (vol & 0x3fff);
  1663. }
  1664. vol &= 0x3fff;
  1665. s_chan[ch].iRightVolume = vol;
  1666. }
  1667. void SetPitch(int ch, unsigned short val)
  1668. {
  1669. int NP;
  1670. if(val > 0x3fff)
  1671. NP = 0x3fff;
  1672. else
  1673. NP = val;
  1674. s_chan[ch].iRawPitch = NP;
  1675. NP = (44100L * NP) / 4096L;
  1676. if(NP < 1)
  1677. NP = 1;
  1678. s_chan[ch].iActFreq = NP;
  1679. }
  1680. void ReverbOn(int start, int end, unsigned short val)
  1681. {
  1682. int ch;
  1683. // loop channels
  1684. for(ch = start; ch < end; ch++, val >>= 1)
  1685. {
  1686. // reverb on/off
  1687. if(val & 1)
  1688. s_chan[ch].bReverb = 1;
  1689. else
  1690. s_chan[ch].bReverb = 0;
  1691. }
  1692. }
  1693. void SetREVERB(unsigned short val)
  1694. {
  1695. switch(val)
  1696. {
  1697. // off
  1698. case 0x0000:
  1699. iReverbOff = -1;
  1700. break;
  1701. // ok room
  1702. case 0x007D:
  1703. iReverbOff = 32;
  1704. iReverbNum = 2;
  1705. iReverbRepeat = 128;
  1706. break;
  1707. // studio small
  1708. case 0x0033:
  1709. iReverbOff = 32;
  1710. iReverbNum = 2;
  1711. iReverbRepeat = 64;
  1712. break;
  1713. // ok studio medium
  1714. case 0x00B1:
  1715. iReverbOff = 48;
  1716. iReverbNum = 2;
  1717. iReverbRepeat = 96;
  1718. break;
  1719. // ok studio large ok
  1720. case 0x00E3:
  1721. iReverbOff = 64;
  1722. iReverbNum = 2;
  1723. iReverbRepeat = 128;
  1724. break;
  1725. // ok hall
  1726. case 0x01A5:
  1727. iReverbOff = 128;
  1728. iReverbNum = 4;
  1729. iReverbRepeat = 32;
  1730. break;
  1731. // space echo
  1732. case 0x033D:
  1733. iReverbOff = 256;
  1734. iReverbNum = 4;
  1735. iReverbRepeat = 64;
  1736. break;
  1737. // echo/delay
  1738. case 0x0001:
  1739. iReverbOff = 184;
  1740. iReverbNum = 3;
  1741. iReverbRepeat = 128;
  1742. break;
  1743. // half echo
  1744. case 0x0017:
  1745. iReverbOff = 128;
  1746. iReverbNum = 2;
  1747. iReverbRepeat = 128;
  1748. break;
  1749. default:
  1750. iReverbOff = 32;
  1751. iReverbNum = 1;
  1752. iReverbRepeat = 0;
  1753. break;
  1754. }
  1755. }
  1756. void StartREVERB(int ch)
  1757. {
  1758. // reverb possible?
  1759. if(s_chan[ch].bReverb && (spuCtrl & 0x80))
  1760. {
  1761. if(iUseReverb == 2)
  1762. s_chan[ch].bRVBActive = 1;
  1763. else
  1764. // fake reverb used?
  1765. if(iUseReverb == 1 && iReverbOff > 0)
  1766. {
  1767. // activate it
  1768. s_chan[ch].bRVBActive = 1;
  1769. s_chan[ch].iRVBOffset = iReverbOff * 45;
  1770. s_chan[ch].iRVBRepeat = iReverbRepeat * 45;
  1771. s_chan[ch].iRVBNum = iReverbNum;
  1772. }
  1773. }
  1774. else
  1775. // no reverb
  1776. s_chan[ch].bRVBActive = 0;
  1777. }
  1778. void InitREVERB()
  1779. {
  1780. if(iUseReverb == 2)
  1781. memset(sRVBStart, 0, NSSIZE * 2 * 4);
  1782. }
  1783. void StoreREVERB(int ch, int ns)
  1784. {
  1785. if(iUseReverb == 0)
  1786. return;
  1787. // Neil's reverb
  1788. if(iUseReverb == 2)
  1789. {
  1790. const int iRxl =
  1791. (s_chan[ch].sval * s_chan[ch].iLeftVolume) / 0x4000;
  1792. const int iRxr =
  1793. (s_chan[ch].sval * s_chan[ch].iRightVolume) / 0x4000;
  1794. ns <<= 1;
  1795. // -> we mix all active reverb channels into an extra buffer
  1796. *(sRVBStart + ns) += iRxl;
  1797. *(sRVBStart + ns + 1) += iRxr;
  1798. }
  1799. // Pete's easy fake reverb
  1800. else
  1801. {
  1802. int *pN;
  1803. int iRn, iRr = 0;
  1804. // we use the half channel volume (/0x8000) for the
  1805. // first reverb effects, quarter for next and so on
  1806. int iRxl =
  1807. (s_chan[ch].sval * s_chan[ch].iLeftVolume) / 0x8000;
  1808. int iRxr =
  1809. (s_chan[ch].sval * s_chan[ch].iRightVolume) / 0x8000;
  1810. for(iRn = 1; iRn <= s_chan[ch].iRVBNum;
  1811. iRn++, iRr += s_chan[ch].iRVBRepeat,iRxl /= 2, iRxr /= 2)
  1812. {
  1813. pN = sRVBPlay + ((s_chan[ch].iRVBOffset + iRr + ns) << 1);
  1814. if(pN >= sRVBEnd)
  1815. pN = sRVBStart + (pN - sRVBEnd);
  1816. (*pN) += iRxl;
  1817. pN++;
  1818. (*pN) += iRxr;
  1819. }
  1820. }
  1821. }
  1822. // get_buffer content helper: takes care about wraps
  1823. int g_buffer(int iOff)
  1824. {
  1825. short *p = (short *)spuMem;
  1826. iOff = (iOff * 4) + rvb.CurrAddr;
  1827. while(iOff > 0x3FFFF)
  1828. iOff = rvb.StartAddr + (iOff - 0x40000);
  1829. while(iOff < rvb.StartAddr)
  1830. iOff = 0x3ffff - (rvb.StartAddr - iOff);
  1831. return (int)*(p + iOff);
  1832. }
  1833. // set_buffer content helper: takes care about wraps and clipping
  1834. void s_buffer(int iOff, int iVal)
  1835. {
  1836. short *p = (short *)spuMem;
  1837. iOff = (iOff * 4) + rvb.CurrAddr;
  1838. while(iOff > 0x3FFFF)
  1839. iOff = rvb.StartAddr + (iOff - 0x40000);
  1840. while(iOff < rvb.StartAddr)
  1841. iOff = 0x3ffff - (rvb.StartAddr - iOff);
  1842. if(iVal < -32768L)
  1843. iVal = -32768L;
  1844. if(iVal > 32767L)
  1845. iVal = 32767L;
  1846. *(p + iOff) = (short)iVal;
  1847. }
  1848. // set_buffer (+1 sample) content helper: takes care about wraps and clipping
  1849. void s_buffer1(int iOff, int iVal)
  1850. {
  1851. short *p = (short *)spuMem;
  1852. iOff = (iOff * 4) + rvb.CurrAddr + 1;
  1853. while(iOff > 0x3FFFF)
  1854. iOff = rvb.StartAddr + (iOff - 0x40000);
  1855. while(iOff < rvb.StartAddr)
  1856. iOff = 0x3ffff - (rvb.StartAddr - iOff);
  1857. if(iVal < -32768L)
  1858. iVal = -32768L;
  1859. if(iVal > 32767L)
  1860. iVal = 32767L;
  1861. *(p + iOff) = (short)iVal;
  1862. }
  1863. int MixREVERBLeft(int ns)
  1864. {
  1865. if(iUseReverb == 0)
  1866. return 0;
  1867. if(iUseReverb == 2)
  1868. {
  1869. // this func will be called with 44.1 khz
  1870. static int iCnt = 0;
  1871. // reverb is off
  1872. if(!rvb.StartAddr)
  1873. {
  1874. rvb.iLastRVBLeft = rvb.iLastRVBRight =
  1875. rvb.iRVBLeft = rvb.iRVBRight = 0;
  1876. return 0;
  1877. }
  1878. iCnt++;
  1879. // we work on every second left value: downsample to 22 khz
  1880. if(iCnt & 1)
  1881. {
  1882. // -> reverb on? oki
  1883. if(spuCtrl & 0x80)
  1884. {
  1885. int ACC0, ACC1, FB_A0, FB_A1, FB_B0, FB_B1;
  1886. const int INPUT_SAMPLE_L = *(sRVBStart + (ns << 1));
  1887. const int INPUT_SAMPLE_R = *(sRVBStart + (ns << 1) + 1);
  1888. const int IIR_INPUT_A0 =
  1889. (g_buffer(rvb.IIR_SRC_A0) * rvb.IIR_COEF) / 32768L +
  1890. (INPUT_SAMPLE_L * rvb.IN_COEF_L) / 32768L;
  1891. const int IIR_INPUT_A1 =
  1892. (g_buffer(rvb.IIR_SRC_A1) * rvb.IIR_COEF) / 32768L +
  1893. (INPUT_SAMPLE_R * rvb.IN_COEF_R) / 32768L;
  1894. const int IIR_INPUT_B0 =
  1895. (g_buffer(rvb.IIR_SRC_B0) * rvb.IIR_COEF) / 32768L +
  1896. (INPUT_SAMPLE_L * rvb.IN_COEF_L) / 32768L;
  1897. const int IIR_INPUT_B1 =
  1898. (g_buffer(rvb.IIR_SRC_B1) * rvb.IIR_COEF) / 32768L +
  1899. (INPUT_SAMPLE_R * rvb.IN_COEF_R) / 32768L;
  1900. const int IIR_A0 = (IIR_INPUT_A0 * rvb.IIR_ALPHA) / 32768L +
  1901. (g_buffer(rvb.IIR_DEST_A0) *
  1902. (32768L - rvb.IIR_ALPHA)) / 32768L;
  1903. const int IIR_A1 = (IIR_INPUT_A1 * rvb.IIR_ALPHA) / 32768L +
  1904. (g_buffer(rvb.IIR_DEST_A1) *
  1905. (32768L - rvb.IIR_ALPHA)) / 32768L;
  1906. const int IIR_B0 = (IIR_INPUT_B0 * rvb.IIR_ALPHA) / 32768L +
  1907. (g_buffer(rvb.IIR_DEST_B0) *
  1908. (32768L - rvb.IIR_ALPHA)) / 32768L;
  1909. const int IIR_B1 = (IIR_INPUT_B1 * rvb.IIR_ALPHA) / 32768L +
  1910. (g_buffer(rvb.IIR_DEST_B1) *
  1911. (32768L - rvb.IIR_ALPHA)) / 32768L;
  1912. s_buffer1(rvb.IIR_DEST_A0, IIR_A0);
  1913. s_buffer1(rvb.IIR_DEST_A1, IIR_A1);
  1914. s_buffer1(rvb.IIR_DEST_B0, IIR_B0);
  1915. s_buffer1(rvb.IIR_DEST_B1, IIR_B1);
  1916. ACC0 = (g_buffer(rvb.ACC_SRC_A0) * rvb.ACC_COEF_A) / 32768L +
  1917. (g_buffer(rvb.ACC_SRC_B0) * rvb.ACC_COEF_B) / 32768L +
  1918. (g_buffer(rvb.ACC_SRC_C0) * rvb.ACC_COEF_C) / 32768L +
  1919. (g_buffer(rvb.ACC_SRC_D0) * rvb.ACC_COEF_D) / 32768L;
  1920. ACC1 = (g_buffer(rvb.ACC_SRC_A1) * rvb.ACC_COEF_A) / 32768L +
  1921. (g_buffer(rvb.ACC_SRC_B1) * rvb.ACC_COEF_B) / 32768L +
  1922. (g_buffer(rvb.ACC_SRC_C1) * rvb.ACC_COEF_C) / 32768L +
  1923. (g_buffer(rvb.ACC_SRC_D1) * rvb.ACC_COEF_D) / 32768L;
  1924. FB_A0 = g_buffer(rvb.MIX_DEST_A0 - rvb.FB_SRC_A);
  1925. FB_A1 = g_buffer(rvb.MIX_DEST_A1 - rvb.FB_SRC_A);
  1926. FB_B0 = g_buffer(rvb.MIX_DEST_B0 - rvb.FB_SRC_B);
  1927. FB_B1 = g_buffer(rvb.MIX_DEST_B1 - rvb.FB_SRC_B);
  1928. s_buffer(rvb.MIX_DEST_A0,
  1929. ACC0 - (FB_A0 * rvb.FB_ALPHA) / 32768L);
  1930. s_buffer(rvb.MIX_DEST_A1,
  1931. ACC1 - (FB_A1 * rvb.FB_ALPHA) / 32768L);
  1932. s_buffer(rvb.MIX_DEST_B0, (rvb.FB_ALPHA * ACC0) / 32768L -
  1933. (FB_A0 * (int)(rvb.FB_ALPHA ^ 0xFFFF8000)) / 32768L -
  1934. (FB_B0 * rvb.FB_X) / 32768L);
  1935. s_buffer(rvb.MIX_DEST_B1, (rvb.FB_ALPHA * ACC1) / 32768L -
  1936. (FB_A1 * (int)(rvb.FB_ALPHA ^ 0xFFFF8000)) / 32768L -
  1937. (FB_B1 * rvb.FB_X) / 32768L);
  1938. rvb.iLastRVBLeft = rvb.iRVBLeft;
  1939. rvb.iLastRVBRight = rvb.iRVBRight;
  1940. rvb.iRVBLeft =
  1941. (g_buffer(rvb.MIX_DEST_A0) + g_buffer(rvb.MIX_DEST_B0)) / 3;
  1942. rvb.iRVBRight =
  1943. (g_buffer(rvb.MIX_DEST_A1) + g_buffer(rvb.MIX_DEST_B1)) / 3;
  1944. rvb.iRVBLeft = (rvb.iRVBLeft * rvb.VolLeft) / 0x4000;
  1945. rvb.iRVBRight = (rvb.iRVBRight * rvb.VolRight) / 0x4000;
  1946. rvb.CurrAddr++;
  1947. if(rvb.CurrAddr > 0x3ffff)
  1948. rvb.CurrAddr = rvb.StartAddr;
  1949. return rvb.iLastRVBLeft + (rvb.iRVBLeft-rvb.iLastRVBLeft) / 2;
  1950. }
  1951. // reverb off
  1952. else
  1953. rvb.iLastRVBLeft = rvb.iLastRVBRight =
  1954. rvb.iRVBLeft = rvb.iRVBRight = 0;
  1955. rvb.CurrAddr++;
  1956. if(rvb.CurrAddr > 0x3ffff)
  1957. rvb.CurrAddr = rvb.StartAddr;
  1958. }
  1959. return rvb.iLastRVBLeft;
  1960. }
  1961. // easy fake reverb
  1962. else
  1963. {
  1964. // -> simply take the reverb mix buf value
  1965. const int iRV = *sRVBPlay;
  1966. // -> init it after
  1967. *sRVBPlay++ = 0;
  1968. // -> and take care about wrap arounds
  1969. if(sRVBPlay >= sRVBEnd)
  1970. sRVBPlay = sRVBStart;
  1971. // -> return reverb buf mix val
  1972. return iRV;
  1973. }
  1974. }
  1975. int MixREVERBRight()
  1976. {
  1977. if(iUseReverb == 0)
  1978. return 0;
  1979. // Neill's reverb
  1980. if(iUseReverb == 2)
  1981. {
  1982. int i = rvb.iLastRVBRight + (rvb.iRVBRight - rvb.iLastRVBRight) / 2;
  1983. rvb.iLastRVBRight = rvb.iRVBRight;
  1984. // -> just return the last right reverb val
  1985. // (little bit scaled by the previous right val)
  1986. return i;
  1987. }
  1988. // easy fake reverb
  1989. else
  1990. {
  1991. // -> simply take the reverb mix buf value
  1992. const int iRV = *sRVBPlay;
  1993. // -> init it after
  1994. *sRVBPlay++ = 0;
  1995. // -> and take care about wrap arounds
  1996. if(sRVBPlay >= sRVBEnd)
  1997. sRVBPlay = sRVBStart;
  1998. // -> return reverb mix buf val
  1999. return iRV;
  2000. }
  2001. }
  2002. void MixXA()
  2003. {
  2004. int ns;
  2005. for(ns = 0; ns < NSSIZE && XAPlay != XAFeed; ns++)
  2006. {
  2007. XALastVal = *XAPlay++;
  2008. if(XAPlay == XAEnd)
  2009. XAPlay = XAStart;
  2010. SSumL[ns] += (((short)(XALastVal & 0xffff)) * iLeftXAVol) / 32767;
  2011. SSumR[ns] += (((short)((XALastVal >> 16) & 0xffff)) *
  2012. iRightXAVol) / 32767;
  2013. }
  2014. if(XAPlay == XAFeed && XARepeat)
  2015. {
  2016. XARepeat--;
  2017. for(;ns < NSSIZE; ns++)
  2018. {
  2019. SSumL[ns] += (((short)(XALastVal & 0xffff)) * iLeftXAVol) / 32767;
  2020. SSumR[ns] += (((short)((XALastVal >> 16) & 0xffff)) *
  2021. iRightXAVol) / 32767;
  2022. }
  2023. }
  2024. }
  2025. void FeedXA(xa_decode_t *xap)
  2026. {
  2027. #ifdef VGears_SOUND
  2028. int sinc, spos, i, iSize, iPlace, vl, vr;
  2029. if(!bSPUIsOpen)
  2030. return;
  2031. // store info for save states
  2032. xapGlobal = xap;
  2033. // set up repeat
  2034. XARepeat = 100;
  2035. // get size
  2036. iSize = ((44100 * xap->nsamples) / xap->freq);
  2037. // if none
  2038. if(!iSize)
  2039. return;
  2040. // how much space in my buf?
  2041. if(XAFeed < XAPlay)
  2042. iPlace = XAPlay - XAFeed;
  2043. else
  2044. iPlace = (XAEnd - XAFeed) + (XAPlay - XAStart);
  2045. // no place at all
  2046. if(iPlace == 0)
  2047. return;
  2048. // pitch change option
  2049. if(iXAPitch)
  2050. {
  2051. static unsigned long dwLT = 0;
  2052. static unsigned long dwFPS = 0;
  2053. static int iFPSCnt = 0;
  2054. static int iLastSize = 0;
  2055. static unsigned long dwL1 = 0;
  2056. unsigned long dw, dw1, dw2;
  2057. //G dw = timeGetTime_spu();
  2058. dw = GGetTime();
  2059. iPlace = iSize;
  2060. dwFPS += dw - dwLT;
  2061. iFPSCnt++;
  2062. dwLT = dw;
  2063. if(iFPSCnt >= 10)
  2064. {
  2065. if(!dwFPS)
  2066. dwFPS = 1;
  2067. dw1 = 1000000 / dwFPS;
  2068. if(dw1 >= (dwL1 - 100) && dw1 <= (dwL1 + 100))
  2069. dw1 = dwL1;
  2070. else
  2071. dwL1 = dw1;
  2072. dw2 = (xap->freq * 100 / xap->nsamples);
  2073. if((!dw1) || ((dw2 + 100) >= dw1))
  2074. iLastSize = 0;
  2075. else
  2076. {
  2077. iLastSize = iSize * dw2 / dw1;
  2078. if(iLastSize > iPlace)
  2079. iLastSize = iPlace;
  2080. iSize = iLastSize;
  2081. }
  2082. iFPSCnt = 0;
  2083. dwFPS = 0;
  2084. }
  2085. else
  2086. {
  2087. if(iLastSize)
  2088. iSize = iLastSize;
  2089. }
  2090. }
  2091. spos = 0x10000L;
  2092. // calc freq by num / size
  2093. sinc = (xap->nsamples << 16) / iSize;
  2094. if(xap->stereo)
  2095. {
  2096. u32 * pS = (u32 *)xap->pcm;
  2097. u32 l = 0;
  2098. if(iXAPitch)
  2099. {
  2100. int32_t l1, l2;
  2101. short s;
  2102. for(i = 0; i < iSize; i++)
  2103. {
  2104. if(iUseInterpolation == 2)
  2105. {
  2106. while(spos >= 0x10000L)
  2107. {
  2108. l = *pS++;
  2109. gauss_window[gauss_ptr] = (short)LOWORD(l);
  2110. gauss_window[4 + gauss_ptr] = (short)HIWORD(l);
  2111. gauss_ptr = (gauss_ptr + 1) & 3;
  2112. spos -= 0x10000L;
  2113. }
  2114. vl = (spos >> 6) & ~3;
  2115. vr = (gauss[vl]*gvall0) & ~2047;
  2116. vr += (gauss[vl + 1] * gvall(1)) & ~2047;
  2117. vr += (gauss[vl + 2] * gvall(2)) & ~2047;
  2118. vr += (gauss[vl + 3] * gvall(3)) & ~2047;
  2119. l= (vr >> 11) & 0xffff;
  2120. vr = (gauss[vl] * gvalr0) & ~2047;
  2121. vr += (gauss[vl + 1] * gvalr(1)) & ~2047;
  2122. vr += (gauss[vl + 2] * gvalr(2)) & ~2047;
  2123. vr += (gauss[vl + 3] * gvalr(3)) & ~2047;
  2124. l |= vr << 5;
  2125. }
  2126. else
  2127. {
  2128. while(spos >= 0x10000L)
  2129. {
  2130. l = *pS++;
  2131. spos -= 0x10000L;
  2132. }
  2133. }
  2134. s = (short)LOWORD(l);
  2135. l1 = s;
  2136. l1 = (l1 * iPlace) / iSize;
  2137. if(l1 < -32767)
  2138. l1 = -32767;
  2139. if(l1 > 32767)
  2140. l1 = 32767;
  2141. s = (short)HIWORD(l);
  2142. l2 = s;
  2143. l2 = (l2 * iPlace) / iSize;
  2144. if(l2 < -32767)
  2145. l2 = -32767;
  2146. if(l2 > 32767)
  2147. l2 = 32767;
  2148. l = (l1 & 0xffff)|(l2 << 16);
  2149. *XAFeed++ = l;
  2150. if(XAFeed == XAEnd)
  2151. XAFeed = XAStart;
  2152. if(XAFeed == XAPlay)
  2153. {
  2154. if(XAPlay != XAStart)
  2155. XAFeed = XAPlay - 1;
  2156. break;
  2157. }
  2158. spos += sinc;
  2159. }
  2160. }
  2161. else
  2162. {
  2163. for(i = 0; i < iSize; i++)
  2164. {
  2165. if(iUseInterpolation == 2)
  2166. {
  2167. while(spos >= 0x10000L)
  2168. {
  2169. l = *pS++;
  2170. gauss_window[gauss_ptr] = (short)LOWORD(l);
  2171. gauss_window[4 + gauss_ptr] = (short)HIWORD(l);
  2172. gauss_ptr = (gauss_ptr + 1) & 3;
  2173. spos -= 0x10000L;
  2174. }
  2175. vl = (spos >> 6) & ~3;
  2176. vr = (gauss[vl] * gvall0) & ~2047;
  2177. vr += (gauss[vl + 1] * gvall(1)) & ~2047;
  2178. vr += (gauss[vl + 2] * gvall(2)) & ~2047;
  2179. vr += (gauss[vl + 3] * gvall(3)) & ~2047;
  2180. l = (vr >> 11) & 0xffff;
  2181. vr = (gauss[vl] * gvalr0) & ~2047;
  2182. vr += (gauss[vl + 1] * gvalr(1)) & ~2047;
  2183. vr += (gauss[vl + 2] * gvalr(2)) & ~2047;
  2184. vr += (gauss[vl + 3] * gvalr(3)) & ~2047;
  2185. l |= vr << 5;
  2186. }
  2187. else
  2188. {
  2189. while(spos>=0x10000L)
  2190. {
  2191. l = *pS++;
  2192. spos -= 0x10000L;
  2193. }
  2194. }
  2195. *XAFeed++ = l;
  2196. if(XAFeed == XAEnd)
  2197. XAFeed = XAStart;
  2198. if(XAFeed == XAPlay)
  2199. {
  2200. if(XAPlay != XAStart)
  2201. XAFeed = XAPlay - 1;
  2202. break;
  2203. }
  2204. spos += sinc;
  2205. }
  2206. }
  2207. }
  2208. else
  2209. {
  2210. unsigned short * pS = (unsigned short *)xap->pcm;
  2211. u32 l;
  2212. short s = 0;
  2213. if(iXAPitch)
  2214. {
  2215. int32_t l1;
  2216. for(i = 0; i < iSize; i++)
  2217. {
  2218. if(iUseInterpolation == 2)
  2219. {
  2220. while(spos >= 0x10000L)
  2221. {
  2222. gauss_window[gauss_ptr] = (short)*pS++;
  2223. gauss_ptr = (gauss_ptr + 1) & 3;
  2224. spos -= 0x10000L;
  2225. }
  2226. vl = (spos >> 6) & ~3;
  2227. vr = (gauss[vl] * gvall0) & ~2047;
  2228. vr += (gauss[vl + 1] * gvall(1)) & ~2047;
  2229. vr += (gauss[vl + 2] * gvall(2)) & ~2047;
  2230. vr += (gauss[vl + 3] * gvall(3)) & ~2047;
  2231. l1 = s = vr >> 11;
  2232. l1 &= 0xffff;
  2233. }
  2234. else
  2235. {
  2236. while(spos >= 0x10000L)
  2237. {
  2238. s = *pS++;
  2239. spos -= 0x10000L;
  2240. }
  2241. l1 = s;
  2242. }
  2243. l1 = (l1 * iPlace) / iSize;
  2244. if(l1 < -32767)
  2245. l1 = -32767;
  2246. if(l1 > 32767)
  2247. l1 = 32767;
  2248. l = (l1 & 0xffff) | (l1 << 16);
  2249. *XAFeed++ = l;
  2250. if(XAFeed == XAEnd)
  2251. XAFeed = XAStart;
  2252. if(XAFeed == XAPlay)
  2253. {
  2254. if(XAPlay != XAStart)
  2255. XAFeed = XAPlay - 1;
  2256. break;
  2257. }
  2258. spos += sinc;
  2259. }
  2260. }
  2261. else
  2262. {
  2263. for(i = 0; i < iSize; i++)
  2264. {
  2265. if(iUseInterpolation == 2)
  2266. {
  2267. while(spos >= 0x10000L)
  2268. {
  2269. gauss_window[gauss_ptr] = (short)*pS++;
  2270. gauss_ptr = (gauss_ptr + 1) & 3;
  2271. spos -= 0x10000L;
  2272. }
  2273. vl = (spos >> 6) & ~3;
  2274. vr = (gauss[vl] * gvall0) & ~2047;
  2275. vr += (gauss[vl + 1] * gvall(1)) & ~2047;
  2276. vr += (gauss[vl + 2] * gvall(2)) & ~2047;
  2277. vr += (gauss[vl + 3] * gvall(3)) & ~2047;
  2278. l= s = vr >> 11;
  2279. l &= 0xffff;
  2280. }
  2281. else
  2282. {
  2283. while(spos >= 0x10000L)
  2284. {
  2285. s = *pS++;
  2286. spos -= 0x10000L;
  2287. }
  2288. l = s;
  2289. }
  2290. *XAFeed++ = (l | (l << 16));
  2291. if(XAFeed == XAEnd)
  2292. XAFeed = XAStart;
  2293. if(XAFeed == XAPlay)
  2294. {
  2295. if(XAPlay != XAStart)
  2296. XAFeed = XAPlay - 1;
  2297. break;
  2298. }
  2299. spos += sinc;
  2300. }
  2301. }
  2302. }
  2303. #endif
  2304. }
  2305. void InterpolateUp(int ch)
  2306. {
  2307. if(s_chan[ch].SB[32]==1) // flag == 1? calc step and set flag... and don't change the value in this pass
  2308. {
  2309. const int id1=s_chan[ch].SB[30]-s_chan[ch].SB[29]; // curr delta to next val
  2310. const int id2=s_chan[ch].SB[31]-s_chan[ch].SB[30]; // and next delta to next-next val :)
  2311. s_chan[ch].SB[32]=0;
  2312. if(id1>0) // curr delta positive
  2313. {
  2314. if(id2<id1)
  2315. {s_chan[ch].SB[28]=id1;s_chan[ch].SB[32]=2;}
  2316. else
  2317. if(id2<(id1<<1))
  2318. s_chan[ch].SB[28]=(id1*s_chan[ch].sinc)/0x10000L;
  2319. else
  2320. s_chan[ch].SB[28]=(id1*s_chan[ch].sinc)/0x20000L;
  2321. }
  2322. else // curr delta negative
  2323. {
  2324. if(id2>id1)
  2325. {s_chan[ch].SB[28]=id1;s_chan[ch].SB[32]=2;}
  2326. else
  2327. if(id2>(id1<<1))
  2328. s_chan[ch].SB[28]=(id1*s_chan[ch].sinc)/0x10000L;
  2329. else
  2330. s_chan[ch].SB[28]=(id1*s_chan[ch].sinc)/0x20000L;
  2331. }
  2332. }
  2333. else
  2334. if(s_chan[ch].SB[32]==2) // flag 1: calc step and set flag... and don't change the value in this pass
  2335. {
  2336. s_chan[ch].SB[32]=0;
  2337. s_chan[ch].SB[28]=(s_chan[ch].SB[28]*s_chan[ch].sinc)/0x20000L;
  2338. if(s_chan[ch].sinc<=0x8000)
  2339. s_chan[ch].SB[29]=s_chan[ch].SB[30]-(s_chan[ch].SB[28]*((0x10000/s_chan[ch].sinc)-1));
  2340. else s_chan[ch].SB[29]+=s_chan[ch].SB[28];
  2341. }
  2342. else // no flags? add bigger val (if possible), calc smaller step, set flag1
  2343. s_chan[ch].SB[29]+=s_chan[ch].SB[28];
  2344. }
  2345. //
  2346. // even easier interpolation on downsampling, also no special filter, again just "Pete's common sense" tm
  2347. //
  2348. void InterpolateDown(int ch)
  2349. {
  2350. if(s_chan[ch].sinc>=0x20000L) // we would skip at least one val?
  2351. {
  2352. s_chan[ch].SB[29]+=(s_chan[ch].SB[30]-s_chan[ch].SB[29])/2; // add easy weight
  2353. if(s_chan[ch].sinc>=0x30000L) // we would skip even more vals?
  2354. s_chan[ch].SB[29]+=(s_chan[ch].SB[31]-s_chan[ch].SB[30])/2;// add additional next weight
  2355. }
  2356. }
  2357. ////////////////////////////////////////////////////////////////////////
  2358. // helpers for gauss interpolation
  2359. #define gval0 (((short*)(&s_chan[ch].SB[29]))[gpos])
  2360. #define gval(x) (((short*)(&s_chan[ch].SB[29]))[(gpos+x)&3])
  2361. //#include "gauss_i.h"
  2362. ////////////////////////////////////////////////////////////////////////
  2363. //#include "xa.c"
  2364. ////////////////////////////////////////////////////////////////////////
  2365. // START SOUND... called by main thread to setup a new sound on a channel
  2366. ////////////////////////////////////////////////////////////////////////
  2367. void StartSound(int ch)
  2368. {
  2369. StartADSR(ch);
  2370. StartREVERB(ch);
  2371. s_chan[ch].pCurr=s_chan[ch].pStart; // set sample start
  2372. s_chan[ch].s_1=0; // init mixing vars
  2373. s_chan[ch].s_2=0;
  2374. s_chan[ch].iSBPos=28;
  2375. s_chan[ch].bNew=0; // init channel flags
  2376. s_chan[ch].bStop=0;
  2377. s_chan[ch].bOn=1;
  2378. s_chan[ch].SB[29]=0; // init our interpolation helpers
  2379. s_chan[ch].SB[30]=0;
  2380. if(iUseInterpolation>=2) // gauss interpolation?
  2381. {s_chan[ch].spos=0x30000L;s_chan[ch].SB[28]=0;} // -> start with more decoding
  2382. else {s_chan[ch].spos=0x10000L;s_chan[ch].SB[31]=0;} // -> no/simple interpolation starts with one 44100 decoding
  2383. dwNewChannel&=~(1<<ch); // clear new channel bit
  2384. }
  2385. ////////////////////////////////////////////////////////////////////////
  2386. // MAIN SPU FUNCTION
  2387. // here is the main job handler... thread, timer or direct func call
  2388. // basically the whole sound processing is done in this fat func!
  2389. ////////////////////////////////////////////////////////////////////////
  2390. // 5 ms waiting phase, if buffer is full and no new sound has to get started
  2391. // .. can be made smaller (smallest val: 1 ms), but bigger waits give
  2392. // better performance
  2393. #define PAUSE_W 5
  2394. #define PAUSE_L 5000
  2395. ////////////////////////////////////////////////////////////////////////
  2396. static void *MAINThread(void *arg)
  2397. {
  2398. // std::cout << "!!!!!!!!!!!!!!!!!!!TEST!!!!!!!!!!!!!!!!!!" << std::endl;
  2399. int s_1, s_2;
  2400. int fa;
  2401. int ns;
  2402. int voldiv = iVolume;
  2403. unsigned char *start;
  2404. unsigned int nSample;
  2405. int ch, predict_nr, shift_factor, flags, d, s;
  2406. int gpos, bIRQReturn = 0;
  2407. // until we are shutting down
  2408. while(!bEndThread)
  2409. {
  2410. // ok, at the beginning we are looking if there is
  2411. // enuff free place in the dsound/oss buffer to
  2412. // fill in new data, or if there is a new channel to start.
  2413. // if not, we wait (thread) or return (timer/spuasync)
  2414. // until enuff free place is available/a new channel gets
  2415. // started
  2416. // new channel should start immedately?
  2417. // (at least one bit 0 ... MAXCHANNEL is set?)
  2418. if(dwNewChannel)
  2419. {
  2420. // set iSecure
  2421. // (if it is set 5 times - that means on 5 tries a new samples
  2422. // has been started - in a row, we will reset it, to give the
  2423. // sound update a chance)
  2424. iSecureStart++;
  2425. if(iSecureStart > 5)
  2426. iSecureStart = 0;
  2427. }
  2428. // 0: no new channel
  2429. else
  2430. iSecureStart = 0;
  2431. // no new start? no thread end? and still enough data in sound buffer?
  2432. while(!iSecureStart && !bEndThread &&
  2433. (SBE->GetBytesBuffered() > TESTSIZE))
  2434. {
  2435. // reset secure
  2436. iSecureStart = 0;
  2437. // linux no-thread mode? bye
  2438. if(iUseTimer)
  2439. return 0;
  2440. // else sleep for x ms (linux)
  2441. #ifndef _MSC_VER
  2442. usleep(PAUSE_L);
  2443. #else
  2444. Sleep(PAUSE_L);
  2445. #endif
  2446. // SDL_Delay(PAUSE_L);
  2447. if(dwNewChannel)
  2448. // if a new channel kicks in (or, of course,
  2449. // sound buffer runs low), we will leave the loop
  2450. iSecureStart = 1;
  2451. }
  2452. // continue from irq handling in timer mode?
  2453. // will be -1 if no continue is pending
  2454. if(lastch >= 0)
  2455. {
  2456. // -> setup all kind of vars to continue
  2457. ch = lastch;
  2458. ns = lastns;
  2459. lastch = -1;
  2460. // -> directly jump to the continue point
  2461. goto GOON;
  2462. }
  2463. {
  2464. // loop em all... we will collect 1 ms
  2465. // of sound of each playing channel
  2466. for(ch = 0; ch < MAXCHAN; ch++)
  2467. {
  2468. // start new channel
  2469. if(s_chan[ch].bNew)
  2470. StartSound(ch);
  2471. // channel not playing? - next
  2472. if(!s_chan[ch].bOn)
  2473. continue;
  2474. // new psx frequency?
  2475. if(s_chan[ch].iActFreq != s_chan[ch].iUsedFreq)
  2476. {
  2477. // take int and calc steps
  2478. s_chan[ch].iUsedFreq = s_chan[ch].iActFreq;
  2479. s_chan[ch].sinc = s_chan[ch].iRawPitch << 4;
  2480. if(!s_chan[ch].sinc)
  2481. s_chan[ch].sinc = 1;
  2482. // freq change in simple interpolation mode [set flag]
  2483. if(iUseInterpolation == 1)
  2484. s_chan[ch].SB[32] = 1;
  2485. }
  2486. // loop until 1 ms of data is reached
  2487. ns = 0;
  2488. while(ns < NSSIZE)
  2489. {
  2490. while(s_chan[ch].spos >= 0x10000L)
  2491. {
  2492. // 28 reached
  2493. if(s_chan[ch].iSBPos == 28)
  2494. {
  2495. // set up the current pos
  2496. start = s_chan[ch].pCurr;
  2497. // special "stop" sign
  2498. if (start == (unsigned char *)-1)
  2499. {
  2500. // turn everything off
  2501. s_chan[ch].bOn = 0;
  2502. s_chan[ch].ADSRX.lVolume = 0;
  2503. s_chan[ch].ADSRX.EnvelopeVol = 0;
  2504. // and done for this channel
  2505. goto ENDX;
  2506. }
  2507. s_chan[ch].iSBPos = 0;
  2508. // spu irq handler here? mmm... do it later
  2509. s_1 = s_chan[ch].s_1;
  2510. s_2 = s_chan[ch].s_2;
  2511. predict_nr = (int)*start;
  2512. start++;
  2513. shift_factor = predict_nr & 0xf;
  2514. predict_nr >>= 4;
  2515. flags=(int)*start;
  2516. start++;
  2517. for (nSample = 0; nSample < 28; start++)
  2518. {
  2519. d = (int)*start;
  2520. s = ((d & 0xf) << 12);
  2521. if(s & 0x8000)
  2522. s |= 0xffff0000;
  2523. fa = (s >> shift_factor);
  2524. fa = fa + ((s_1 * f[predict_nr][0]) >> 6) +
  2525. ((s_2 * f[predict_nr][1]) >> 6);
  2526. s_2 = s_1;
  2527. s_1 = fa;
  2528. s = ((d & 0xf0) << 8);
  2529. s_chan[ch].SB[nSample++] = fa;
  2530. if(s & 0x8000)
  2531. s |= 0xffff0000;
  2532. fa = (s >> shift_factor);
  2533. fa = fa + ((s_1 * f[predict_nr][0]) >> 6) +
  2534. ((s_2 * f[predict_nr][1]) >> 6);
  2535. s_2 = s_1;
  2536. s_1 = fa;
  2537. s_chan[ch].SB[nSample++] = fa;
  2538. }
  2539. // irq check? mmm...
  2540. // some callbacks and irq active?
  2541. if(irqCallback && (spuCtrl & 0x40))
  2542. {
  2543. // irq address reached? &
  2544. // special: irq on looping addr,
  2545. // when stop/loop flag is set
  2546. if((pSpuIrq > start - 16 && pSpuIrq <= start)
  2547. ||
  2548. ((flags & 1) &&
  2549. (pSpuIrq > s_chan[ch].pLoop - 16 &&
  2550. pSpuIrq <= s_chan[ch].pLoop)))
  2551. {
  2552. // debug flag
  2553. s_chan[ch].iIrqDone = 1;
  2554. // call main emu
  2555. irqCallback();
  2556. // option: wait after irq for main emu
  2557. if(iSPUIRQWait)
  2558. {
  2559. unsigned long dwWatchTime;
  2560. if(iUseTimer == 2)
  2561. bIRQReturn = 1;
  2562. else
  2563. {
  2564. // dwWatchTime = timeGetTime_spu() +
  2565. // 2500;
  2566. dwWatchTime = GGetTime() +
  2567. 2500;
  2568. iWatchDog = 1;
  2569. while(iWatchDog && !bEndThread &&
  2570. GGetTime() < dwWatchTime)
  2571. #ifndef _MSC_VER
  2572. usleep(10);
  2573. #else
  2574. Sleep(10);
  2575. #endif
  2576. // SDL_Delay(1000L);
  2577. }
  2578. }
  2579. }
  2580. }
  2581. // flag handler
  2582. // loop address
  2583. if((flags & 4) && (!s_chan[ch].bIgnoreLoop))
  2584. s_chan[ch].pLoop = start - 16;
  2585. // stop loop
  2586. if(flags & 1)
  2587. {
  2588. // PETE: if we don't check exactly for 3,
  2589. // loop hang ups will happen (DQ4, for example)
  2590. if(flags != 3 || s_chan[ch].pLoop == NULL)
  2591. {
  2592. // and checking if pLoop is
  2593. // set avoids crashes, yeah
  2594. start = (unsigned char *)-1;
  2595. }
  2596. else
  2597. {
  2598. start = s_chan[ch].pLoop;
  2599. }
  2600. }
  2601. // store values for next cycle
  2602. s_chan[ch].pCurr = start;
  2603. s_chan[ch].s_1 = s_1;
  2604. s_chan[ch].s_2 = s_2;
  2605. // special return for
  2606. // "spu irq - wait for cpu action"
  2607. if(bIRQReturn)
  2608. {
  2609. bIRQReturn = 0;
  2610. lastch = ch;
  2611. lastns = ns;
  2612. return 0;
  2613. }
  2614. GOON:
  2615. ;
  2616. }
  2617. // get sample data
  2618. fa = s_chan[ch].SB[s_chan[ch].iSBPos++];
  2619. // muted?
  2620. if((spuCtrl & 0x4000) == 0)
  2621. fa = 0;
  2622. // else adjust
  2623. else
  2624. {
  2625. if(fa > 32767L)
  2626. fa = 32767L;
  2627. if(fa < -32767L)
  2628. fa = -32767L;
  2629. }
  2630. // gauss/cubic interpolation
  2631. if(iUseInterpolation >= 2)
  2632. {
  2633. gpos = s_chan[ch].SB[28];
  2634. gval0 = fa;
  2635. gpos = (gpos + 1) & 3;
  2636. s_chan[ch].SB[28] = gpos;
  2637. }
  2638. // simple interpolation
  2639. else if(iUseInterpolation == 1)
  2640. {
  2641. s_chan[ch].SB[28] = 0;
  2642. // helpers for simple linear interpolation:
  2643. // delay real val for two slots, and calc
  2644. // the two deltas, for a
  2645. // 'look at the future behaviour'
  2646. s_chan[ch].SB[29] = s_chan[ch].SB[30];
  2647. s_chan[ch].SB[30] = s_chan[ch].SB[31];
  2648. s_chan[ch].SB[31] = fa;
  2649. // flag: calc new interpolation
  2650. s_chan[ch].SB[32] = 1;
  2651. }
  2652. // no interpolation
  2653. else
  2654. s_chan[ch].SB[29] = fa;
  2655. s_chan[ch].spos -= 0x10000L;
  2656. }
  2657. // noise handler... just produces some noise data
  2658. // surely wrong...
  2659. // and no noise frequency (spuCtrl & 0x3f00) will be used...
  2660. // and sometimes the noise will be
  2661. // used as fmod modulation... pfff
  2662. if(s_chan[ch].bNoise)
  2663. {
  2664. if((dwNoiseVal <<= 1) & 0x80000000L)
  2665. {
  2666. dwNoiseVal ^= 0x0040001L;
  2667. fa = ((dwNoiseVal >> 2) & 0x7fff);
  2668. fa = -fa;
  2669. }
  2670. else
  2671. fa = (dwNoiseVal >> 2) & 0x7fff;
  2672. // mmm... depending on the noise freq we allow
  2673. // bigger/smaller changes to the previous val
  2674. fa = s_chan[ch].iOldNoise +
  2675. ((fa - s_chan[ch].iOldNoise) /
  2676. ((0x001f - ((spuCtrl & 0x3f00) >> 9)) + 1));
  2677. if(fa > 32767L)
  2678. fa = 32767L;
  2679. if(fa < -32767L)
  2680. fa = -32767L;
  2681. s_chan[ch].iOldNoise = fa;
  2682. // no gauss/cubic interpolation?
  2683. if(iUseInterpolation < 2)
  2684. // store noise val in "current sample slot"
  2685. s_chan[ch].SB[29] = fa;
  2686. }
  2687. // NO NOISE (NORMAL SAMPLE DATA) HERE
  2688. else
  2689. {
  2690. // cubic interpolation
  2691. if(iUseInterpolation == 3)
  2692. {
  2693. long xd;
  2694. xd = ((s_chan[ch].spos) >> 1) + 1;
  2695. gpos = s_chan[ch].SB[28];
  2696. fa = gval(3) - 3 * gval(2) + 3 * gval(1) - gval0;
  2697. fa *= (xd - (2 << 15)) / 6;
  2698. fa >>= 15;
  2699. fa += gval(2) - gval(1) - gval(1) + gval0;
  2700. fa *= (xd - (1 << 15)) >> 1;
  2701. fa >>= 15;
  2702. fa += gval(1) - gval0;
  2703. fa *= xd;
  2704. fa >>= 15;
  2705. fa = fa + gval0;
  2706. }
  2707. // gauss interpolation
  2708. else if(iUseInterpolation == 2)
  2709. {
  2710. int vl, vr;
  2711. vl = (s_chan[ch].spos >> 6) & ~3;
  2712. gpos = s_chan[ch].SB[28];
  2713. vr = (gauss[vl] * gval0) & ~2047;
  2714. vr += (gauss[vl + 1] * gval(1)) & ~2047;
  2715. vr += (gauss[vl + 2] * gval(2)) & ~2047;
  2716. vr += (gauss[vl + 3] * gval(3)) & ~2047;
  2717. fa = vr >> 11;
  2718. }
  2719. // simple interpolation
  2720. else if(iUseInterpolation == 1)
  2721. {
  2722. // upsampling?
  2723. if(s_chan[ch].sinc < 0x10000L)
  2724. InterpolateUp(ch);
  2725. else
  2726. InterpolateDown(ch);
  2727. fa = s_chan[ch].SB[29];
  2728. }
  2729. else
  2730. // no interpolation
  2731. fa = s_chan[ch].SB[29];
  2732. }
  2733. // add adsr
  2734. s_chan[ch].sval = (MixADSR(ch) * fa) / 1023;
  2735. // fmod freq channel
  2736. if(s_chan[ch].bFMod == 2)
  2737. {
  2738. int NP = s_chan[ch+1].iRawPitch;
  2739. NP = ((32768L + s_chan[ch].sval) * NP) / 32768L;
  2740. if(NP > 0x3fff)
  2741. NP = 0x3fff;
  2742. if(NP < 0x1)
  2743. NP = 0x1;
  2744. // mmmm... if I do this, all is screwed
  2745. // s_chan[ch+1].iRawPitch=NP;
  2746. // calc frequency
  2747. NP = (44100L * NP) / (4096L);
  2748. s_chan[ch + 1].iActFreq = NP;
  2749. s_chan[ch + 1].iUsedFreq = NP;
  2750. s_chan[ch + 1].sinc = (((NP / 10) << 16) / 4410);
  2751. if(!s_chan[ch + 1].sinc)
  2752. s_chan[ch + 1].sinc = 1;
  2753. // freq change in simple interpolation mode
  2754. if(iUseInterpolation == 1)
  2755. s_chan[ch + 1].SB[32] = 1;
  2756. // mmmm... set up freq decoding positions?
  2757. // s_chan[ch+1].iSBPos=28;
  2758. // s_chan[ch+1].spos=0x10000L;
  2759. }
  2760. else
  2761. {
  2762. // ok, left/right sound volume
  2763. // (psx volume goes from 0 ... 0x3fff)
  2764. // debug mute
  2765. if(s_chan[ch].iMute)
  2766. s_chan[ch].sval = 0;
  2767. else
  2768. {
  2769. SSumL[ns] += (s_chan[ch].sval *
  2770. s_chan[ch].iLeftVolume) / 0x4000L;
  2771. SSumR[ns] += (s_chan[ch].sval *
  2772. s_chan[ch].iRightVolume) / 0x4000L;
  2773. }
  2774. // now let us store sound data for reverb
  2775. if(s_chan[ch].bRVBActive)
  2776. StoreREVERB(ch, ns);
  2777. }
  2778. // ok, go on until 1 ms data
  2779. // of this channel is collected
  2780. ns++;
  2781. s_chan[ch].spos += s_chan[ch].sinc;
  2782. } // while(ns < NSSIZE)
  2783. ENDX:
  2784. ;
  2785. } // for(ch = 0; ch < MAXCHAN; ch++)
  2786. }
  2787. // here we have another 1 ms of sound data
  2788. // mix XA infos (if any)
  2789. if(XAPlay != XAFeed || XARepeat)
  2790. MixXA();
  2791. // mix all channels (including reverb) into one buffer
  2792. /*
  2793. // no stereo?
  2794. if(iDisStereo)
  2795. {
  2796. int dl, dr;
  2797. for(ns = 0; ns < NSSIZE; ns++)
  2798. {
  2799. SSumL[ns] += MixREVERBLeft(ns);
  2800. dl = SSumL[ns] / voldiv;
  2801. SSumL[ns] = 0;
  2802. if(dl < -32767)
  2803. dl = -32767;
  2804. if(dl > 32767)
  2805. dl = 32767;
  2806. SSumR[ns] += MixREVERBRight();
  2807. dr = SSumR[ns] / voldiv;
  2808. SSumR[ns] = 0;
  2809. if(dr < -32767)
  2810. dr = -32767;
  2811. if(dr > 32767)
  2812. dr = 32767;
  2813. *pS++ = (dl + dr) / 2;
  2814. }
  2815. }
  2816. // stereo
  2817. else
  2818. */
  2819. for(ns = 0; ns < NSSIZE; ns++)
  2820. {
  2821. SSumL[ns] += MixREVERBLeft(ns);
  2822. d = SSumL[ns] / voldiv;
  2823. SSumL[ns] = 0;
  2824. if(d < -32767)
  2825. d = -32767;
  2826. if(d > 32767)
  2827. d = 32767;
  2828. *pS++ = d;
  2829. SSumR[ns] += MixREVERBRight();
  2830. d = SSumR[ns] / voldiv;
  2831. SSumR[ns] = 0;
  2832. if(d < -32767)
  2833. d = -32767;
  2834. if(d > 32767)
  2835. d = 32767;
  2836. *pS++ = d;
  2837. }
  2838. InitREVERB();
  2839. // feed the sound
  2840. // wanna have around 1/60 sec (16.666 ms) updates
  2841. //temp fix: lowered for low latency alsa configs
  2842. if(iCycle++ > 8)
  2843. {
  2844. SBE->FeedStreamData((u8 *)pSpuBuffer,
  2845. ((unsigned char *)pS) -
  2846. ((unsigned char *)pSpuBuffer));
  2847. pS = (short *)pSpuBuffer;
  2848. iCycle = 0;
  2849. }
  2850. }
  2851. // end of big main loop...
  2852. bThreadEnded = 1;
  2853. return 0;
  2854. }
  2855. void SPUasync(unsigned long cycle)
  2856. {
  2857. // clear the watchdog
  2858. iWatchDog = 0;
  2859. // special mode, only used in Linux by this spu
  2860. // (or if you enable the experimental Windows mode)
  2861. if(iUseTimer == 2)
  2862. {
  2863. // no init, no call
  2864. if(!bSpuInit)
  2865. return;
  2866. // linux high-compat mode
  2867. MAINThread(0);
  2868. }
  2869. }
  2870. void SPUupdate(void)
  2871. {
  2872. SPUasync(0);
  2873. }
  2874. void SPUplayADPCMchannel(xa_decode_t *xap)
  2875. {
  2876. if(!iUseXA)
  2877. return;
  2878. if(!xap)
  2879. return;
  2880. if(!xap->freq)
  2881. return;
  2882. FeedXA(xap);
  2883. }
  2884. long SPUinit(void)
  2885. {
  2886. #ifdef DEBUG_OUTPUT
  2887. std::cout << "*** SPUinit()" << std::endl;
  2888. #endif
  2889. spuMemC = (unsigned char *)spuMem;
  2890. memset((void *)s_chan, 0, MAXCHAN * sizeof(SPUCHAN));
  2891. memset((void *)&rvb, 0, sizeof(REVERBInfo));
  2892. InitADSR();
  2893. return 0;
  2894. }
  2895. void SetupTimer(void)
  2896. {
  2897. // init some mixing buffers
  2898. memset(SSumR, 0, NSSIZE * sizeof(int));
  2899. memset(SSumL, 0, NSSIZE * sizeof(int));
  2900. // setup soundbuffer pointer
  2901. pS = (short *)pSpuBuffer;
  2902. // init thread vars
  2903. bEndThread = 0;
  2904. bThreadEnded = 0;
  2905. // flag: we are inited
  2906. bSpuInit = 1;
  2907. }
  2908. void RemoveTimer(void)
  2909. {
  2910. // raise flag to end thread
  2911. bEndThread = 1;
  2912. if(!iUseTimer)
  2913. {
  2914. int i = 0;
  2915. // wait until thread has ended
  2916. while(!bThreadEnded && i < 2000)
  2917. {
  2918. #ifndef _MSC_VER
  2919. usleep(10);
  2920. #else
  2921. Sleep(10);
  2922. #endif
  2923. // SDL_Delay(1000L);
  2924. i++;
  2925. }
  2926. }
  2927. // no more spu is running
  2928. bThreadEnded = 0;
  2929. bSpuInit = 0;
  2930. }
  2931. void SetupStreams(void)
  2932. {
  2933. int i;
  2934. // alloc mixing buffer
  2935. pSpuBuffer = (unsigned char *)malloc(32768);
  2936. if(iUseReverb == 1)
  2937. i = 88200 * 2;
  2938. else
  2939. i = NSSIZE * 2;
  2940. // alloc reverb buffer
  2941. sRVBStart = (int *)malloc(i * 4);
  2942. memset(sRVBStart, 0, i * 4);
  2943. sRVBEnd = sRVBStart + i;
  2944. sRVBPlay = sRVBStart;
  2945. // alloc xa buffer
  2946. XAStart = (u32 *)malloc(44100 * 4);
  2947. XAPlay = XAStart;
  2948. XAFeed = XAStart;
  2949. XAEnd = XAStart + 44100;
  2950. for(i = 0; i < MAXCHAN; i++)
  2951. {
  2952. // we don't use mutex sync... not needed, would only
  2953. // slow us down:
  2954. // init sustain
  2955. s_chan[i].ADSRX.SustainLevel = 1024;
  2956. s_chan[i].iMute = 0;
  2957. s_chan[i].iIrqDone = 0;
  2958. s_chan[i].pLoop = spuMemC;
  2959. s_chan[i].pStart = spuMemC;
  2960. s_chan[i].pCurr = spuMemC;
  2961. }
  2962. }
  2963. void RemoveStreams(void)
  2964. {
  2965. // free mixing buffer
  2966. free(pSpuBuffer);
  2967. pSpuBuffer = NULL;
  2968. // free reverb buffer
  2969. free(sRVBStart);
  2970. sRVBStart = 0;
  2971. // free xa buffer
  2972. free(XAStart);
  2973. XAStart = 0;
  2974. }
  2975. long SPUopen(void)
  2976. {
  2977. #ifdef DEBUG_OUTPUT
  2978. std::cout << "*** SPUopen()" << std::endl;
  2979. #endif
  2980. // security for some stupid main emus
  2981. if(bSPUIsOpen)
  2982. return 0;
  2983. iUseXA = 1;
  2984. iVolume = 3;
  2985. iReverbOff = -1;
  2986. spuIrq = 0;
  2987. spuAddr = 0xffffffff;
  2988. bEndThread = 0;
  2989. bThreadEnded = 0;
  2990. spuMemC = (unsigned char *)spuMem;
  2991. memset((void *)s_chan, 0, (MAXCHAN + 1) * sizeof(SPUCHAN));
  2992. pSpuIrq = 0;
  2993. iSPUIRQWait = 1;
  2994. SBE = new SoundBackendSDL();
  2995. // prepare streaming
  2996. SetupStreams();
  2997. // timer for feeding data
  2998. SetupTimer();
  2999. bSPUIsOpen = 1;
  3000. return PSE_SPU_ERR_SUCCESS;
  3001. }
  3002. void SPUsetConfigFile(char * pCfg)
  3003. {
  3004. #ifdef DEBUG_OUTPUT
  3005. std::cout << "*** SPUsetConfigFile()" << std::endl;
  3006. #endif
  3007. // pConfigFile = pCfg;
  3008. }
  3009. long SPUclose(void)
  3010. {
  3011. #ifdef DEBUG_OUTPUT
  3012. std::cout << "*** SPUclose()" << std::endl;
  3013. #endif
  3014. // security
  3015. if(!bSPUIsOpen)
  3016. return 0;
  3017. bSPUIsOpen = 0;
  3018. RemoveTimer();
  3019. if(SBE != NULL)
  3020. delete SBE;
  3021. RemoveStreams();
  3022. return 0;
  3023. }
  3024. long SPUshutdown(void)
  3025. {
  3026. #ifdef DEBUG_OUTPUT
  3027. std::cout << "*** SPUshutdown()" << std::endl;
  3028. #endif
  3029. return 0;
  3030. }
  3031. long SPUtest(void)
  3032. {
  3033. #ifdef DEBUG_OUTPUT
  3034. std::cout << "*** SPUtest()" << std::endl;
  3035. #endif
  3036. return 0;
  3037. }
  3038. long SPUconfigure(void)
  3039. {
  3040. #ifdef DEBUG_OUTPUT
  3041. std::cout << "*** SPUconfigure()" << std::endl;
  3042. #endif
  3043. //G StartCfgTool("CFG");
  3044. return 0;
  3045. }
  3046. void SPUabout(void)
  3047. {
  3048. #ifdef DEBUG_OUTPUT
  3049. std::cout << "*** SPUabout()" << std::endl;
  3050. #endif
  3051. //G StartCfgTool("ABOUT");
  3052. }
  3053. void SPUregisterCallback(void (*callback)(void))
  3054. {
  3055. #ifdef DEBUG_OUTPUT
  3056. std::cout << "*** SPUregisterCallback()" << std::endl;
  3057. #endif
  3058. irqCallback = callback;
  3059. }
  3060. void SPUregisterCDDAVolume(void (*CDDAVcallback)(unsigned short,unsigned short))
  3061. {
  3062. #ifdef DEBUG_OUTPUT
  3063. std::cout << "*** SPUregisterCDDAVolume()" << std::endl;
  3064. #endif
  3065. cddavCallback = CDDAVcallback;
  3066. }
  3067. unsigned short SPUgetOne(unsigned long val)
  3068. {
  3069. #ifdef DEBUG_OUTPUT
  3070. std::cout << "*** SPUgetOne()" << std::endl;
  3071. #endif
  3072. if(spuAddr != 0xffffffff)
  3073. {
  3074. return SPUreadDMA();
  3075. }
  3076. if(val >= 512 * 1024)
  3077. val = 512 * 1024 - 1;
  3078. return spuMem[val >> 1];
  3079. }
  3080. void SPUputOne(unsigned long val, unsigned short data)
  3081. {
  3082. #ifdef DEBUG_OUTPUT
  3083. std::cout << "*** SPUputOne()" << std::endl;
  3084. #endif
  3085. if(spuAddr != 0xffffffff)
  3086. {
  3087. SPUwriteDMA(data);
  3088. return;
  3089. }
  3090. if(val >= 512 * 1024)
  3091. val = 512 * 1024 - 1;
  3092. spuMem[val >> 1] = data;
  3093. }
  3094. void SPUplaySample(unsigned char ch)
  3095. {
  3096. #ifdef DEBUG_OUTPUT
  3097. std::cout << "*** SPUplaySample()" << std::endl;
  3098. #endif
  3099. }
  3100. void SPUsetAddr(unsigned char ch, unsigned short waddr)
  3101. {
  3102. #ifdef DEBUG_OUTPUT
  3103. std::cout << "*** SPUsetAddr()" << std::endl;
  3104. #endif
  3105. s_chan[ch].pStart = spuMemC + ((unsigned long)waddr << 3);
  3106. }
  3107. void SPUsetPitch(unsigned char ch, unsigned short pitch)
  3108. {
  3109. #ifdef DEBUG_OUTPUT
  3110. std::cout << "*** SPUsetPitch()" << std::endl;
  3111. #endif
  3112. SetPitch(ch, pitch);
  3113. }
  3114. void SPUsetVolumeL(unsigned char ch, short vol)
  3115. {
  3116. #ifdef DEBUG_OUTPUT
  3117. std::cout << "*** SPUsetVolumeL()" << std::endl;
  3118. #endif
  3119. SetVolumeR(ch, vol);
  3120. }
  3121. void SPUsetVolumeR(unsigned char ch, short vol)
  3122. {
  3123. #ifdef DEBUG_OUTPUT
  3124. std::cout << "*** SPUsetVolumeR()" << std::endl;
  3125. #endif
  3126. SetVolumeL(ch, vol);
  3127. }
  3128. void SPUstartChannels1(unsigned short channels)
  3129. {
  3130. #ifdef DEBUG_OUTPUT
  3131. std::cout << "*** SPUstartChannels1()" << std::endl;
  3132. #endif
  3133. SoundOn(0, 16, channels);
  3134. }
  3135. void SPUstartChannels2(unsigned short channels)
  3136. {
  3137. #ifdef DEBUG_OUTPUT
  3138. std::cout << "*** SPUstartChannels2()" << std::endl;
  3139. #endif
  3140. SoundOn(16, 24, channels);
  3141. }
  3142. void SPUstopChannels1(unsigned short channels)
  3143. {
  3144. #ifdef DEBUG_OUTPUT
  3145. std::cout << "*** SPUstopChannels1()" << std::endl;
  3146. #endif
  3147. SoundOff(0, 16, channels);
  3148. }
  3149. void SPUstopChannels2(unsigned short channels)
  3150. {
  3151. #ifdef DEBUG_OUTPUT
  3152. std::cout << "*** SPUstopChannels2()" << std::endl;
  3153. #endif
  3154. SoundOff(16, 24, channels);
  3155. }
  3156. void SPUplaySector(unsigned long mode, unsigned char *p)
  3157. {
  3158. #ifdef DEBUG_OUTPUT
  3159. std::cout << "*** SPUplaySector()\n" << std::endl;
  3160. #endif
  3161. // no XA
  3162. if(!iUseXA)
  3163. return;
  3164. }
  3165. u32 GGetTime()
  3166. {
  3167. #ifndef _MSC_VER
  3168. // well, maybe there are better ways
  3169. // to do that, but at least it works
  3170. struct timeval tv;
  3171. gettimeofday(&tv, 0);
  3172. return tv.tv_sec * 1000 + tv.tv_usec / 1000;
  3173. #else
  3174. return ::GetTickCount(); // TODO FIX ME, probably wrong
  3175. #endif
  3176. }