I thought there already was one? Maybe I'm mistaken.
I've spent hours searching for one, and never found more than a simple request.
@Quik: Yup, used that when I had trillian.
The majority of Gaim users with skill in C++ programming are Linux users. Theres about 20 xMMs plugins out there.
(13:56:49) Newby1337: I am listening to 10590. Exodus - Fabulous Disaster (3:03 / 4:55 192kbps)
Suckers. :)(14:05:34) Jimmy: I am listening to 1171. Sugarcult - I Changed My Name (0:00 / 5:40 [stopped] 0kbps)
<3 Ron.Quote(13:56:49) Newby1337: I am listening to 10590. Exodus - Fabulous Disaster (3:03 / 4:55 192kbps)
Q. Why isn't the Windows version free?There you have it :)
A. Building X-Chat for Windows is a difficult process, it requires quite some skill and expertise to accomplish. It takes time, and is by no means automated.
The problem is that Windows discourages hobby coders. If somebody is going to invest the hardware and money required to develop software on Windows, they need some kind of return on it. That's why you rarely see free Windows programs.
Compiling stuff on Windows takes a lot of set up and configuration, and is over all not fun. On Linux or Bsd or Unix, I cd into the plugins folder, and tyep "make <pluginname>.so", and it automatically compiled it. On Windows, I'm not sure what you have to do, but I have yet to figure it out.
So yeah, Windows is too difficult to compile software on.
As another example, from the xchat website:QuoteQ. Why isn't the Windows version free?There you have it :)
A. Building X-Chat for Windows is a difficult process, it requires quite some skill and expertise to accomplish. It takes time, and is by no means automated.
http://www.xchat.org/windows/
Could you guys not go off topic........... I just want to know isYes. A lot of work, but not unreasonable.
A) is it doable with reasonable amount of work?
B) If anyone is willing to do it?Probably not. People around here don't seem to care about Windows.
Probably not. People around here don't seem to care about Windows.
Could you guys not go off topic........... I just want to know isYes. A lot of work, but not unreasonable.
A) is it doable with reasonable amount of work?QuoteB) If anyone is willing to do it?Probably not. People around here don't seem to care about Windows.
If anybody is interested, however, I might be able to get some information on how to compile Gaim plugins for Windows. I don't want to bug the guy, but I will if somebody here wants me to find out.
I'm going to laugh when I end up being the one who writes this. -sigh-
char *GetWinampSongTitle(HWND Winamp, DWORD Index) // Winamp 2.04+, pointer is in local address space {
static char SongTitle[1024];
DWORD WinampProcessID;
HANDLE WinampProcess;
char *SongTitleRemote;
char *Ret = NULL; // Return value
GetWindowThreadProcessId(Winamp, &WinampProcessID); // get pid
if(WinampProcess = OpenProcess(PROCESS_VM_READ, FALSE, WinampProcessID)) { // open process
if(SongTitleRemote = GetWinampSongTitleRemote(Winamp, Index)) { // get pointer
if(ReadProcessMemory(WinampProcess, SongTitleRemote, SongTitle, sizeof(SongTitle), NULL)) { // read it
Ret = SongTitle; // success
}
}
CloseHandle(WinampProcess);
}
return Ret;
}
From yPlugin2.
Or you could use MinGW and do "gcc -c -DBUILD_DLL winamp_plugin.c; gcc -shared -o winamp_plugin.dll -Wl,--out-implib,libwinamp_plugin.a winamp_plugin.o"Don't forget, you have to add Gaim's libraries and include files. That's why make is handy.
#include <windows.h>
#include <stdio.h>
#include <iostream.h>
HWND__ *hwnd_winamp;
const long IPC_ISPLAYING = 104;
const long IPC_GETOUTPUTTIME = 105;
const long IPC_SETPLAYLISTPOS = 121;
const long IPC_SETVOLUME = 122;
const long IPC_GETLISTLENGTH = 124;
const long IPC_GETLISTPOS = 125;
const long IPC_GETINFO = 126;
const long IPC_GETPLAYLISTTITLE = 212;
const long WM_WA_IPC = 0x400;
const long WA_DIALOGJUMPTOFILE = 0x9D02;
const long WA_SENDCUSTOMDATA = 0x111;
const long WINAMP_BUTTON1 = 40044;
const long WINAMP_BUTTON2 = 40045;
const long WINAMP_BUTTON3 = 40046;
const long WINAMP_BUTTON4 = 40047;
const long WINAMP_BUTTON5 = 40048;
const long xPROCESS_VM_READ = 0x10;
enum playState
{
paused,
playing,
stopped
};
void DoEvents();
long findwinamp();
playState getPlayState();
long GetPlayListLength();
long GetPlayListPosition();
void GetCurrentSongPosition(char *&outbuf);
void GetSongLength(char *&outbuf);
bool JumpToFile(char *sFile);
long SetPlaylistPosition(int pos);
long SetVolume(int vol);
long GetBitrate();
long PrevTrack();
long PlayTrack();
long PauseTrack();
long StopTrack();
long NextTrack();
long GetWinampSongTitleRemote(int index);
char *GetWinampSongTitle(int index);
int main(int argc, char **argv)
{
// it's meant to be a command line driven program!
/*if(argc == 1 || (argc == 2 && argv[1] == "/?"))
{
printf("Invalid arguments. Use is \n\tclamp <switch> [extra]\n\n");
printf("\tSWITCHES\tDESCRIPTION\n");
printf("\t /?\t\tList this help\n");
return 1;
}*/
char *buffer = new char[1024];
// get winamp's handle
if(findwinamp() == 0)
{
printf("Error: winamp not found\n");
return 2;
}
// get the title of song 2414 in the playlist ^^
// best used with GetPlayListPosition()
cout << GetWinampSongTitle(2414) << endl;
// get the current playstate
playState check = getPlayState();
if(check == paused)
sprintf(buffer, "%s", "Winamp: Paused");
if(check == playing)
sprintf(buffer, "%s", "Winamp: Playing");
if(check == stopped)
sprintf(buffer, "%s", "Winamp: Stopped");
long pos = GetPlayListPosition();
long len = GetPlayListLength();
// start building the output
sprintf(buffer, "%s; [%i / %i] (", buffer, pos, len);
GetCurrentSongPosition(buffer);
sprintf(buffer, "%s)", buffer);
printf("%s\n", buffer);
return 0;
}
void DoEvents()
{
// stolen from the public DMBot source code
MSG Msg;
while(PeekMessage(&Msg,NULL,0,0,PM_REMOVE))
{
if(Msg.message == WM_QUIT) break;
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
long findwinamp()
{
hwnd_winamp = FindWindow("Winamp v1.x", NULL);
if(hwnd_winamp != 0)
return 1;
else
return 0;
}
playState getPlayState()
{
long res = SendMessage(hwnd_winamp, WM_WA_IPC, 0, IPC_ISPLAYING);
if(res == 0)
return stopped;
else if(res == 1)
return playing;
else
return paused;
}
long GetPlayListLength()
{
long ret = SendMessage(hwnd_winamp, WM_WA_IPC, 0, IPC_GETLISTLENGTH);
return ret;
}
long GetPlayListPosition()
{
long ret = SendMessage(hwnd_winamp, WM_WA_IPC, 0, IPC_GETLISTPOS) + 1;
return ret;
}
void GetCurrentSongPosition(char *&outbuf)
{
long sec = 0;
long min = 0;
long total = 0;
total = SendMessage(hwnd_winamp, WM_WA_IPC, 0, IPC_GETOUTPUTTIME);
min = total / 1000 / 60;
sec = total / 1000 % 60;
if(min < 10) sprintf(outbuf, "%s%i", outbuf, 0);
sprintf(outbuf, "%s%i:", outbuf, min);
if(sec < 10) sprintf(outbuf, "%s%i", outbuf, 0);
sprintf(outbuf, "%s%i", outbuf, sec);
return;
}
void GetSongLength(char *&outbuf)
{
long sec = 0;
long min = 0;
long total = 0;
total = SendMessage(hwnd_winamp, WM_WA_IPC, 1, IPC_GETOUTPUTTIME);
min = total / 1000 / 60;
sec = total / 1000 % 60;
if(min < 10) sprintf(outbuf, "%s%i", outbuf, 0);
sprintf(outbuf, "%s%i:", outbuf, min);
if(sec < 10) sprintf(outbuf, "%s%i", outbuf, 0);
sprintf(outbuf, "%s%i", outbuf, sec);
return;
}
bool JumpToFile(char *sFile)
{
HWND__ *jumpTo = 0;
HWND__ *edit = 0;
HWND__ *listBox = 0;
if(hwnd_winamp == 0x0)
return false;
PostMessage(hwnd_winamp, WA_SENDCUSTOMDATA, WA_DIALOGJUMPTOFILE, 0x0);
do
{
DoEvents();
jumpTo = FindWindow("#32770", "Jump to file");
edit = FindWindowEx(jumpTo, 0x0, "Edit", NULL);
listBox = FindWindowEx(jumpTo, 0x0, "ListBox", NULL);
} while(jumpTo == 0x0 || edit == 0x0 || listBox == 0x0);
SendMessage(edit, 0x0c, 0x0, (LPARAM)sFile);
DoEvents();
if(SendMessage(listBox, 0x18b, 0x0, 0x0) == 0x0)
PostMessage(jumpTo, 0x10, 0x0, 0x0);
else
SendMessage(listBox, 0x203, 0x0, (long)0x0);
return true;
}
long SetPlaylistPosition(int pos)
{
return SendMessage(hwnd_winamp, WM_WA_IPC, pos - 1, IPC_SETPLAYLISTPOS);
}
long SetVolume(int vol)
{
return SendMessage(hwnd_winamp, WM_WA_IPC, vol, IPC_SETVOLUME);
}
long GetBitrate()
{
return SendMessage(hwnd_winamp, WM_WA_IPC, 1, IPC_GETINFO);
}
char *GetChannels()
{
char *ret = new char[15];
long check = SendMessage(hwnd_winamp, WM_WA_IPC, 2, IPC_GETINFO);
switch(check)
{
case 0:
ret = "No Speakers";
break;
case 1:
ret = "Mono";
break;
case 2:
ret = "Stereo";
break;
default:
ret = "Surround-Sound";
break;
}
return ret;
}
long PrevTrack()
{
return SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON1, 0);
}
long PlayTrack()
{
return SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON2, 0);
}
long PauseTrack()
{
return SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON3, 0);
}
long StopTrack()
{
return SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON4, 0);
}
long NextTrack()
{
return SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON5, 0);
}
long GetWinampSongTitleRemote(int index)
{
return SendMessage(hwnd_winamp, WM_WA_IPC, index, IPC_GETPLAYLISTTITLE);
}
char *GetWinampSongTitle(int index)
{
char *title = new char[1024];
DWORD ProcessID = 0;
HANDLE ProcessHandle = 0;
long TitleRemote = 0;
ProcessID = GetWindowThreadProcessId((HWND)hwnd_winamp, (LPDWORD)ProcessID);
cout << "ProcessID: " << ProcessID << endl;
ProcessHandle = OpenProcess((DWORD)0x10, false, ProcessID);
cout << "ProcessHandle: " << ProcessHandle << endl;
if(ProcessHandle != 0)
{
TitleRemote = GetWinampSongTitleRemote(index);
cout << "TitleRemote: " << TitleRemote << endl;
if(TitleRemote != 0)
{
if(ReadProcessMemory((HANDLE)ProcessHandle, (LPCVOID)TitleRemote, (LPVOID)title, (DWORD)sizeof(title), (LPDWORD)0) != 0)
{
CloseHandle(ProcessHandle);
return title;
}
}
CloseHandle(ProcessHandle);
}
return "Error: Song Not Found";
}
String mp3() {
String title;
HWND HwndWamp;
int len;
HwndWamp = FindWindow("Winamp v1.x", "");
if(HwndWamp = 0) {
return "Winamp not found.";
}else{
len = GetWindowTextLength(HwndWamp) + 1;
GetWindowText(HwndWamp, title, len);
title = title.substr(0, strlen(title) - 1);
title = title.substr(0, strlen(title) - 9);
return title;
}
}
I was going by Java. =)...which was wrong.
// Credit -
// Joe[e2]: Author
// iago[x86]: Original XMMS Plugin
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "WinampFunctions.h"
#include "internal.h"
#include "gtkgaim.h"
#include "debug.h"
#include "signals.h"
#include "util.h"
#include "version.h"
#include "cmds.h"
#include "conversation.h"
#include "gtkplugin.h"
#include "gtkutils.h"
#include <windows.h>
//Plugin info - iago[x86]
#define VERSION "0.1.1"
#define ME "Winamp Plugin"
#define MAXLENGTH 1024
#define XMMS_PLUGIN_VERSION "I am using Winamp Plugin v1.0.1 written by Joe with very special thanks to iago and Yoni."
//Handle to the procedures to handle commands - iago[x86]
static GaimCmdId noargcmd;
//write_conversation - iago[x86]
void write_conversation(GaimConversation *conv, const char *message) {
gaim_conversation_write(conv, "", message, GAIM_MESSAGE_NO_LOG, time( NULL ));
}
// WampNoParams - Joe[e2]/iago[x86]
gboolean WampNoParams(GaimConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data) {
write_conversation("Current MP3: " + mp3());
return GAIM_CMD_STATUS_OK;
}
// plugin_load - Joe[e2]/iago[x86]
static gboolean plugin_load(GaimPlugin *plugin) {
noargcmd = gaim_cmd_register("winamp", "", GAIM_CMD_P_DEFAULT, GAIM_CMD_FLAG_IM, NULL, (GaimCmdFunc)WampNoParams, "/Wamp", NULL);
return TRUE;
}
static gboolean plugin_unload(GaimPlugin *plugin) {
gaim_cmd_unregister (noargcmd);
return TRUE;
}
static GaimPluginInfo info = {
GAIM_PLUGIN_MAGIC,
GAIM_MAJOR_VERSION,
GAIM_MINOR_VERSION,
GAIM_PLUGIN_STANDARD, /* type */
NULL, /* ui_requirement */
0, /* flags */
NULL, /* dependencies */
GAIM_PRIORITY_DEFAULT, /* priority */
NULL, /* id */
N_("Winamp Plugin"), /* name */
VERSION, /* version */
N_("Allows use of the /mp3 command."), /* summary */
N_("Allows use of the /mp3 command."), /* description */
"Joe <joetheodd@gmail.com", /* author */
"http://www.x86labs.org", /* homepage */
plugin_load, /* load */
plugin_unload, /* unload */
NULL, /* destroy */
NULL, /* ui_info */
NULL, /* extra_info */
NULL,
NULL
};
// stolen from iago[x86]
static void init_plugin(GaimPlugin *plugin) {
}
GAIM_INIT_PLUGIN(XMMSPlugin, init_plugin, info)
// mp3
/*
char() mp3() {
String title;
HWND HwndWamp;
int len;
HwndWamp = FindWindow("Winamp v1.x", "");
if(HwndWamp = 0) {
return "Winamp not found.";
}else{
len = GetWindowTextLength(HwndWamp) + 1;
GetWindowText(HwndWamp, title, len);
title = title.substr(0, strlen(title) - 1);
title = title.substr(0, strlen(title) - 9);
return title;
}
}
*/
char *mp3(HWND Winamp, DWORD Index) /* Winamp 2.04+, pointer is in local address space */ {
static char SongTitle[1024];
DWORD WinampProcessID;
HANDLE WinampProcess;
char *SongTitleRemote;
char Ret = NULL; // Return value
// Get process ID
GetWindowThreadProcessId(Winamp, &WinampProcessID);
// Open process
if(WinampProcess = OpenProcess(PROCESS_VM_READ, FALSE, WinampProcessID)) {
// Get pointer
if(SongTitleRemote = GetWinampSongTitleRemote(Winamp, Index))
// Try to read it
if(ReadProcessMemory(WinampProcess, SongTitleRemote, SongTitle, sizeof(SongTitle), NULL))
// Success
Ret = SongTitle;
CloseHandle(WinampProcess);
}
return *Ret;
}
I changed it to a *char. Anyhow, I give up. Again. Heres my code:Why not to a char*?
Shut up, I've suspended my effort indefinantly. I'll be back at it in a year or so. The only way to stop me is to write one first. GO!
You'll never finish it! :(Correct, but he'll put five minutes of effort into it in a year.
Correct, but he'll put five minutes of effort into it in a year.
You don't know enough C/C++ to do it. :)
Having Yoni do it = cheating.
(17:28:38) Yoni @ ALSA!:
Licensed under the Generally Silly License (GSL)
PREAMBLE
0. This license applies.
1. You may copy and distribute.
2. You may modify.
3. You may copy and distribute.
4. You may not.
5. You are not required.
6. Each time you redistribute.
7. If, as a consequence of a court judgment.
8. If the distribution and/or.
9. The.
10. If you wish.
NO WARRANTY
11. BECAUSE.
12. IN NO EVENT.
Generally Silly License (GSL)
1. You may copy and distribute.
NO WARRANTY BECAUSE.
Nobody says modifying open source code provided to you is cheating. yPlugin2 is licensed under the GSL:
Oh, and with my amount of C/++ knowledge and the resources at hand, it wouldn't be that damn complicated to do.
This coming from the guy that couldn't help me with my dangerously easy C project ;PNobody says modifying open source code provided to you is cheating. yPlugin2 is licensed under the GSL:
Oh, and with my amount of C/++ knowledge and the resources at hand, it wouldn't be that damn complicated to do.
Well, good luck to you, I don't think you can do it. [size=0pt]</motivation>[/size]:)