Files
mimis/cpp/JavaWinampApi/WinampController.c

588 lines
17 KiB
C

/* meu .h */
#include "WinampController.h"
/* mingw */
#include <windows.h>
#include <w32api.h>
#include <winuser.h>
/* winamp sdk */
#include "wa_ipc.h"
#include "WINAMPCMD.H"
const int WA_CLOSE = 40001 ;
const int WA_PLAY = WINAMP_BUTTON2;
const int WA_STOP = WINAMP_BUTTON4;
const int WA_PAUSE = WINAMP_BUTTON3;
const int WA_PREVTRACK = WINAMP_BUTTON1;
const int WA_NEXTTRACK = WINAMP_BUTTON5;
const int WA_FWD5SECS = WINAMP_FFWD5S;
const int WA_REW5SECS = WINAMP_REW5S;
const int WA_PLAYLISTLEN = IPC_GETLISTLENGTH;
const int WA_SETVOLUME = IPC_SETVOLUME;
const int WA_SETPLAYLISTPOS = IPC_SETPLAYLISTPOS;
const int WA_WRITEPLAYLIST = IPC_WRITEPLAYLIST;
const int WA_ENQUEUEFILE = IPC_ENQUEUEFILE;
const int WA_VOLUMEUP = WINAMP_VOLUMEUP;
const int WA_VOLUMEDOWN = WINAMP_VOLUMEDOWN;
const int WA_CLEARPLAYLIST = IPC_DELETE;
const int WA_NOTHING = 0;
const int WA_TRACK_LENGTH = 1;
const int WA_RESTART = IPC_RESTARTWINAMP;
const int WA_REFRESHPLCACHE = IPC_REFRESHPLCACHE;
const int WA_GETSHUFFLESTATUS = IPC_GET_SHUFFLE;
const int WA_GETREPEATSTATUS = IPC_GET_REPEAT;
const int WA_SETSHUFFLESTATUS = IPC_SET_SHUFFLE;
const int WA_SETREPEATSTATUS = IPC_SET_REPEAT;
const int WA_GETSTATUS = IPC_ISPLAYING;
const int WA_GETLISTPOS = IPC_GETLISTPOS;
const int WA_GETTITLE = IPC_GETPLAYLISTTITLE;
const int WA_VERSION = IPC_GETVERSION;
const int WA_FILENAMEINLIST = IPC_GETPLAYLISTFILE;
const int WA_GETFILEINFO = IPC_GET_EXTENDED_FILE_INFO;
HWND hwnd_winamp = NULL;
INT position = 0;
STARTUPINFO si;
PROCESS_INFORMATION pi;
char messageReturn[255];
wchar_t* wMessageReturn;
LPDWORD temp;
void initWinampHandle() {
hwnd_winamp = NULL;
if (hwnd_winamp == NULL) {
hwnd_winamp = FindWindow((LPCWSTR) "Winamp v1.x", NULL);
}
if (hwnd_winamp == NULL) {
hwnd_winamp = FindWindow((LPCWSTR) "Winamp v2.x", NULL);
}
if (hwnd_winamp == NULL) {
hwnd_winamp = FindWindow((LPCWSTR) "Winamp v3.x", NULL);
}
}
jboolean runWinamp(unsigned char* pathWinamp) {
/* STARTUPINFO si;
PROCESS_INFORMATION pi;*/
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if(!CreateProcess((LPCWSTR) pathWinamp,
NULL,
0,
0,
FALSE,
CREATE_NEW_CONSOLE,
0,
0,
&si,
&pi))
{
return FALSE;
}
DWORD dwResult = WaitForInputIdle(pi.hProcess,INFINITE);
if (dwResult != 0) return FALSE;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return TRUE;
}
int getListPos() {
initWinampHandle();
if (hwnd_winamp != NULL) {
return SendMessage(hwnd_winamp,WM_USER,WA_NOTHING,WA_GETLISTPOS);
}
return -1;
}
void getPluginMessage(int param, int sendMessage)
{
LPCVOID message = (LPCVOID)SendMessageW(hwnd_winamp, WM_USER, param, sendMessage);
ZeroMemory( &pi, sizeof(pi));
GetWindowThreadProcessId(hwnd_winamp, &pi.dwThreadId);
pi.hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pi.dwThreadId);
ReadProcessMemory(pi.hProcess, message, messageReturn,2056,temp);
free(temp);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_run
(JNIEnv *env, jobject obj) {
initWinampHandle();
if ( hwnd_winamp == NULL ) {
unsigned char path[MAX_PATH]="";
DWORD size = MAX_PATH;
HKEY key;
DWORD tipo;
if (!RegOpenKey(HKEY_LOCAL_MACHINE,(LPCWSTR) "Software\\Clients\\Media\\Winamp\\shell\\open\\command",&key)==ERROR_SUCCESS)
{
printf("0");
return FALSE;
}
if (!(RegQueryValueEx(key,(LPCWSTR) "",NULL,&tipo,path,&size))==ERROR_SUCCESS)
{
RegCloseKey(key);
return FALSE;
}
if (!runWinamp(path))
{
RegCloseKey(key);
return FALSE;
}
return TRUE;
}
int version = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETVERSION);
return TRUE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_exit
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_CLOSE, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_play
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_PLAY, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_stop
(JNIEnv *env, jobject obj)
{
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_STOP, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_resume
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_PAUSE, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_pause
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_PAUSE, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_previousTrack
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_PREVTRACK, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_nextTrack
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_NEXTTRACK, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_fwd5Secs
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_FWD5SECS, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_rew5Secs
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_REW5SECS, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_increaseVolume
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_VOLUMEUP, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_decreaseVolume
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_VOLUMEDOWN, WA_NOTHING);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_increaseVolumePercent
(JNIEnv *env, jobject obj, jint percent) {
initWinampHandle();
int i = 0;
if (hwnd_winamp != NULL) {
for(i=0;i<percent;i++) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_VOLUMEUP, WA_NOTHING);
}
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_decreaseVolumePercent
(JNIEnv *env, jobject obj, jint percent) {
initWinampHandle();
int i = 0;
if (hwnd_winamp != NULL) {
for(i=0;i<percent;i++) {
SendMessageA(hwnd_winamp, WM_COMMAND, WA_VOLUMEDOWN, WA_NOTHING);
}
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_setVolume
(JNIEnv *env, jobject obj, jint pos) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_USER, pos, WA_SETVOLUME);
return TRUE;
}
return FALSE;
}
JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getVolume
(JNIEnv *env, jobject obj, jint pos) {
jint curVolume = -1;
initWinampHandle();
if (hwnd_winamp != NULL) {
curVolume = (jint)SendMessageA(hwnd_winamp, WM_USER, -666, WA_SETVOLUME);
}
return curVolume;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_restart
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_USER, WA_NOTHING, WA_RESTART);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_setPlaylistPosition
(JNIEnv *env, jobject obj, jint pos) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_USER, pos, WA_SETPLAYLISTPOS);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_clearPlayList
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_USER, WA_NOTHING, WA_CLEARPLAYLIST);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_refreshPlayListCache
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_USER, WA_NOTHING, WA_REFRESHPLCACHE);
return TRUE;
}
return FALSE;
}
JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getPlayListLength
(JNIEnv *env, jobject obj) {
jint length = -1;
initWinampHandle();
if (hwnd_winamp != NULL) {
length = (jint)SendMessageA(hwnd_winamp, WM_USER, WA_NOTHING, WA_PLAYLISTLEN);
}
return length;
}
JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_writePlayListToFile
(JNIEnv *env, jobject obj) {
jint length = -1;
initWinampHandle();
if (hwnd_winamp != NULL) {
length = SendMessageA(hwnd_winamp, WM_USER, WA_NOTHING, WA_WRITEPLAYLIST);
}
return length;
}
JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_isShuffleStatusOn
(JNIEnv *env, jobject obj) {
jint status = 0;
initWinampHandle();
if (hwnd_winamp != NULL) {
status = (jint)SendMessageA(hwnd_winamp, WM_USER, WA_NOTHING, WA_GETSHUFFLESTATUS);
} else
return -1;
return status>0?1:0;
}
JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_isRepeatStatusOn
(JNIEnv *env, jobject obj) {
jint status = 0;
initWinampHandle();
if (hwnd_winamp != NULL) {
status = (jint)SendMessageA(hwnd_winamp, WM_USER, WA_NOTHING, WA_GETREPEATSTATUS);
} else
return -1;
return status>0?1:0;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_setRepeatStatusOn
(JNIEnv *env, jobject obj, jboolean status) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_USER, status, WA_SETREPEATSTATUS);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_setShuffleStatusOn
(JNIEnv *env, jobject obj, jboolean status) {
initWinampHandle();
if (hwnd_winamp != NULL) {
SendMessageA(hwnd_winamp, WM_USER, status, WA_SETSHUFFLESTATUS);
return TRUE;
}
return FALSE;
}
JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_appendToPlayList
(JNIEnv *env, jobject obj, jstring mp3filename) {
initWinampHandle();
jboolean iscopy;
if (hwnd_winamp != NULL) {
wMessageReturn = (wchar_t*)(*env)->GetStringChars(env, mp3filename, &iscopy);
int length = wcslen(wMessageReturn);
COPYDATASTRUCT cds;
cds.dwData = IPC_PLAYFILEW;
cds.lpData = (void*)wMessageReturn;
cds.cbData = length * 2 + 2 ; // it sums white space
SendMessageW(hwnd_winamp, WM_COPYDATA, WA_NOTHING, (LPARAM)&cds);
return TRUE;
}
return FALSE;
}
JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getStatus
(JNIEnv *env, jobject obj) {
jint status = -1;
initWinampHandle();
if (hwnd_winamp != NULL) {
status = SendMessageA(hwnd_winamp, WM_USER, WA_NOTHING, WA_GETSTATUS);
}
return status;
}
JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getListPos
(JNIEnv *env, jobject obj) {
return getListPos();
}
JNIEXPORT jstring JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getTitle
(JNIEnv *env, jobject obj) {
initWinampHandle();
if (hwnd_winamp != NULL) {
char title[500] = "";
GetWindowText(hwnd_winamp,title,500);
return (*env)->NewStringUTF(env,title);
}
return NULL;
}
JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getTime
(JNIEnv *env, jobject obj, jint mode) {
initWinampHandle();
if (hwnd_winamp != NULL) {
return SendMessage(hwnd_winamp,WM_USER,mode,IPC_GETOUTPUTTIME);
}
return -2;
}
JNIEXPORT jstring JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getFileNameInList
(JNIEnv *env, jobject obj, jint index)
{
initWinampHandle();
if (hwnd_winamp != NULL) {
getPluginMessage(index, WA_FILENAMEINLIST);
char* filePath = messageReturn;
jstring strReturn = (*env)->NewStringUTF(env,filePath);
return strReturn;
}
return NULL;
}
JNIEXPORT jstring JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getFileNamePlaying
(JNIEnv *env, jobject obj)
{
initWinampHandle();
if (hwnd_winamp != NULL) {
getPluginMessage(WA_NOTHING, IPC_GET_PLAYING_FILENAME);
wchar_t* fileName = (wchar_t*)messageReturn;
int length = wcslen(fileName);
jstring strReturn = (*env)->NewString(env,fileName,length);
return strReturn;
}
return NULL;
}