int WDL_ConvolutionEngine_Div::Avail(int wantSamples) { timingEnter(1); int wso=wantSamples; int x; #ifdef WDLCONVO_ZL_ACCOUNTING int cnt=0; static int maxcnt=-1; int h=0; #endif for (x = 0; x < m_engines.GetSize(); x ++) { WDL_ConvolutionEngine *eng=m_engines.Get(x); #ifdef WDLCONVO_ZL_ACCOUNTING eng->m_zl_fftcnt=0; #endif int a=eng->Avail(wso+eng->m_zl_dumpage) - eng->m_zl_dumpage; #ifdef WDLCONVO_ZL_ACCOUNTING cnt += !!eng->m_zl_fftcnt; #if 0 if (eng->m_zl_fftcnt) h|=1<<x; if (eng->m_zl_fftcnt && x==m_engines.GetSize()-1 && cnt>1) { char buf[512]; wsprintf(buf,"fft flags=%08x (%08x=max)\n",h,1<<x); OutputDebugString(buf); } #endif #endif if (a < wantSamples) wantSamples=a; } #ifdef WDLCONVO_ZL_ACCOUNTING static DWORD lastt=0; if (cnt>maxcnt)maxcnt=cnt; if (GetTickCount()>lastt+1000) { lastt=GetTickCount(); char buf[512]; wsprintf(buf,"maxcnt=%d\n",maxcnt); OutputDebugString(buf); maxcnt=-1; } #endif if (wantSamples>0) { WDL_FFT_REAL *tp[WDL_CONVO_MAX_PROC_NCH]; for (x =0; x < m_proc_nch; x ++) { memset(tp[x]=(WDL_FFT_REAL*)m_samplesout[x].Add(NULL,wantSamples*sizeof(WDL_FFT_REAL)),0,wantSamples*sizeof(WDL_FFT_REAL)); } for (x = 0; x < m_engines.GetSize(); x ++) { WDL_ConvolutionEngine *eng=m_engines.Get(x); if (eng->m_zl_dumpage>0) { eng->Advance(eng->m_zl_dumpage); eng->m_zl_dumpage=0; } WDL_FFT_REAL **p=eng->Get(); if (p) { int i; for (i =0; i < m_proc_nch; i ++) { WDL_FFT_REAL *o=tp[i]; WDL_FFT_REAL *in=p[i]; int j=wantSamples; while (j-->0) *o++ += *in++; } } eng->Advance(wantSamples); } } timingLeave(1); int av=m_samplesout[0].Available()/sizeof(WDL_FFT_REAL); return av>wso ? wso : av; }
void C_THISCLASS::smp_render(int this_thread, int max_threads, char visdata[2][2][576], int isBeat, int *framebuffer, int *fbout, int w, int h) { if (!enabled) return; unsigned int *f = (unsigned int *) framebuffer; unsigned int *of = (unsigned int *) fbout; unsigned int *lfo = (unsigned int *) lastframe; int start_l = ( this_thread * h ) / max_threads; int end_l; if (this_thread >= max_threads - 1) end_l = h; else end_l = ( (this_thread+1) * h ) / max_threads; int outh=end_l-start_l; if (outh<1) return; int skip_pix=start_l*w; f += skip_pix; of+= skip_pix; lfo += skip_pix; int at_top=0, at_bottom=0; if (!this_thread) at_top=1; if (this_thread >= max_threads - 1) at_bottom=1; timingEnter(0); { if (at_top) // top line { int x; // left edge { int r=_R(f[1]); int g=_G(f[1]); int b=_B(f[1]); r += _R(f[w]); g += _G(f[w]); b += _B(f[w]); f++; r-=_R(lfo[0]); g-=_G(lfo[0]); b-=_B(lfo[0]); lfo++; if (r < 0) r=0; else if (r > 255) r=255; if (g < 0) g=0; else if (g > 255*256) g=255*256; if (b < 0) b=0; else if (b > 255*65536) b=255*65536; *of++=_RGB(r,g,b); } // middle of line x=(w-2); while (x--) { int r=_R(f[1]); int g=_G(f[1]); int b=_B(f[1]); r += _R(f[-1]); g += _G(f[-1]); b += _B(f[-1]); r += _R(f[w]); g += _G(f[w]); b += _B(f[w]); f++; r/=2; g/=2; b/=2; r-=_R(lfo[0]); g-=_G(lfo[0]); b-=_B(lfo[0]); lfo++; if (r < 0) r=0; else if (r > 255) r=255; if (g < 0) g=0; else if (g > 255*256) g=255*256; if (b < 0) b=0; else if (b > 255*65536) b=255*65536; *of++=_RGB(r,g,b); } // right block { int r=_R(f[-1]); int g=_G(f[-1]); int b=_B(f[-1]); r += _R(f[w]); g += _G(f[w]); b += _B(f[w]); f++; r-=_R(lfo[0]); g-=_G(lfo[0]); b-=_B(lfo[0]); lfo++; if (r < 0) r=0; else if (r > 255) r=255; if (g < 0) g=0; else if (g > 255*256) g=255*256; if (b < 0) b=0; else if (b > 255*65536) b=255*65536; *of++=_RGB(r,g,b); } } // middle block { int y=outh-at_top-at_bottom; while (y--) { int x; // left edge { int r=_R(f[1]); int g=_G(f[1]); int b=_B(f[1]); r += _R(f[w]); g += _G(f[w]); b += _B(f[w]); r += _R(f[-w]); g += _G(f[-w]); b += _B(f[-w]); f++; r/=2; g/=2; b/=2; r-=_R(lfo[0]); g-=_G(lfo[0]); b-=_B(lfo[0]); lfo++; if (r < 0) r=0; else if (r > 255) r=255; if (g < 0) g=0; else if (g > 255*256) g=255*256; if (b < 0) b=0; else if (b > 255*65536) b=255*65536; *of++=_RGB(r,g,b); } // middle of line x=(w-2); #ifdef NO_MMX while (x--) { int r=_R(f[1]); int g=_G(f[1]); int b=_B(f[1]); r += _R(f[-1]); g += _G(f[-1]); b += _B(f[-1]); r += _R(f[w]); g += _G(f[w]); b += _B(f[w]); r += _R(f[-w]); g += _G(f[-w]); b += _B(f[-w]); f++; r/=2; g/=2; b/=2; r-=_R(lfo[0]); g-=_G(lfo[0]); b-=_B(lfo[0]); lfo++; if (r < 0) r=0; else if (r > 255) r=255; if (g < 0) g=0; else if (g > 255*256) g=255*256; if (b < 0) b=0; else if (b > 255*65536) b=255*65536; *of++=_RGB(r,g,b); } #else __asm { mov esi, f mov edi, of mov edx, lfo mov ecx, x mov ebx, w shl ebx, 2 shr ecx, 1 sub esi, ebx align 16 mmx_water_loop1: movd mm0, [esi+ebx+4] movd mm1, [esi+ebx-4] punpcklbw mm0, [zero] movd mm2, [esi+ebx*2] punpcklbw mm1, [zero] movd mm3, [esi] punpcklbw mm2, [zero] movd mm4, [edx] paddw mm0, mm1 punpcklbw mm3, [zero] movd mm7, [esi+ebx+8] punpcklbw mm4, [zero] paddw mm2, mm3 movd mm6, [esi+ebx] paddw mm0, mm2 psrlw mm0, 1 punpcklbw mm7, [zero] movd mm2, [esi+ebx*2+4] psubw mm0, mm4 movd mm3, [esi+4] packuswb mm0, mm0 movd [edi], mm0 punpcklbw mm6, [zero] movd mm4, [edx+4] punpcklbw mm2, [zero] paddw mm7, mm6 punpcklbw mm3, [zero] punpcklbw mm4, [zero] paddw mm2, mm3 paddw mm7, mm2 add edx, 8 psrlw mm7, 1 add esi, 8 psubw mm7, mm4 packuswb mm7, mm7 movd [edi+4], mm7 add edi, 8 dec ecx jnz mmx_water_loop1 add esi, ebx mov f, esi mov of, edi mov lfo, edx }; #endif // right block { int r=_R(f[-1]); int g=_G(f[-1]); int b=_B(f[-1]); r += _R(f[w]); g += _G(f[w]); b += _B(f[w]); r += _R(f[-w]); g += _G(f[-w]); b += _B(f[-w]); f++; r/=2; g/=2; b/=2; r-=_R(lfo[0]); g-=_G(lfo[0]); b-=_B(lfo[0]); lfo++; if (r < 0) r=0; else if (r > 255) r=255; if (g < 0) g=0; else if (g > 255*256) g=255*256; if (b < 0) b=0; else if (b > 255*65536) b=255*65536; *of++=_RGB(r,g,b); } } } // bottom line if (at_bottom) { int x; // left edge { int r=_R(f[1]); int g=_G(f[1]); int b=_B(f[1]); r += _R(f[-w]); g += _G(f[-w]); b += _B(f[-w]); f++; r-=_R(lfo[0]); g-=_G(lfo[0]); b-=_B(lfo[0]); lfo++; if (r < 0) r=0; else if (r > 255) r=255; if (g < 0) g=0; else if (g > 255*256) g=255*256; if (b < 0) b=0; else if (b > 255*65536) b=255*65536; *of++=_RGB(r,g,b); } // middle of line x=(w-2); while (x--) { int r=_R(f[1]); int g=_G(f[1]); int b=_B(f[1]); r += _R(f[-1]); g += _G(f[-1]); b += _B(f[-1]); r += _R(f[-w]); g += _G(f[-w]); b += _B(f[-w]); f++; r/=2; g/=2; b/=2; r-=_R(lfo[0]); g-=_G(lfo[0]); b-=_B(lfo[0]); lfo++; if (r < 0) r=0; else if (r > 255) r=255; if (g < 0) g=0; else if (g > 255*256) g=255*256; if (b < 0) b=0; else if (b > 255*65536) b=255*65536; *of++=_RGB(r,g,b); } // right block { int r=_R(f[-1]); int g=_G(f[-1]); int b=_B(f[-1]); r += _R(f[-w]); g += _G(f[-w]); b += _B(f[-w]); f++; r-=_R(lfo[0]); g-=_G(lfo[0]); b-=_B(lfo[0]); lfo++; if (r < 0) r=0; else if (r > 255) r=255; if (g < 0) g=0; else if (g > 255*256) g=255*256; if (b < 0) b=0; else if (b > 255*65536) b=255*65536; *of++=_RGB(r,g,b); } } } memcpy(lastframe+skip_pix,framebuffer+skip_pix,w*outh*sizeof(int)); #ifndef NO_MMX __asm emms; #endif timingLeave(0); } C_RBASE *R_Water(char *desc) { if (desc) { strcpy(desc,MOD_NAME); return NULL; } return (C_RBASE *) new C_THISCLASS(); } static C_THISCLASS *g_this; static BOOL CALLBACK g_DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: if (g_this->enabled) CheckDlgButton(hwndDlg,IDC_CHECK1,BST_CHECKED); return 1; case WM_COMMAND: if (LOWORD(wParam) == IDC_CHECK1) { if (IsDlgButtonChecked(hwndDlg,IDC_CHECK1)) g_this->enabled=1; else g_this->enabled=0; } return 0; } return 0; } HWND C_THISCLASS::conf(HINSTANCE hInstance, HWND hwndParent) { g_this = this; return CreateDialog(hInstance,MAKEINTRESOURCE(IDD_CFG_WATER),hwndParent,g_DlgProc); }