home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 April / PCWorld_2007-04_cd.bin / audio-video / kmplayer / kmp.exe / SDK / KMPPlgIn.pas < prev    next >
Pascal/Delphi Source File  |  2003-05-13  |  10KB  |  223 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. //          KMP┐δ ┐└╡≡┐└/║±╡≡┐└ ╟├╖»▒╫└╬ └╬┼═╞Σ└╠╜║
  4. //
  5. //  KMP└╟ ╟├╖»▒╫└╬ ╕≡╡Γ└║ └⌐╛┌╟┴└╟ DSP╟├╖»▒╫└╬░·
  6. // ▒╕┴╢░í ░┼└╟ ░░┤┘. ┐└╡≡┐└ ╟├╖»▒╫└╬└╟ ░µ┐∞┤┬ └╚╛┌╟┴┐═ ▒╕┴╢░í
  7. // ░░▒Γ ╢º╣«┐í └⌐╛┌╟┴└╟ DSP╟├╖»▒╫└╬└╗ KMP┐í╝¡ ╗τ┐δ╟╧┤┬ ░═└╠ ░í┤╔╟╧┤┘.
  8. // ║±╡≡┐└ ╟├╖»▒╫└╬└╟ ░µ┐∞╡╡ ░┼└╟ ║±╜┴╟╧╣╟╖╬ ╜▒░╘ └█╝║╟╥╝÷░í └╓└╗░═└╠┤┘.
  9. // ▒╫╕«░φ ╟╘╝÷ ▒╘╛α└╠ cdel└╠┤┘.. ┬ⁿ░φ...
  10. //
  11. // ┐╡╗≤╟├╖»▒╫└╬└╟ ░µ┐∞┤┬ WaSaVi┐═ ┤▐╢≤┴│┤┘... ╢╟╟╤ ┬ⁿ░φ...
  12. //
  13. /////////////////////////////////////////////////////////////////////////////
  14.  
  15. unit KMPPlgIn;
  16.  
  17. interface
  18.  
  19. uses
  20.   Windows;
  21.  
  22. // header version: 0x20 == 0.20 == winamp 2.0
  23.  
  24. const
  25. DSP_HDRVER = $20;
  26.  
  27.  
  28. // DSP plugin interface
  29.  
  30. // notes:
  31. // any window that remains in foreground should optimally pass unused
  32. // keystrokes to the parent (winamp's) window, so that the user
  33. // can still control it. As for storing configuration,
  34. // Configuration data should be stored in <dll directory>\plugin.ini
  35. // (look at the vis plugin for configuration code)
  36.  
  37. type
  38. //////////////////////////////////////////////////////////////////////////////
  39. //
  40. // Audio PlugIn Type...(same as Winamp DSP PlugIn Type...)
  41. //
  42. // └⌐╛┌╟┴└╟ DSP╟┴╖»▒╫└╬░· ▒╕┴╢░í 100%└╧─í╟╤┤┘.
  43. //////////////////////////////////////////////////////////////////////////////
  44.  
  45.  PwinampDSPModule = ^TwinampDSPModule;
  46.  TwinampDSPModule = record
  47.    description : pchar;        // description
  48.    hwndParent : HWND;          // parent window (filled in by calling app)
  49.    hDllInstance : LongWord;    // instance handle to this DLL (filled in by calling app)
  50.  
  51.    Config : procedure(this_mod : PwinampDSPModule); cdecl;  // configuration dialog (if needed)
  52.    Init : function(this_mod : PwinampDSPModule) : integer; cdecl;      // 0 on success, creates window, etc (if needed)
  53.  
  54.   // modify waveform samples: returns number of samples to actually write
  55.   // (typically numsamples, but no more than twice numsamples, and no less than half numsamples)
  56.   // numsamples should always be at least 128. should, but I'm not sure
  57.    ModifySamples : function(this_mod : PwinampDSPModule;samples : PByte;
  58.      numsamples,bps,nch,srate : integer) : integer; cdecl;
  59.    // └⌐╛┌╟┴┐í╝¡ ╗τ┐δ╟╧┤┬ └╜╝║└╗ ║»░µ╟╧┤┬ ╟╘╝÷...
  60.    // samples : ╗∙╟├└╠ ╡Θ╛ε░í └╓┤┬ ╣÷╞█
  61.    // numsamples : ╗∙╟├└╟ ░╣╝÷(╜╟┴·└√└╬ ╣÷╞█└╟ ▒µ└╠░í ╛╞┤╧╢≤ ╗∙╟├└╟ ░╣╝÷└╙...
  62.    // bps : ╗∙╟├┤τ ║±╞«╝÷ 8 or 16
  63.    // nch : ├ñ│╬╝÷ 1 : ╕≡│δ  , 2 : ╜║╞«╖╣┐└
  64.    // srate : ╗∙╟├╕╡ ╖╣└╠╞« 44000╡ε╡ε..
  65.    // └╠╟╘╝÷┐í╝¡ ╕«┼╧░¬└╠ ║»░µ╟╤ ╡Ñ└╠┼╕└╟ ░╣╝÷└╠┤┘. ╢╟╟╤ ╜╟┴·└√└╕╖╬ ├Γ╖┬└╕╖╬
  66.    // │¬░í┤┬ ░╣╝÷└╠▒Γ╡╡ ╟╧┤┘. └⌐╛┌╟┴┐í╝¡ ┼╫╜║╞«╟╤ ░µ┐∞┤┬ └╘╖┬╣▐└║ ╗∙╟├║╕┤┘
  67.    // ╕╣░╘╟╪╡╡ ╡┐└█└╗ ╟╧┐┤┤┘. ╡√╢≤╝¡ KMP┐í╝¡╡╡ └╘╖┬║╕┤┘ 3-4╣Φ┴ñ╡╡└╟
  68.    // ╕▐╕≡╕«╕ª │╗║╬└√└╕╖╬ ╟╥┤τ└╗ ╟╪│⌡╛╥┤┘. ▒╫╖»╣╟╖╬ 3-4╣Φ └╠╗≤└╗ ├│╕«╟╧╕Θ ┐└╖∙░í
  69.    // └╧╛ε│»╝÷╡╡ └╓┤┘...
  70.    //
  71.  
  72.    Quit : procedure(this_mod : PwinampDSPModule); cdecl;    // called when unloading
  73.  
  74.    userData : Pointer; // user data, optional
  75.  end;
  76.  
  77.  
  78.  PwinampDSPHeader = ^TwinampDSPHeader;
  79.  TwinampDSPHeader = record
  80.    version : integer;       // DSP_HDRVER
  81.    description : pchar; // description of library
  82.    winampDSPModule : function(num : integer) : PwinampDSPModule; cdecl;    // module retrieval function
  83.  end;
  84.  
  85. ////////////////////////////////////
  86. // Audio PlugIn DLL Exports Name...
  87. ////////////////////////////////////
  88. //function winampDSPGetHeader2 : PwinampDSPHeader; cdecl;
  89. // └╜╝║ DLL┐í╝¡ Exports╟╪╛▀ ╡╟┤┬ ╟╘╝÷└╟ ╟ⁿ╜─
  90. // ┴∩ └º└╟ ╟╘╝÷╕ª │δ├Γ╜├─╤╛▀ ╟╤┤┘....
  91.  
  92.  
  93.  
  94.  
  95.  
  96. ////////////////////////////////////////////////////////////////////////////
  97. //
  98. // Video PlugIn Type( Modifyed from Winamp DSP Plugin type ...)
  99. //
  100. // └⌐╛┌╟┴└╟ DSP╟├╖»▒╫└╬└╟ ▒╕┴╢╕ª ┴╢▒▌ ║»░µ╟╪╝¡ KMP└╟ ║±╡≡┐└
  101. // ╟├╖»▒╫└╬└╗ ╗τ┐δ╟╤┤┘.
  102. ////////////////////////////////////////////////////////////////////////////
  103.  
  104. const
  105.  IID_IYV12ImageProcessor : TGUID = '{249F44BC-B8BF-411F-B047-D9C017DFECF2}';
  106.  
  107.  
  108. type
  109.  // KMP┐í╝¡ ┴ª░°╡╟┤┬ ╚¡╗≤└╟ ▒╕┴╢
  110.  // KMP┐í╝¡┤┬ ╟├╖╣└╬ YV12└╠╣╠┴÷└╟ ▒╕┴╢╕ª ╗τ┐δ╟╤┤┘.
  111.  // Y└╟ ┼⌐▒Γ┤┬ └╠╣╠┴÷└╟ ┼⌐▒Γ┐═ ░░░φ,
  112.  // U,V└╟ ┼⌐▒Γ┤┬ ░í╖╬░í 2╣Φ└█░φ, ╝╝╖╬░í 2╣Φ└█┤┘.
  113.  // ┴∩ U,V└╟ ┼⌐▒Γ┤┬ Y└╟ ┼⌐▒Γ║╕┤┘ 4╣Φ░í └█┤┘.
  114.  PkmpYV12Image = ^TkmpYV12Image;
  115.  TkmpYV12Image = record
  116.    Width, Height : integer; // ░í╖╬, ╝╝╖╬└╟ ┼⌐▒Γ // ░í╖╬└╟ ░µ┐∞┤┬ 16└╟ ╣Φ╝÷░í ╡╟╛ε╛▀ ╡╩...
  117.    y_plain : pChar; // Y╟├╖╣└╬ ╣÷╞█, ┼⌐▒Γ:Width*Height
  118.    u_plain : pChar; // U╟├╖╣└╬ ╣÷╞█, ┼⌐▒Γ:Width*Height/4
  119.    v_plain : pChar; // V╟├╖╣└╬ ╣÷╞█, ┼⌐▒Γ:Width*Height/4
  120.    YMask : pChar;    // ┼⌡╕φ└╗ └º╟╤ Y╕╢╜║┼⌐ │╗║╬└√└╕╖╬ ╗τ┐δ
  121.    UVMask : pChar;    // ┼⌡╕φ└╗ └º╟╤ UV╕╢╜║┼⌐ │╗║╬└√└╕╖╬ ╗τ┐δ
  122.  end;
  123.  
  124.  IkmpYV12ImageProcessor = interface
  125.  // YV12└╠╣╠┴÷╕ª ░ⁿ╕«╟╧░φ ├│╕«╟╧┤┬╡Ñ ╡╡┐≥└╗ ┴╓┤┬ └╬┼═╞Σ└╠╜║
  126.  // ╟÷└τ RGB32,24,565,555└╟ DIB└╠╣╠┴÷╕╕ ┴÷┐°╟╤┤┘.
  127.  // ╡¿╞─└╠└╟ ░µ┐∞┤┬ DelphiX└╟ TDIB│¬ TBitmap└╟ DIB╕ª └╠┐δ╟╧╕Θ
  128.  // ╜▒░╘ DIB┐═ YV12Image╕ª ├│╕«╟╥╝÷░í └╓┤┘.
  129.  // ┐╣┴ª╕ª ┬ⁿ░φ╟╧▒Γ ╣┘╢≈...
  130.  ['{249F44BC-B8BF-411F-B047-D9C017DFECF2}']
  131.    function kmpAllocYV12Image(width,height : integer;out pImage : PkmpYV12Image) : HResult; stdcall;
  132.             // width, height└╟ ┼⌐▒Γ╖╬ YV12Image▒╕┴╢├╝╕ª ╕╕╡τ┤┘...
  133.             // 2└╟ ╣Φ╝÷╖╬ ┴ñ╖─└╠ ╡╟╛ε └╓╛ε╛▀ ╡╟░φ,
  134.             // ░í┤╔╟╧╕Θ 16└╟ ╣Φ╝÷░í ╡╟╛ε └╓╛ε╛▀╕╕ ╛╚┴ñ╟╧░╘ ╡┐└█╟╤┤┘.
  135.             // AllocYV12Image╖╬ ╕╕╡τ░═└║ ╛╞╖í└╟ FreeYV12Image╖╬ ╟╪┴ª╕ª ╟╪╛▀ ╡╚┤┘.
  136.    function kmpFreeYV12Image(var pImage : PkmpYV12Image) : HResult; stdcall;
  137.             // AllocYV12Image╖╬ ╕╕╡τ └╠╣╠┴÷╕ª ╟╪┴ª ╟╤┤┘.
  138.    function kmpCopyYV12Image(pSrc,pDst : PkmpYV12Image) : HResult; stdcall;
  139.             // YV12Image╕ª ║╣╗τ╟╤┤┘.
  140.    function kmpRGB32ToYV12(DIB32 : pByte; Width, Height : integer;pImage : PkmpYV12Image) : HResult; stdcall;
  141.    function kmpRGB24ToYV12(DIB24 : pByte; Width, Height : integer;pImage : PkmpYV12Image) : HResult; stdcall;
  142.    function kmpRGB565ToYV12(DIB565 : pByte; Width, Height : integer;pImage : PkmpYV12Image) : HResult; stdcall;
  143.    function kmpRGB555ToYV12(DIB555 : pByte; Width, Height : integer;pImage : PkmpYV12Image) : HResult; stdcall;
  144.             // RGB╞≈╕Σ(DIB)└╗ YV12└╠╣╠┴÷╖╬ ╣┘▓█┤┘.
  145.    function kmpYV12ToRGB32(pImage : PkmpYV12Image; DIB32 : pByte; Width, Height : integer) : HResult; stdcall;
  146.    function kmpYV12ToRGB24(pImage : PkmpYV12Image; DIB24 : pByte; Width, Height : integer) : HResult; stdcall;
  147.    function kmpYV12ToRGB565(pImage : PkmpYV12Image; DIB565 : pByte; Width, Height : integer) : HResult; stdcall;
  148.    function kmpYV12ToRGB555(pImage : PkmpYV12Image; DIB555 : pByte; Width, Height : integer) : HResult; stdcall;
  149.             // YV12Image└╟ ╟ⁿ╜─└╕╖╬ ╡╚░═└╗ RGB(DIB)└╟ ╟ⁿ╜─└╕╖╬ ╣┘▓█┤┘.
  150.             // └╠╢º Height┐í └╜└╟╝÷╕ª │╓╛ε┴╓╕Θ ╚¡╕Θ└╠ ╡┌┴²╛ε┴«╝¡ │¬┐┬┤┘.
  151.             // Width┤┬ ╛τ╕╕ ┴÷┐°╟╘...
  152.    function kmpYV12NormalDraw(Src,Dst : PkmpYV12Image;SRect : PRect;dx,dy : integer) : HResult; stdcall;
  153.             // ╛╞╣½╖▒ ╚┐░· ╛°└╠ └╠╣╠┴÷╕ª ▒╫╕░┤┘.
  154.    function kmpYV12BlendDraw(Src,Dst : PkmpYV12Image;SRect : PRect;dx,dy : integer;alpha : integer) : HResult; stdcall;
  155.             // ╣▌┼⌡╕φ╚┐░·╖╬ └╠╣╠┴÷╕ª ▒╫╕░┤┘. 0<=alpha<=255
  156.    function kmpYV12TransDraw(Src,Dst : PkmpYV12Image;SRect : PRect;dx,dy : integer) : HResult; stdcall;
  157.             // ╣Φ░µ╗÷└╗ ┼⌡╕φ└╕╖╬ ▒╫╕░┤┘. ╣Φ░µ╗÷└║ 0╣°┬░ ╗÷└╗ ▒Γ┴╪└╕╖╬ ╟╤┤┘.
  158.    function kmpYV12BlendTransDraw(Src,Dst : PkmpYV12Image;SRect : PRect;dx,dy : integer;alpha : integer) : HResult; stdcall;
  159.             // ╣Φ░µ╗÷└╗ ┼⌡╕φ└╕╖╬ ▒╫╕«░φ ╣▌┼⌡╕φ╚┐░·╖╬ ▒╫╕░┤┘. 0<=alpha<=255
  160.  end;
  161.  
  162.  
  163.  PkmpDSPModule = ^TkmpDSPModule;
  164.  TkmpDSPModule = record
  165.    description : pchar;        // description
  166.    hwndParent : HWND;          // parent window (filled in by calling app)
  167.    hDllInstance : LongWord;    // instance handle to this DLL (filled in by calling app)
  168.  
  169.    Config : procedure(this_mod : PkmpDSPModule); cdecl;  // configuration dialog (if needed)
  170.    Init : function(this_mod : PkmpDSPModule) : integer; cdecl;      // 0 on success, creates window, etc (if needed)
  171.  
  172.    BeforeModifyImage : function(this_mod : PkmpDSPModule;image : PkmpYV12Image;
  173.      ewidth : integer) : integer; cdecl; // ┤⌡║φ╗∙╟├└ⁿ┐í ║╥╕«┤┬ ╟╘╝÷
  174.    // kmp┐í╝¡ ╗τ┐δ╟╧┤┬ ┐╡╗≤└╗ ║»░µ╟╧┤┬ ╟╘╝÷...
  175.    // image : └╠╣╠┴÷└╟ ╣÷╞█, └º┐í╝¡ ╝│╕φ
  176.    // ewidth : ╜╟┴·└√└╬ └╠╣╠┴÷└╟ ░í╖╬ ▒µ└╠
  177.    // image└╟ width┤┬ ╟╥┤τ╡╚ └╠╣╠┴÷└╟ ░í╖╬▒µ└╠└╠┤┘.
  178.    // ╜╟┴·└√└╬░═░· ╟╥┤τ└√└╬░═└╠ ┬≈└╠░í │¬┤┬ └╠└»┤┬ ╟╩┼═╡Θ└╠ ┐¼░ß╡╔╢º┐í┤┬
  179.    // ╣÷╞█░í ┴ñ╖─└╠ ╡╟╛ε └╓╛ε╛▀ ╡╩... ╡√╢≤╝¡ ╜╟┴ª╖╬ ┐╡╗≤└╠ ╡Θ╛ε░í └╓┤┬ ▒µ└╠┐═
  180.    // ╟╥┤τ╡╚ ╣÷╞█└╟ ▒µ└╠░í ╞▓╖┴┴÷░╘╡╩...
  181.    // ║╕┼δ ╚¡╗≤└╗ ├│╕«╟╧┤┬ ░µ┐∞┤┬ ║░╖╬ ╜┼░µ└╗ ╛╩╛▓╡╡ ╡╟┴÷╕╕ ┴┬┐∞╕ª ╡┌┴²┤┬ ░µ┐∞┤┬
  182.    // ┐╡╗≤└╟ │í└╗ ╛╦╛╞╛▀╡╟▒Γ ╢º╣«┐í ╞─╢≤╕▐┼═╖╬ │╤░▄┴╪┤┘...
  183.    // ┴∩ image└╟ width=ewidth+?? ┐⌐▒Γ╝¡ ??┤┬ ├▀░í ╣┘└╠╞«╖╬ ┴ñ╖─└╗ └º╟╪╝¡ ├▀░í╡╚ ╣┘└╠╞«└╠┤┘.
  184.    // ╝╝╖╬┐í╝¡┤┬ ┴ñ╖─└╠ ╟╩┐Σ░í ╛°┤┘.
  185.    // ┐╡╗≤└║ ┼⌐▒Γ╕ª ║»░µ╟╥╝÷░í ╛°┤┘.
  186.    // ╕«┼╧░¬└║ └╓┴÷╕╕ ├│╕«╟╧┴÷ ╛╩╛╞╡╡ ╡╚┤┘.
  187.    AfterModifyImage : function(this_mod : PkmpDSPModule;image : PkmpYV12Image;
  188.      ewidth : integer) : integer; cdecl; // ┤⌡║φ╗∙╟├╚─┐í ║╥╕«┤┬ ╟╘╝÷
  189.    // ╞─╢≤╣╠┼═┤┬ └º┐═ ░░└╜.
  190.    // BeforeModifyImage└╟ ░µ┐∞┤┬ ┤⌡║φ╗∙╟├└╠ ╡┐└█╟╥╢º╕╕ ║╥╕«╛ε┴÷░╘ ╡╚┤┘.
  191.    // ╡√╢≤╝¡ ┴╗┤⌡║ⁿ╕Ñ └╠╣╠┴÷ ├│╕«╕ª └º╟╪╝¡┤┬ BeforeModifyImage╕ª
  192.    // ├│╕«╟╧╕Θ ╡╚┤┘.
  193.    // ┴∩ ┤⌡║φ╗∙╟├ ╡┐└█╜├  BeforeModifyImage -> AfterModifyImage
  194.    //             ╛╚╟╧╕Θ        AfterModifyImage
  195.    //  ├│╕«╕ª ╛╚╟╥╖┴╕Θ nil╖╬ ╝│┴ñ╟╧╕Θ ╡╩....
  196.    //
  197.    Quit : procedure(this_mod : PkmpDSPModule); cdecl;    // called when unloading
  198.  
  199.    userData : Pointer; // user data, optional
  200.    ImageProcessor : IkmpYV12ImageProcessor; // └╠╣╠┴÷ ├│╕«╕ª └º╟╤ └╬┼═╞Σ└╠╜║
  201.                                          // └º┐í╝¡ ╝│╕φ
  202.  end;
  203.  
  204.  
  205.  PkmpDSPHeader = ^TkmpDSPHeader;
  206.  TkmpDSPHeader = record
  207.    version : integer;       // DSP_HDRVER
  208.    description : pchar; // description of library
  209.    kmpDSPModule : function(num : integer) : PkmpDSPModule; cdecl;    // module retrieval function
  210.  end;
  211.  
  212. ///////////////////////////////////////
  213. // Video PlugIn DLL Exports...
  214. ///////////////////////////////////////
  215. //function kmpDSPGetHeader2 : PkmpDSPHeader; cdecl;
  216. // ┐╡╗≤ DLL┐í╝¡ Export╟╪╛▀╡╟┤┬ ╟╘╝÷└╟ ╟ⁿ╜─
  217. // ┴∩ └º└╟ ╟╘╝÷╕ª │δ├Γ╜├─╤╛▀ ╟╤┤┘....
  218.  
  219.  
  220. implementation
  221.  
  222. end.
  223.