home *** CD-ROM | disk | FTP | other *** search
/ Chip 2005 November / CDVD1105.ISO / Software / Freeware / programare / bass / c / dsptest / Dsptest.c next >
Encoding:
C/C++ Source or Header  |  2005-09-21  |  5.8 KB  |  221 lines

  1. // BASS simple DSP test, copyright (c) 2000-2005 Ian Luck.
  2.  
  3. #include <windows.h>
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include "bass.h"
  7.  
  8. HWND win;
  9.  
  10. DWORD floatable; // floating-point channel support?
  11. DWORD chan;    // the channel... HMUSIC or HSTREAM
  12.  
  13. OPENFILENAME ofn;
  14. char path[MAX_PATH];
  15.  
  16. /* display error messages */
  17. void Error(char *es)
  18. {
  19.     char mes[200];
  20.     sprintf(mes,"%s\n(error code: %d)",es,BASS_ErrorGetCode());
  21.     MessageBox(win,mes,"Error",0);
  22. }
  23.  
  24.  
  25. /* "rotate" */
  26. HDSP rotdsp=0;    // DSP handle
  27. float rotpos;    // cur.pos
  28. void CALLBACK Rotate(HDSP handle, DWORD channel, void *buffer, DWORD length, DWORD user)
  29. {
  30.     float *d=(float*)buffer;
  31.     DWORD a;
  32.  
  33.     for (a=0;a<length/4;a+=2) {
  34.         d[a]*=fabs(sin(rotpos));
  35.         d[a+1]*=fabs(cos(rotpos));
  36.         rotpos=fmod(rotpos+0.00003,3.1415927);
  37.     }
  38. }
  39.  
  40. /* "echo" */
  41. HDSP echdsp=0;    // DSP handle
  42. #define ECHBUFLEN 1200    // buffer length
  43. float echbuf[ECHBUFLEN][2];    // buffer
  44. int echpos;    // cur.pos
  45. void CALLBACK Echo(HDSP handle, DWORD channel, void *buffer, DWORD length, DWORD user)
  46. {
  47.     float *d=(float*)buffer;
  48.     DWORD a;
  49.  
  50.     for (a=0;a<length/4;a+=2) {
  51.         float l=d[a]+(echbuf[echpos][1]/2);
  52.         float r=d[a+1]+(echbuf[echpos][0]/2);
  53. #if 1 // 0=echo, 1=basic "bathroom" reverb
  54.         echbuf[echpos][0]=d[a]=l;
  55.         echbuf[echpos][1]=d[a+1]=r;
  56. #else
  57.         echbuf[echpos][0]=d[a];
  58.         echbuf[echpos][1]=d[a+1];
  59.         d[a]=l;
  60.         d[a+1]=r;
  61. #endif
  62.         echpos++;
  63.         if (echpos==ECHBUFLEN) echpos=0;
  64.     }
  65. }
  66.  
  67. /* "flanger" */
  68. HDSP fladsp=0;    // DSP handle
  69. #define FLABUFLEN 350    // buffer length
  70. float flabuf[FLABUFLEN][2];    // buffer
  71. int flapos;    // cur.pos
  72. float flas,flasinc;    // sweep pos/increment
  73. void CALLBACK Flange(HDSP handle, DWORD channel, void *buffer, DWORD length, DWORD user)
  74. {
  75.     float *d=(float*)buffer;
  76.     DWORD a;
  77.  
  78.     for (a=0;a<length/4;a+=2) {
  79.         int p1=(flapos+(int)flas)%FLABUFLEN;
  80.         int p2=(p1+1)%FLABUFLEN;
  81.         float f=flas-(int)flas;
  82.         float s;
  83.  
  84.         s=(d[a]+((flabuf[p1][0]*(1-f))+(flabuf[p2][0]*f)))*0.7;
  85.         flabuf[flapos][0]=d[a];
  86.         d[a]=s;
  87.  
  88.         s=(d[a+1]+((flabuf[p1][1]*(1-f))+(flabuf[p2][1]*f)))*0.7;
  89.         flabuf[flapos][1]=d[a+1];
  90.         d[a+1]=s;
  91.  
  92.         flapos++;
  93.         if (flapos==FLABUFLEN) flapos=0;
  94.         flas+=flasinc;
  95.         if (flas<0 || flas>FLABUFLEN-1) {
  96.             flasinc=-flasinc;
  97.             flas+=flasinc;
  98.         }
  99.     }
  100. }
  101.  
  102.  
  103. #define MESS(id,m,w,l) SendDlgItemMessage(win,id,m,(WPARAM)w,(LPARAM)l)
  104.  
  105. BOOL CALLBACK dialogproc(HWND h,UINT m,WPARAM w,LPARAM l)
  106. {
  107.     switch (m) {
  108.         case WM_COMMAND:
  109.             switch (LOWORD(w)) {
  110.                 case IDCANCEL:
  111.                     DestroyWindow(h);
  112.                     break;
  113.                 case 10:
  114.                     {
  115.                         BASS_CHANNELINFO info;
  116.                         char file[MAX_PATH]="";
  117.                         ofn.lpstrFilter="playable files\0*.mo3;*.xm;*.mod;*.s3m;*.it;*.mtm;*.umx;*.mp3;*.mp2;*.mp1;*.ogg;*.wav;*.aif\0All files\0*.*\0\0";
  118.                         ofn.lpstrFile=file;
  119.                         if (GetOpenFileName(&ofn)) {
  120.                             memcpy(path,file,ofn.nFileOffset);
  121.                             path[ofn.nFileOffset-1]=0;
  122.                             // free both MOD and stream, it must be one of them! :)
  123.                             BASS_MusicFree(chan);
  124.                             BASS_StreamFree(chan);
  125.                             if (!(chan=BASS_StreamCreateFile(FALSE,file,0,0,BASS_SAMPLE_LOOP|floatable))
  126.                                 && !(chan=BASS_MusicLoad(FALSE,file,0,0,BASS_MUSIC_LOOP|BASS_MUSIC_RAMPS|floatable,0))) {
  127.                                 // whatever it is, it ain't playable
  128.                                 MESS(10,WM_SETTEXT,0,"click here to open a file...");
  129.                                 Error("Can't play the file");
  130.                                 break;
  131.                             }
  132.                             BASS_ChannelGetInfo(chan,&info);
  133.                             if (info.chans!=2) { // only stereo is allowed
  134.                                 MESS(10,WM_SETTEXT,0,"click here to open a file...");
  135.                                 BASS_MusicFree(chan);
  136.                                 BASS_StreamFree(chan);
  137.                                 Error("only stereo sources are supported");
  138.                                 break;
  139.                             }
  140.                             MESS(10,WM_SETTEXT,0,file);
  141.                             // setup DSPs on new channel and play it
  142.                             SendMessage(win,WM_COMMAND,11,0);
  143.                             SendMessage(win,WM_COMMAND,12,0);
  144.                             SendMessage(win,WM_COMMAND,13,0);
  145.                             BASS_ChannelPlay(chan,FALSE);
  146.                         }
  147.                     }
  148.                     break;
  149.                 case 11: // toggle "rotate"
  150.                     if (MESS(11,BM_GETCHECK,0,0)) {
  151.                         rotpos=0.7853981f;
  152.                         rotdsp=BASS_ChannelSetDSP(chan,&Rotate,0,2);
  153.                     } else
  154.                         BASS_ChannelRemoveDSP(chan,rotdsp);
  155.                     break;
  156.                 case 12: // toggle "echo"
  157.                     if (MESS(12,BM_GETCHECK,0,0)) {
  158.                         memset(echbuf,0,sizeof(echbuf));
  159.                         echpos=0;
  160.                         echdsp=BASS_ChannelSetDSP(chan,&Echo,0,1);
  161.                     } else
  162.                         BASS_ChannelRemoveDSP(chan,echdsp);
  163.                     break;
  164.                 case 13: // toggle "flanger"
  165.                     if (MESS(13,BM_GETCHECK,0,0)) {
  166.                         memset(flabuf,0,sizeof(flabuf));
  167.                         flapos=0;
  168.                         flas=FLABUFLEN/2;
  169.                         flasinc=0.002f;
  170.                         fladsp=BASS_ChannelSetDSP(chan,&Flange,0,0);
  171.                     } else
  172.                         BASS_ChannelRemoveDSP(chan,fladsp);
  173.                     break;
  174.             }
  175.             break;
  176.  
  177.         case WM_INITDIALOG:
  178.             win=h;
  179.             GetCurrentDirectory(MAX_PATH,path);
  180.             memset(&ofn,0,sizeof(ofn));
  181.             ofn.lStructSize=sizeof(ofn);
  182.             ofn.hwndOwner=h;
  183.             ofn.nMaxFile=MAX_PATH;
  184.             ofn.lpstrInitialDir=path;
  185.             ofn.Flags=OFN_HIDEREADONLY|OFN_EXPLORER;
  186.             // enable floating-point DSP
  187.             BASS_SetConfig(BASS_CONFIG_FLOATDSP,TRUE);
  188.             // initialize - default device
  189.             if (!BASS_Init(-1,44100,0,win,NULL)) {
  190.                 Error("Can't initialize device");
  191.                 DestroyWindow(win);
  192.                 break;
  193.             }
  194.             // check for floating-point capability
  195.             floatable=BASS_StreamCreate(44100,2,BASS_SAMPLE_FLOAT,NULL,0);
  196.             if (floatable) { // woohoo!
  197.                 BASS_StreamFree(floatable);
  198.                 floatable=BASS_SAMPLE_FLOAT;
  199.             }
  200.             return 1;
  201.  
  202.         case WM_DESTROY:
  203.             BASS_Free();
  204.             break;
  205.     }
  206.     return 0;
  207. }
  208.  
  209. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
  210. {
  211.     // Check that BASS 2.2 was loaded
  212.     if (BASS_GetVersion()!=MAKELONG(2,2)) {
  213.         MessageBox(0,"BASS version 2.2 was not loaded","Incorrect BASS.DLL",0);
  214.         return 0;
  215.     }
  216.  
  217.     DialogBox(hInstance,(char*)1000,0,&dialogproc);
  218.  
  219.     return 0;
  220. }
  221.