Click here to Skip to main content
Licence CPOL
First Posted 1 Jul 2003
Views 54,151
Bookmarked 28 times

Messagemod: A Winamp 3.x plugin

By | 1 Jul 2003 | Article
Adds the windowsmessage support to Winamp 3.x with a WAC plugin

Sample Image - WinAmpMessageMod.gif

Introduction

Many people use Winamp as their main mp3 player, and some have switched from Winamp 2.xx to Winamp 3.xx. Since Winamp 2.xx used the simple WM_COMMAND, WM_USER and WM_COPYDATA to control play, pause, stop etc, many other programs could control Winamp too.

In the 3.xx version of Winamp, the windows-messages was removed from the player, as we know it. Messagemod is a plugin (WAC) that adds the old functionality. I usually program in MFC, so this library is primarily made with MFC.

Messagemod is not complete with ALL the functions, but it has the basics. If you don't want to learn how to code it yourself, just download the "Winamp 2x Plugin Manager" from Winamp's homepage, that will give you all the functionality that the old 2.xx has.

What is needed

Download the Wasabi SDK from http://www.winamp.com/nsdn/

When you have installed (unpacked) it to somewhere (Default: C:\Wasabi SDK) please read the few text files under the \docs directory to get some info about the SDK before starting. (I'll guess that you won't find it useful now, but maybe later)

Now compile the projects:

  • \Studio - This is the BFC project (project file is not in the bfc directory). Output: bfc.lib
  • \Studio\waclient - Output: waclient.lib

Unpack the sourcecode in the directory: \Studio\Examples\MessageMod

Add waclient.lib and bfc.lib to the project.

Before you try to compile the, please check the paths in settings for debug and working folder. Also check the "Post-build step" and change it to your new paths. 

We use Winamp 3.x (studio.exe) as the debug component. (So we can get all the TRACE messages)

What is a WAC?

A WAC is just a renamed DLL file. I guess Nullsoft guys wanted to see the difference between a component and system dll's. :)

Using the code

MessageMod.cpp and MessageMod.h:

In these files we have 2 classes; CMessageModApp and WACNAME. I have let the WACNAME remain unchanged as they are in the examples. Just because it would be easy to compare with other examples. Thanks for the easy template Nullsoft.

The class CMessageModApp class takes care of the MFC bit of the project. The output is a shared DLL MFC dll compilation. 
The class WACNAME takes care of the Winamp 3.xx bit of the project. I've added some useful overrides like "runlevelcb_onShutdown", but it is kept as simple as possible.

Winamp 3.xx makes a window called "STUDIO". The old Winamp 2.xx made a window called "Winamp 1.x". To handle that I've made a dummy window that is named the same. The window created is global, and the handling of the WM-commands are also global.

It is the dummy window that does all the magic, look at the easy windowproc:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, 
                            LPARAM lParam)
{
  switch(uMsg)
  {
    case WM_CREATE:
      return 0;

    case WM_PAINT: //The window will show transparent, to avoid it:   
                   // A simple paint routine.
    {
      RECT r;
      GetClientRect(hwnd, &r);

      BeginPaint(hwnd, NULL);
      FillRect(GetDC(hwnd), &r, (HBRUSH) GetStockObject(GRAY_BRUSH));
      EndPaint(hwnd, NULL);
      return 0;
    }
    case WM_COMMAND: //This calls the HandleWMCommand routine to 
                     //handle Winamp stuff
    {
      int res=HandleWMCommand(hwnd, wParam,lParam);
      return res;
    }
    case WM_USER: //This calls the HandleWMUser routine to handle 
                  //Winamp stuff
    {
      int res=HandleWMUser(hwnd, wParam,lParam);
      return res;
    }
  }
  return DefWindowProc(hwnd, uMsg, wParam, lParam); 
  //Default window message...
}

The functions HandleWMCommand and HandleWMUser handles the different messages. This article will not explain how to use the the Wasabi SDK. It will just show you how it is done. It takes some time to be able to handle the Wasabi. To learn it you'll have to work some hours. It is clever to use Winamps forums also.

When you have compiled the code and Winamp3 is started you must make a simple program to send WM_COMMAND and WM_USER messages to the dummy window.

HWND Winamp=::FindWindow("Winamp 1.x",NULL);

if(Winamp==NULL)

    Winamp=::FindWindow("Winamp 3.x",NULL);

::SendMessage(Winamp, WM_COMMAND, WINAMP_PLAY, NULL);

Now with this code above you should be able to press play from an other program. The WinampDefs.h is a complete list over commands. The comments here gives an overview of what is added or not.

Known issues

Many of the functions that is depending to be in the same process as Winamp. All of these functions has been removed, since pointers are not available through processes.

If messages are sent before the STUDIO window is created it will crash. Winamp 3.x loads the plug-ins before the main window.

Updates

Due lack of time many of the features are not implemented, but can easily been done. So if someone feels like finishing it, please do so. Mail me if you want to publish it here as updated code, with your credits of course! :)

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Lars [Large] Werner

Engineer

Norway Norway

Member

Thnx for viewing my article...
 
Check out some of my projects:
 
http://lars.werner.no/sizeme/ - Ultimate tool for maximize your output on CD/DVDs!
 
http://lars.werner.no/unpacker/ - Auto extract of multiple archives (RAR/ZIP) with queue support and cleanup options!
 
Visit http://lars.werner.no/ for more info!


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Generalmessage in wmp Pinmemberrvasu3:55 26 Feb '06  
GeneralRe: message in wmp PinmemberLars [Large] Werner5:36 26 Feb '06  
GeneralWith Winamp5 this plugin is not needed Pinmembervantassel16:03 26 Dec '03  
GeneralRe: Difference between Winamp 3 and Winamp 5 PinmemberLars [Large] Werner20:46 26 Dec '03  
GeneralCan't compile Pinmembervantassel10:31 26 Dec '03  
GeneralRe: Can't compile Pinmembervantassel11:27 26 Dec '03  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web03 | 2.5.120517.1 | Last Updated 2 Jul 2003
Article Copyright 2003 by Lars [Large] Werner
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid