231 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| EasyWinampControl - A Winamp "What's playing" plugin for HexChat
 | |
| Copyright (C) Yann HAMON & contributors
 | |
| 
 | |
| This library is free software; you can redistribute it and/or
 | |
| modify it under the terms of the GNU Lesser General Public
 | |
| License as published by the Free Software Foundation; either
 | |
| version 2.1 of the License, or (at your option) any later version.
 | |
| 
 | |
| This library is distributed in the hope that it will be useful,
 | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| Lesser General Public License for more details.
 | |
| 
 | |
| You should have received a copy 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;
 | |
| }
 |