260 lines
5.1 KiB
C++
260 lines
5.1 KiB
C++
|
////////////////////////////////////////////////////////////////////////////////
|
|||
|
// Plainamp Toolbar Vis Plugin
|
|||
|
//
|
|||
|
// Copyright <20> 2006 Sebastian Pipping <webmaster@hartwork.org>
|
|||
|
//
|
|||
|
// --> http://www.hartwork.org
|
|||
|
//
|
|||
|
// This source code is released under the GNU General Public License (GPL).
|
|||
|
// See GPL.txt for details. Any non-GPL usage is strictly forbidden.
|
|||
|
////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
#define WIN32_LEAN_AND_MEAN
|
|||
|
#include <windows.h>
|
|||
|
|
|||
|
|
|||
|
#include "../Winamp/vis.h"
|
|||
|
#include "../Winamp/wa_ipc.h"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#define PLUGIN_NAME "Plainamp Toolbar Vis Plugin"
|
|||
|
#define PLUGIN_VERSION "v0.5"
|
|||
|
|
|||
|
#define PLUGIN_DESC PLUGIN_NAME " " PLUGIN_VERSION
|
|||
|
|
|||
|
|
|||
|
|
|||
|
static char * szClassName = "PlainbarClass";
|
|||
|
|
|||
|
|
|||
|
|
|||
|
winampVisModule * getModule( int which );
|
|||
|
|
|||
|
|
|||
|
void config( struct winampVisModule * this_mod );
|
|||
|
int init( struct winampVisModule * this_mod );
|
|||
|
int render_spec( struct winampVisModule * this_mod );
|
|||
|
void quit( struct winampVisModule * this_mod );
|
|||
|
|
|||
|
|
|||
|
// Double buffering data
|
|||
|
HDC memDC = NULL; // Memory device context
|
|||
|
HBITMAP memBM = NULL; // Memory bitmap (for memDC)
|
|||
|
HBITMAP oldBM = NULL; // Old bitmap (from memDC)
|
|||
|
|
|||
|
|
|||
|
HWND hRender = NULL;
|
|||
|
int width = 0;
|
|||
|
int height = 0;
|
|||
|
bool bRunning = false;
|
|||
|
HPEN pen = NULL;
|
|||
|
|
|||
|
|
|||
|
WNDPROC WndprocTargetBackup = NULL;
|
|||
|
LRESULT CALLBACK WndprocTarget( HWND hwnd, UINT message, WPARAM wp, LPARAM lp );
|
|||
|
|
|||
|
|
|||
|
|
|||
|
winampVisHeader hdr = {
|
|||
|
VIS_HDRVER,
|
|||
|
PLUGIN_DESC,
|
|||
|
getModule
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
winampVisModule mod_spec =
|
|||
|
{
|
|||
|
"Default",
|
|||
|
NULL, // hwndParent
|
|||
|
NULL, // hDllInstance
|
|||
|
0, // sRate
|
|||
|
0, // nCh
|
|||
|
25, // latencyMS
|
|||
|
25, // delayMS
|
|||
|
2, // spectrumNch
|
|||
|
0, // waveformNch
|
|||
|
{ 0, }, // spectrumData
|
|||
|
{ 0, }, // waveformData
|
|||
|
config,
|
|||
|
init,
|
|||
|
render_spec,
|
|||
|
quit
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
extern "C" {
|
|||
|
#endif
|
|||
|
__declspec( dllexport ) winampVisHeader * winampVisGetHeader()
|
|||
|
{
|
|||
|
return &hdr;
|
|||
|
}
|
|||
|
#ifdef __cplusplus
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
winampVisModule * getModule( int which )
|
|||
|
{
|
|||
|
return which ? NULL : &mod_spec;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void config( struct winampVisModule * this_mod )
|
|||
|
{
|
|||
|
MessageBox(
|
|||
|
this_mod->hwndParent,
|
|||
|
PLUGIN_DESC "\n"
|
|||
|
"\n"
|
|||
|
"Copyright <20> 2006 Sebastian Pipping \n"
|
|||
|
"<webmaster@hartwork.org>\n"
|
|||
|
"\n"
|
|||
|
"--> http://www.hartwork.org",
|
|||
|
"About",
|
|||
|
MB_ICONINFORMATION
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LRESULT CALLBACK WndprocTarget( HWND hwnd, UINT message, WPARAM wp, LPARAM lp )
|
|||
|
{
|
|||
|
switch( message )
|
|||
|
{
|
|||
|
case WM_SIZE:
|
|||
|
width = LOWORD( lp );
|
|||
|
height = HIWORD( lp );
|
|||
|
break;
|
|||
|
|
|||
|
case WM_DESTROY:
|
|||
|
bRunning = false;
|
|||
|
PostQuitMessage( 0 );
|
|||
|
return 0;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return DefWindowProc( hwnd, message, wp, lp );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int init( struct winampVisModule * this_mod )
|
|||
|
{
|
|||
|
if( !this_mod ) return 1;
|
|||
|
|
|||
|
// Register message
|
|||
|
const int IPC_GETPLAINBARTARGET = ( int )SendMessage( this_mod->hwndParent, WM_WA_IPC, ( WPARAM )"IPC_GETPLAINBARTARGET", IPC_REGISTER_WINAMP_IPCMESSAGE );
|
|||
|
if( IPC_GETPLAINBARTARGET <= 0 ) return 1;
|
|||
|
|
|||
|
// Get render parent
|
|||
|
HWND hRenderParent = ( HWND )SendMessage( this_mod->hwndParent, WM_WA_IPC, 0, IPC_GETPLAINBARTARGET );
|
|||
|
if( !IsWindow( hRenderParent ) ) return 1;
|
|||
|
|
|||
|
// Plug our child in
|
|||
|
WNDCLASS wc;
|
|||
|
ZeroMemory( &wc, sizeof( WNDCLASS ) );
|
|||
|
wc.lpfnWndProc = WndprocTarget;
|
|||
|
wc.hInstance = this_mod->hDllInstance;
|
|||
|
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
|
|||
|
wc.lpszClassName = szClassName;
|
|||
|
|
|||
|
if( !RegisterClass( &wc ) ) return 1;
|
|||
|
|
|||
|
RECT r;
|
|||
|
GetClientRect( hRenderParent, &r );
|
|||
|
width = r.right - r.left;
|
|||
|
height = r.bottom - r.top;
|
|||
|
|
|||
|
hRender = CreateWindowEx(
|
|||
|
0,
|
|||
|
szClassName,
|
|||
|
"",
|
|||
|
WS_CHILD | WS_VISIBLE,
|
|||
|
0,
|
|||
|
0,
|
|||
|
width,
|
|||
|
height,
|
|||
|
hRenderParent,
|
|||
|
NULL,
|
|||
|
this_mod->hDllInstance,
|
|||
|
0
|
|||
|
);
|
|||
|
|
|||
|
if( !hRender )
|
|||
|
{
|
|||
|
UnregisterClass( szClassName, this_mod->hDllInstance );
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
// Create doublebuffer
|
|||
|
const HDC hdc = GetDC( hRender );
|
|||
|
memDC = CreateCompatibleDC( hdc );
|
|||
|
memBM = CreateCompatibleBitmap( hdc, 576, 256 );
|
|||
|
oldBM = ( HBITMAP )SelectObject( memDC, memBM );
|
|||
|
ReleaseDC( hRender, hdc );
|
|||
|
|
|||
|
pen = CreatePen( PS_SOLID, 0, GetSysColor( COLOR_APPWORKSPACE ) );
|
|||
|
|
|||
|
bRunning = true;
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int render_spec( struct winampVisModule * this_mod )
|
|||
|
{
|
|||
|
// Clear background
|
|||
|
RECT rect = { 0, 0, 576, 256 };
|
|||
|
FillRect(memDC, &rect, ( HBRUSH )( COLOR_3DFACE + 1 ) );
|
|||
|
|
|||
|
// Draw analyser
|
|||
|
SelectObject( memDC, pen );
|
|||
|
for( int x = 0; x < 576; x++ )
|
|||
|
{
|
|||
|
int val = 0;
|
|||
|
|
|||
|
for( int y = 0; y < this_mod->nCh; y++ )
|
|||
|
{
|
|||
|
if( this_mod->spectrumData[ y ][ x ] > val )
|
|||
|
{
|
|||
|
val = this_mod->spectrumData[ y ][ x ];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
MoveToEx( memDC, x, 256, NULL );
|
|||
|
LineTo( memDC, x, 256 - val );
|
|||
|
}
|
|||
|
|
|||
|
// Copy doublebuffer to window
|
|||
|
HDC hdc = GetDC( hRender );
|
|||
|
StretchBlt( hdc, 0, 0, width, height, memDC, 0, 0, 576, 256, SRCCOPY );
|
|||
|
ReleaseDC( hRender, hdc );
|
|||
|
|
|||
|
return bRunning ? 0 : 1;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void quit( struct winampVisModule * this_mod )
|
|||
|
{
|
|||
|
if( bRunning )
|
|||
|
{
|
|||
|
DestroyWindow( hRender );
|
|||
|
}
|
|||
|
|
|||
|
UnregisterClass( szClassName, this_mod->hDllInstance );
|
|||
|
|
|||
|
// Delete doublebuffer
|
|||
|
SelectObject( memDC, oldBM );
|
|||
|
DeleteObject( memDC );
|
|||
|
DeleteObject( memBM );
|
|||
|
|
|||
|
DeleteObject( pen );
|
|||
|
}
|