engine/plugins/winamp/winamp.c

553 lines
12 KiB
C

//mp3 menu and track selector.
//was origonally an mp3 track selector, now handles lots of media specific stuff - like q3 films!
//should rename to m_media.c
/*«11:56:05 am» «@Spikester» EBUILTIN(void, Menu_Control, (int mnum));
«11:56:05 am» «@Spikester» #define MENU_CLEAR 0
«11:56:05 am» «@Spikester» #define MENU_GRAB 1
«11:56:05 am» «@Spikester» EBUILTIN(int, Key_GetKeyCode, (char *keyname));
«11:56:13 am» «@Spikester» that's how you do menus. :)*/
#define BUILD 1
#include <stdlib.h> // needed for itoi
#include <stdio.h> // needed for itoi?
#include <windows.h>
#include "../plugin.h"
#include "winamp.h"
HWND hwnd_winamp;
//int media_playing=true;//try to continue from the standard playlist
//cvar_t winamp_dir = {"winamp_dir", "c:/program files/winamp5/"};
//cvar_t winamp_exe = {"winamp_exe", "winamp.exe"};
//cvar_t media_shuffle = {"media_shuffle", "1"};
//cvar_t media_repeat = {"media_repeat", "1"};
qboolean WinAmp_GetHandle (void)
{
if ((hwnd_winamp = FindWindow("Winamp", NULL)))
return true;
if ((hwnd_winamp = FindWindow("Winamp v1.x", NULL)))
return true;
if ((hwnd_winamp = FindWindow("winamp", NULL)))
return true;
return false;
}
// Start Moodles Attempt at Winamp Commands
// Note strange bug, load up FTE normally. And type winamp_version, for me the output is 0, but if I do winamp_version a second time it says 24604 (which is hex for 5010, my version of winamp is 5.10)
void Winamp_Play_f(void)
{
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
//SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON2, 0); <- is below fails, uncomment this.
SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_STARTPLAY);
Con_Printf("Attempting to start playback\n");
}
void Winamp_Version_f(void)
{
int version;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
version = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETVERSION);
//itoa (version, temp, 16); // should convert it to hex
Con_Printf("Winamp Version: %d\n",version);
}
void Winamp_TimeLeft_f(void)
{
int tracklength;
int trackposition;
int timeleft;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
tracklength = SendMessage(hwnd_winamp,WM_WA_IPC,1,IPC_GETOUTPUTTIME);
trackposition = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETOUTPUTTIME);
timeleft = tracklength-(trackposition/1000);
Con_Printf("Time Left: %d seconds\n",timeleft); // convert it to h:m:s later
}
void Winamp_JumpTo_f(void) // input is a percentage
{
int tracklength;
float inputpercent;
double trackpercent;
char input[20];
int res;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
tracklength = SendMessage(hwnd_winamp,WM_WA_IPC,1,IPC_GETOUTPUTTIME);
Cmd_Argv(1,input,sizeof(input));
inputpercent = atoi(input);
if (inputpercent > 100)
{
Con_Printf("ERROR: Choose a percent between 0 and 100\n");
return;
}
inputpercent = inputpercent/100;
trackpercent = (tracklength*1000)*inputpercent;
res = SendMessage(hwnd_winamp,WM_WA_IPC,trackpercent,IPC_JUMPTOTIME);
if (res == 0)
{
Con_Printf("Successfully jumped to %s percent\n",input,trackpercent);
return;
}
else if (res == -1)
{
Con_Printf("There are no songs playing\n");
return;
}
else if (res == 1)
{
Con_Printf("End of file\n");
}
Con_Printf("Oh oh spagettioes you shouldn't see this");
}
void Winamp_GoToPlayListPosition_f(void) // the playlist selecter doesn't actually work
{
//int length = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTLENGTH); //set a max
char input[20];
int inputnumber;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
Cmd_Argv(1,input,sizeof(input));
inputnumber = atoi(input);
SendMessage(hwnd_winamp,WM_WA_IPC,inputnumber,IPC_SETPLAYLISTPOS);
SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_STARTPLAY); // the above only selects it, doesn't actually play it.
Con_Printf("Attemped to set playlist position %s\n",input);
}
void Winamp_Volume_f(void) // I think this only works when the client did the winamp_play
{
char input[20];
int inputnumber;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
Cmd_Argv(1,input,sizeof(input));
inputnumber = atoi(input);
if ((input == "") || (inputnumber > 255))
{
Con_Printf("Choose a number between 0 and 255\n");
return;
}
SendMessage(hwnd_winamp,WM_WA_IPC,inputnumber,IPC_SETVOLUME);
Con_Printf("Winamp volume set to: %s\n",input);
}
void Winamp_ChannelPanning_f(void) // doesn't seem to work for me
{
char input[20];
int inputnumber;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
Cmd_Argv(1,input,sizeof(input));
inputnumber = atoi(input);
if ((input == "") || (inputnumber > 255))
{
Con_Printf("Choose a number between 0 (left) and 255 (right). Center is about 127\n");
return;
}
SendMessage(hwnd_winamp,WM_WA_IPC,inputnumber,IPC_SETPANNING);
Con_Printf("Winamp channel panning set to: %s\n",input);
}
void Winamp_PlayListLength_f(void) // has a habit of returning 0 when you dont use winamp_play to start off playing
{
int length;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
length = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTLENGTH);
Con_Printf("Winamp playlist length: %d\n",length);
}
void Winamp_PlayListPosition_f(void) // has a habit of return 0 of 0
{
int pos;
int length;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
pos = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTPOS);
length = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTLENGTH);
Con_Printf("Winamp currently on position '%d' of '%d'\n",pos,length);
}
void Winamp_SongInfo_f(void)
{
char title[255];
int res;
int samplerate;
int bitrate;
int channels;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
res = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_ISPLAYING);
samplerate = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETINFO);
bitrate = SendMessage(hwnd_winamp,WM_WA_IPC,1,IPC_GETINFO);
channels = SendMessage(hwnd_winamp,WM_WA_IPC,2,IPC_GETINFO);
GetWindowText(hwnd_winamp, title, sizeof(title));
if (res == 0)
{
Con_Printf("WinAmp is off\n");
return;
}
else if (res == 1)
{
Con_Printf("Currently playing: %s\nSamplerate: %dkHz\nBitrate: %dkbps \nChannels: %d\n",title,samplerate,bitrate,channels);
return;
}
else if (res == 3)
{
Con_Printf("Winamp is paused\n");
return;
}
}
void Winamp_Restart_f(void)
{
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_RESTARTWINAMP);
Con_Printf("Attempting to restart winamp\n");
}
void Winamp_Shuffle_f(void) //it works, thats all i can say lol
{
char input[20];
int inputnumber;
int inputnumber2;
int get;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
get = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_SHUFFLE);
Cmd_Argv(1,input,sizeof(input));
inputnumber2 = atoi(input);
//inputnumber = Cmd_Argc();
inputnumber = 1; // fix later
if (inputnumber2 == 1)
{
SendMessage(hwnd_winamp,WM_WA_IPC,1,IPC_SET_SHUFFLE);
Con_Printf("Winamp shuffle turned on\n");
return;
}
else if ((inputnumber2 == 0) && (inputnumber == 2))
{
SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_SET_SHUFFLE);
Con_Printf("Winamp shuffle turned off\n");
return;
}
else if (get == 1)
{
Con_Printf("Winamp shuffle is currently on\n");
}
else if (get == 0)
{
Con_Printf("Winamp shuffle is currently off\n");
}
Con_Printf("Enter 1 to to turn Winamp shuffle on, 0 to turn it off\n");
return;
}
void Winamp_Repeat_f(void) // it works, thats all i can say lol
{
char input[20];
int inputnumber;
int inputnumber2;
int get;
if (!WinAmp_GetHandle())
{
Con_Printf("Winamp not loaded\n");
return;
}
get = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_REPEAT);
Cmd_Argv(1,input,sizeof(input));
inputnumber2 = atoi(input);
//inputnumber = Cmd_Argc();
inputnumber = 2; // fix later
if (inputnumber2 == 1)
{
SendMessage(hwnd_winamp,WM_WA_IPC,1,IPC_SET_REPEAT);
Con_Printf("Winamp repeat turned on\n");
return;
}
else if ((inputnumber2 == 0) && (inputnumber == 2))
{
SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_SET_REPEAT);
Con_Printf("Winamp repeat turned off\n");
return;
}
else if (get == 1)
{
Con_Printf("Winamp repeat is currently on\n");
}
else if (get == 0)
{
Con_Printf("Winamp repeat is currently off\n");
}
Con_Printf("Enter 1 to to turn Winamp repeat on, 0 to turn it off\n");
return;
}
void Winamp_VolumeUp_f(void)
{
SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_VOLUMEUP, 0);
Con_Printf("Winamp volume incremented\n");
}
void Winamp_VolumeDown_f(void)
{
SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_VOLUMEDOWN, 0);
Con_Printf("Winamp volume decremented\n");
}
void Winamp_FastForward5Seconds_f(void)
{
SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_FFWD5S, 0);
Con_Printf("Winamp fast forwarded 5 seconds\n");
}
void Winamp_Rewind5Seconds_f(void)
{
SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_REW5S, 0);
Con_Printf("Winamp rewinded 5 seconds\n");
}
// End Moodles Attempt at Winamp Commands
int Plug_ExecuteCommand(int *args)
{
char cmd[256];
Cmd_Argv(0, cmd, sizeof(cmd));
if (!strcmp("winamp_play", cmd))
{
Winamp_Play_f();
return 1;
}
else if (!strcmp("winamp_version", cmd))
{
Winamp_Version_f();
return 1;
}
else if (!strcmp("winamp_timeleft", cmd))
{
Winamp_TimeLeft_f();
return 1;
}
else if (!strcmp("winamp_jumpto", cmd))
{
Winamp_JumpTo_f();
return 1;
}
else if (!strcmp("winamp_gotoplaylistposition", cmd))
{
Winamp_GoToPlayListPosition_f();
return 1;
}
else if (!strcmp("winamp_volume", cmd))
{
Winamp_Volume_f();
return 1;
}
else if (!strcmp("winamp_channelpanning", cmd))
{
Winamp_ChannelPanning_f();
return 1;
}
else if (!strcmp("winamp_playlistlength", cmd))
{
Winamp_PlayListLength_f();
return 1;
}
else if (!strcmp("winamp_playlistposition", cmd))
{
Winamp_PlayListPosition_f();
return 1;
}
else if (!strcmp("winamp_songinfo", cmd))
{
Winamp_SongInfo_f();
return 1;
}
else if (!strcmp("winamp_restart", cmd))
{
Winamp_Restart_f();
return 1;
}
else if (!strcmp("winamp_shuffle", cmd))
{
Winamp_Shuffle_f();
return 1;
}
else if (!strcmp("winamp_repeat", cmd))
{
Winamp_Repeat_f();
return 1;
}
else if (!strcmp("winamp_volumeup", cmd))
{
Winamp_VolumeUp_f();
return 1;
}
else if (!strcmp("winamp_volumedown", cmd))
{
Winamp_VolumeDown_f();
return 1;
}
else if (!strcmp("winamp_fastforward5seconds", cmd))
{
Winamp_FastForward5Seconds_f();
return 1;
}
else if (!strcmp("winamp_rewind5seconds", cmd))
{
Winamp_Rewind5Seconds_f();
return 1;
}
return 0;
}
void Winamp_InitCommands(void)
{
Cmd_AddCommand("winamp_play");
Cmd_AddCommand("winamp_version", Winamp_Version_f);
Cmd_AddCommand("winamp_timeleft", Winamp_TimeLeft_f);
Cmd_AddCommand("winamp_jumpto", Winamp_JumpTo_f);
Cmd_AddCommand("winamp_gotoplaylistposition", Winamp_GoToPlayListPosition_f);
Cmd_AddCommand("winamp_volume", Winamp_Volume_f);
Cmd_AddCommand("winamp_channelpanning", Winamp_ChannelPanning_f);
Cmd_AddCommand("winamp_playlistlength", Winamp_PlayListLength_f);
Cmd_AddCommand("winamp_playlistposition", Winamp_PlayListPosition_f);
Cmd_AddCommand("winamp_songinfo", Winamp_SongInfo_f);
Cmd_AddCommand("winamp_restart", Winamp_Restart_f);
Cmd_AddCommand("winamp_shuffle", Winamp_Shuffle_f);
Cmd_AddCommand("winamp_repeat", Winamp_Repeat_f);
Cmd_AddCommand("winamp_volumeup", Winamp_VolumeUp_f);
Cmd_AddCommand("winamp_volumedown", Winamp_VolumeDown_f);
Cmd_AddCommand("winamp_fastforward5seconds", Winamp_FastForward5Seconds_f);
Cmd_AddCommand("winamp_rewind5seconds", Winamp_Rewind5Seconds_f);
}
int Plug_Init(int *args)
{
if (Plug_Export("ExecuteCommand", Plug_ExecuteCommand))
{
Con_Printf("Winamp Plugin Build 1 by Moodles Loaded\n");
}
else
{
Con_Printf("Winamp Plugin failed\n");
}
Winamp_InitCommands();
return 1;
}