summary refs log tree commit diff stats
path: root/plugins/winamp
AgeCommit message (Collapse)Author
2013-04-01Remove another bunch of obsolete junkBerke Viktor
2012-10-30Now some final cleanup (I hope)Berke Viktor
2012-10-30Rebranding for the rest of plugin*Berke Viktor
2012-10-30Rebranding for XCHAT_EAT_*Berke Viktor
2012-10-30Rebranding for XCHAT_PRI_*Berke Viktor
2012-10-30Remove hexchat-plugin.h duplicateBerke Viktor
2012-10-24A lot more rebrandingBerke Viktor
2012-10-21Move warning level to property sheetBerke Viktor
2012-10-03Revert to VS2010 part4Berke Viktor
2012-10-02Use explicit project names, output filenames depend on themBerke Viktor
2012-10-02Oops, wrong find'n'replaceBerke Viktor
2012-10-02Remove hardcoding as much as possibleBerke Viktor
2012-10-02Change platform toolset to Visual Studio 2012Berke Viktor
2012-10-02Add XP (WDK) solution as a fallback optionBerke Viktor
2012-07-21Add _AMD64_ definition for x64 builds, make Visual Studio even happierBerke Viktor
2012-07-21Add trailing backslashes to Output and Intermediate directories, make Visual ↵Berke Viktor
Studio happy
2012-07-14get rid of *.user files and ignore themxhmikosr
2012-07-13Rename DLL files, rename X-SASL to SASLBerke Viktor
2012-07-13Update plugin descriptions and names, tooBerke Viktor
2012-07-13Rename files, delete old windows makefilesBerke Viktor
2012-07-11Rebranding on the file levelBerke Viktor
Add x64 support to the VS solutionBerke Viktor
2012-06-15LOTS of fixes to the VS solutionBerke Viktor
2012-06-10Add all plugins to solution except WMPABerke Viktor
2011-02-28add wdk changes to named branchberkeviktor@aol.com
2011-02-24nuke the repoberkeviktor@aol.com
2011-01-26fix menu item deletion upon unloadberkeviktor@aol.com
2011-01-10some capitalization consistency for the menuberkeviktor@aol.com
2010-10-29update wdk distribution to use relative paths where possibleberkeviktor@aol.com
2010-10-21even more cosmeticsberkeviktor@aol.com
2010-10-21some cosmeticsberkeviktor@aol.com
2010-10-20fix escape characterberkeviktor@aol.com
2010-10-21bump winamp plugin versionberkeviktor@aol.com
2010-10-21menu entry and icon for winam pluginberkeviktor@aol.com
2010-10-09change winamp command nameberkeviktor@aol.com
2010-10-09replace easywinampcontrol with winampberkeviktor@aol.com
of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include <windows.h> #include "hexchat-plugin.h" static hexchat_plugin *ph; /* plugin handle */ static int enable = 1; // For example, circularstrstr("winamp", "pwi", 3) would return 5 (the index of p) int circularstrstr(char* a, char* b, int nb) { int equal = 1; int length; int pos=-1; int i, j; length = strlen(a); for (i=0; i<length && pos == -1; ++i) { equal = 1; for (j=0; j<nb;j++) { if (a[(i+j)%length] != b[j]) equal = 0; } if (equal == 1) pos = i; } return pos; } void GetCurrentSongsName(HWND hwndWinamp, char* title, int titlesize) { int pos; char *title2; int i, j=0; int length; char *p; GetWindowText(hwndWinamp, title, titlesize); length = strlen(title); if ((pos = circularstrstr(title, "- Winamp ***", 12)) != -1) { // The option "scroll song title in taskbar" is on title2 = (char*) malloc (titlesize*sizeof(char)); for (i=(pos+12)%length; i!=pos; i=(i+1)%length) title2[j++] = title[i]; title2[j] = '\0'; p = title2; while (p<title2+titlesize && *p != '.') p++; p+=2; // Delete the . and the following white space strcpy(title, p); free(title2); } else { p = title; while (p<title+titlesize && *p != '.') p++; p+=2; // Delete the . and the following white space if (p<title+titlesize) strncpy(title, p, titlesize-(p-title)); // Delete the trailing "- winamp" p = title + titlesize - 1; while (p>title && *p != '-') p--; *p = '\0'; } } // Controlling winamp static int wcmd_cb(char *word[], char *word_eol[], void *userdata) { // Everything's here : http://winamp.com/nsdn/winamp2x/dev/sdk/api.php // The previous url seems dead, see http://forums.winamp.com/showthread.php?threadid=180297 HWND hwndWinamp = NULL; if ((hwndWinamp = FindWindow("Winamp v1.x",NULL)) == NULL) { hexchat_print(ph, "Winamp's window not found - Is winamp really running?\n"); } else { if (strcmp(word[1], "") == 0) hexchat_print(ph, "Usage: wcmd [command]\n"); else if (strcmp(word[2], "next") == 0) { hexchat_print(ph, "Loading next song...\n"); SendMessage (hwndWinamp, WM_COMMAND, 40048, 0); } else if (strcmp(word[2], "prev") == 0) { hexchat_print(ph, "Loading previous song...\n"); SendMessage (hwndWinamp, WM_COMMAND, 40044, 0); } else if (strcmp(word[2], "play") == 0) { hexchat_print(ph, "Playin'...\n"); SendMessage (hwndWinamp, WM_COMMAND, 40045, 0); } else if (strcmp(word[2], "stop") == 0) { hexchat_print(ph, "Winamp stopped!...\n"); SendMessage (hwndWinamp, WM_COMMAND, 40047, 0); } else if (strcmp(word[2], "pause") == 0) { SendMessage (hwndWinamp, WM_COMMAND, 40046, 0); } } return HEXCHAT_EAT_ALL; } // Display current song static int wp_cb(char *word[], char *word_eol[], void *userdata) { HWND hwndWinamp = NULL; int bitrate, length, elapsed, minutes, seconds, eminutes, eseconds, samplerate, nbchannels; char elapsedtime[7]; char totaltime[7]; char this_title[1024]; if ((hwndWinamp = FindWindow("Winamp v1.x",NULL)) == NULL) hexchat_print(ph, "Winamp's window not found - Is winamp really running?\n"); else { //Winamp's running // Seems buggy when winamp2's agent is running, and winamp not (or winamp3) -> crashes HexChat. SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)125); if ((samplerate = SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)126)) == 0) { hexchat_print(ph, "Could not get current song's samplerate... !?\n"); return HEXCHAT_EAT_ALL; } if ((bitrate = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)126)) == 0) { hexchat_print(ph, "Could not get current song's bitrate... !?\n"); return HEXCHAT_EAT_ALL; } if ((nbchannels = SendMessage(hwndWinamp, WM_USER, (WPARAM)2, (LPARAM)126)) == 0) { hexchat_print(ph, "Could not get the number of channels... !?\n"); return HEXCHAT_EAT_ALL; } if ((length = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)105)) == 0) { // Could be buggy when streaming audio or video, returned length is unexpected; // How to detect is Winamp is streaming, and display ??:?? in that case? hexchat_print(ph, "Could not get current song's length... !?\n"); return HEXCHAT_EAT_ALL; } else { minutes = length/60; seconds = length%60; if (seconds>9) wsprintf(totaltime, "%d:%d", minutes, seconds); else wsprintf(totaltime, "%d:0%d", minutes, seconds); } if ((elapsed = SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)105)) == 0) { hexchat_print(ph, "Could not get current song's elapsed time... !?\n"); return HEXCHAT_EAT_ALL; } else { eminutes = (elapsed/1000)/60; /* kinda stupid sounding, but e is for elapsed */ eseconds = (elapsed/1000)%60; if (eseconds>9) wsprintf(elapsedtime, "%d:%d", eminutes, eseconds); else wsprintf(elapsedtime, "%d:0%d", eminutes, eseconds); } if ((bitrate = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)126)) == 0) { hexchat_print(ph, "Could not get current song's bitrate... !?\n"); return HEXCHAT_EAT_ALL; } GetCurrentSongsName(hwndWinamp, this_title, 1024); hexchat_commandf(ph, "dispcurrsong %d %d %d %s %s %s", samplerate, bitrate, nbchannels, elapsedtime, totaltime, this_title); } return HEXCHAT_EAT_ALL; /* eat this command so HexChat and other plugins can't process it */ } int hexchat_plugin_init(hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg) { /* we need to save this for use with any hexchat_* functions */ ph = plugin_handle; *plugin_name = "EasyWinampControl"; *plugin_desc = "Some commands to remotely control winamp"; *plugin_version = "1.2"; hexchat_hook_command(ph, "wp", HEXCHAT_PRI_NORM, wp_cb, "Usage: wp", 0); hexchat_hook_command(ph, "wcmd", HEXCHAT_PRI_NORM, wcmd_cb, "Usage: wcmd [play|pause|stop|prev|next]", 0); hexchat_print(ph, "EasyWinampControl plugin loaded\n"); return 1; /* return 1 for success */ } int hexchat_plugin_deinit(void) { hexchat_print(ph, "EasyWinampControl plugin unloaded\n"); return 1; }