From 99ccf835b8050017e590492f0a2370e3262ea92f Mon Sep 17 00:00:00 2001 From: zeromus Date: Sun, 4 Apr 2010 09:06:29 +0000 Subject: [PATCH] add soundview toys --- desmume/src/NDSSystem.h | 2 ++ desmume/src/SPU.cpp | 45 ++++++++++++++++++++++++++---- desmume/src/windows/resource.h | 6 +++- desmume/src/windows/resources.rc | Bin 911536 -> 913086 bytes desmume/src/windows/soundView.cpp | 27 ++++++++++++++++-- 5 files changed, 70 insertions(+), 10 deletions(-) diff --git a/desmume/src/NDSSystem.h b/desmume/src/NDSSystem.h index 14abcf053..9c4905acb 100644 --- a/desmume/src/NDSSystem.h +++ b/desmume/src/NDSSystem.h @@ -496,6 +496,7 @@ extern struct TCommonSettings { , spu_advanced(false) , rigorous_timing(false) , advanced_timing(true) + , spu_captureMuted(false) { strcpy(ARM9BIOS, "biosnds9.bin"); strcpy(ARM7BIOS, "biosnds7.bin"); @@ -557,6 +558,7 @@ extern struct TCommonSettings { int manualBackupType; bool spu_muteChannels[16]; + bool spu_captureMuted; bool spu_advanced; struct _ShowGpu { diff --git a/desmume/src/SPU.cpp b/desmume/src/SPU.cpp index de7d8b0ba..836f22c1f 100644 --- a/desmume/src/SPU.cpp +++ b/desmume/src/SPU.cpp @@ -1036,6 +1036,7 @@ static void SPU_MixAudio_Advanced(bool actuallyMix, SPU_struct *SPU, int length) SPU->sndbuf[1] = 0; SPU->buflength = 1; + s32 capmix[2] = {0,0}; s32 chanout[16]; s32 submix[32]; @@ -1047,12 +1048,27 @@ static void SPU_MixAudio_Advanced(bool actuallyMix, SPU_struct *SPU, int length) if (chan->status == CHANSTAT_PLAY) { SPU->bufpos = 0; - - bool domix = actuallyMix && !CommonSettings.spu_muteChannels[i]; + bool bypass = false; if(i==1 && SPU->regs.ctl_ch1bypass) bypass=true; if(i==3 && SPU->regs.ctl_ch3bypass) bypass=true; + bool domix = !CommonSettings.spu_muteChannels[i]; + bool docapmix = true; + if(!domix) { + bypass = true; + if(CommonSettings.spu_captureMuted) + { + domix = true; + docapmix = true; + } + } + if(!actuallyMix) { + domix = false; + bypass = true; + } + + //save our old mix accumulators so we can generate a clean panned sample s32 save[] = {SPU->sndbuf[0],SPU->sndbuf[1]}; SPU->sndbuf[0] = SPU->sndbuf[1] = 0; @@ -1069,13 +1085,26 @@ static void SPU_MixAudio_Advanced(bool actuallyMix, SPU_struct *SPU, int length) SPU->sndbuf[0] = save[0]; SPU->sndbuf[1] = save[1]; + //mix sample into our capture mix + if(docapmix) + { + capmix[0] += submix[i*2]; + capmix[1] += submix[i*2+1]; + } + //mix in this sample, unless we were bypassing it - if(!bypass) + if(bypass) + { + submix[i*2]=0; + submix[i*2+1]=0; + } + else { SPU->sndbuf[0] += submix[i*2]; SPU->sndbuf[1] += submix[i*2+1]; } + } else { @@ -1083,9 +1112,10 @@ static void SPU_MixAudio_Advanced(bool actuallyMix, SPU_struct *SPU, int length) submix[i*2] = 0; submix[i*2+1] = 0; } - } + } //foreach channel s32 mixout[2] = {SPU->sndbuf[0],SPU->sndbuf[1]}; + s32 capmixout[2] = {capmix[0],capmix[1]}; s32 sndout[2]; s32 capout[2]; @@ -1108,13 +1138,13 @@ static void SPU_MixAudio_Advanced(bool actuallyMix, SPU_struct *SPU, int length) //generate capture output ("capture bugs" from gbatek are not emulated) if(SPU->regs.cap[0].source==0) - capout[0] = mixout[0]; //cap0 = L-mix + capout[0] = capmixout[0]; //cap0 = L-mix else if(SPU->regs.cap[0].add) capout[0] = chanout[0] + chanout[1]; //cap0 = ch0+ch1 else capout[0] = chanout[0]; //cap0 = ch0 if(SPU->regs.cap[1].source==0) - capout[1] = mixout[1]; //cap1 = R-mix + capout[1] = capmixout[1]; //cap1 = R-mix else if(SPU->regs.cap[1].add) capout[1] = chanout[2] + chanout[3]; //cap1 = ch2+ch3 else capout[1] = chanout[2]; //cap1 = ch2 @@ -1144,6 +1174,9 @@ static void SPU_MixAudio_Advanced(bool actuallyMix, SPU_struct *SPU, int length) if(cap.bits8) { s8 sample8 = sample>>8; + static FILE* fCapOut = NULL; + if(!fCapOut) fCapOut = fopen("d:\\capout.raw","wb"); + fwrite(&sample8,1,1,fCapOut); if(skipcap) _MMU_write08<1,MMU_AT_DMA>(cap.runtime.curdad,0); else _MMU_write08<1,MMU_AT_DMA>(cap.runtime.curdad,sample8); cap.runtime.curdad++; diff --git a/desmume/src/windows/resource.h b/desmume/src/windows/resource.h index 19eb69be8..95647a470 100644 --- a/desmume/src/windows/resource.h +++ b/desmume/src/windows/resource.h @@ -361,7 +361,11 @@ #define IDC_SNDCTRL_CH1NOMIX 1029 #define IDC_TXT_VERSION 1030 #define IDC_SNDCTRL_CH3NOMIX 1030 +#define IDC_SOUND_CAPTURE_MUTED 1031 +#define IDC_SOUND_ANALYZE_CAP 1032 #define IDC_ADDONS_LIST 1033 +#define IDC_BUTTON3 1033 +#define IDC_SOUND_UNMUTE_ALL 1033 #define IDC_ADDONS_INFO 1034 #define IDC_BORDER 1034 #define IDC_BBROWSE 1035 @@ -911,7 +915,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 121 #define _APS_NEXT_COMMAND_VALUE 40079 -#define _APS_NEXT_CONTROL_VALUE 1029 +#define _APS_NEXT_CONTROL_VALUE 1033 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/desmume/src/windows/resources.rc b/desmume/src/windows/resources.rc index 0a9d58f408b055fe64aef752de5119e999bf6b98..16c5fec35e3e6ffbf68fb7ee4edb579ffa48f8ba 100644 GIT binary patch delta 2686 zcmeH}Ur19?9LIlWyLWfHyVFF{@=tD=X|`n3O%qcT(Q25AY2+W+hMEpCEEBS~G8BA} zh0u{oDrnM!)Pm|zjX;7PddT^hWUN4XiF)a+!hZMa-9nsCJt+Bb;M_02`@QGf&-eb$ z4bGRmS}X}Z)F!&X3;j6GK{pIQH!W}Hhlh(fR?HFIUET(lz|I=(6AM|L&*licPSy8` zQGITP2&z7HP|Q*5El)_gsyDnKQN7F|s`}H%TvWbS7M0mtRm|qPOHj+%m2k|a&lRh` z)flVKdQX1l(D6Z0PyI{A{WPIRl+ycP5H8|AyTA;c(5viP-uGD;pq2nhO?5*xR6!#& zLkl!P4Y=V1&YJ1$RbwtS-_aKsi@*t1Wt398PuxlUr^#MgX)tg}Ui2A)%jjoD8+@yZ zr^Stq^*HLF71|Wfm1kI?2uh$7tkgazl_$0!0d;+5sG3OnolI>3qR(>U3hGzZq1-Jy z)!`b7pio|id^c9kYf_kPnS>s#1a2%$~x3$iVI3J47*#S1B zWkp`HnLM-8^KUiwxXdv#@t8X?Gw4KpQ`+2-3hr42A532Zmm=JJ7HQ>OgnGW1xU>rx zEcpXBLmnK(c&gV!z>c)@r?h+i7S}2IU@>-)v>J5i!HD~?P4p^WEl>a_aZq%*Hah9y z*`!DJ`L!CDSfto?(?Do)lhQ>5at;d&rECxeKi-y@u-!LL|?S`sLIf4$5_ZVvW0AEdU{KTBGE~g#foGv5(+|xbt;A&Z delta 2506 zcmdmY*L=f8^9}2m*`B8Aq|fV`?x4Zl)a<~r-GPOXZGmtAgA+qALp%`sGWY{w2!qG= zjS5_fj96s~mol=lVU>BPj!VzNHH_@o^_;)Uql(=gTLUg>?0RC&xNzuE+|7tXkK;i` z9C|L=;j-tW3od&Keb{l>GckxAhdqjacyQ=(Wa7o4XMG6QZ`H{;;$qVe)Nsw3EMUH9 zdfZ$_j_vapnJU&nBXhe#B5M*Oo37vAFks9|#IS0$AK1vW{lG@%Ek;!tf5^YnRUBDGTWoWSfd(eLfJlA26$|zdl|63Mw@qm!1isE*)=Yp#3dwp#jYB> zH27?=6PhkyJV-?UN#)r7CzW%