📄 playerimp.cpp
字号:
#include "stdafx.h"
#include "../MLPluginLib/MLPlugin.h"
#include "PlayerImp.h"
#include "frontend.h"
#include "process.h"
#include <PROCESS.H>
CPlayerImp g_Player;
int g_UpdateTimeSpan = 50;
WNDPROC g_pOrigProc = NULL;
HANDLE g_hEventThrdWinampQuery; // 停止 查询 Winamp 状态的线程 的事件
HANDLE g_hWinampQueryThrd; // 查询 Winamp 状态的线程
void ThreadWinampQuery(void *);
BOOL WAGetPlayingSongByWndTitle(HWND hwndWinamp, TCHAR szSong[]);
int YourInit(HINSTANCE hInstance)
{
g_hInstance = hInstance;
g_hwndPlayer = FindWindow("Winamp v1.x", NULL);
if (!InitMiniLyricsPlugin(g_hInstance, &g_Player))
return FALSE;
// now we can use other g_MLService functions.
char szMsg[256];
wsprintf(szMsg, "Start XXX Player plugin for minilyrics. HINSTANCE: %#X", g_hInstance);
g_MLService.Log(szMsg);
return TRUE;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPlayerImp::CPlayerImp()
{
EmptyStr(m_szFullTitle);
}
CPlayerImp::~CPlayerImp()
{
}
// Player Info
int CPlayerImp::GetPlayerName(char * lpszBuffer, int nBufSize)
{
strcpy_safe(lpszBuffer, nBufSize, "UITest");
return 1;
}
// get player state and song info
DWORD CPlayerImp::GetPlayerState()
{
if (g_hwndPlayer == NULL)
return PS_STOPED;
int nPlayState;
if (!WAIsPlaying(g_hwndPlayer, nPlayState))
return PS_STOPED;
// -1, paused
// 0, stopped
// 1, playing
switch (nPlayState)
{
case 0:
return PS_STOPED;
case 1:
return PS_PLAYING;
case 3:
return PS_PAUSED;
default:
// MLLOG0(LOG_LVL_ERROR, LOG_MOD_MAIN, "IMPOSSIBLE Value of core->getStatus()!");
break;
}
return PS_STOPED;
}
int CPlayerImp::GetCurSkinPath(char * lpszBuffer, int nBufSize)
{
EmptyStr(lpszBuffer);
WAGetSkin(g_hwndPlayer, lpszBuffer);
return 1;
}
int CPlayerImp::GetProxy(char * lpszBuffer, int nBufSize)
{
EmptyStr(lpszBuffer);
TCHAR szWinampIni[MAX_PATH];
GetProgramPath(szWinampIni, NULL);
strcat(szWinampIni, "winamp.ini");
GetPrivateProfileString("winamp", "proxy", "", lpszBuffer, nBufSize, szWinampIni);
return 1;
}
HWND CPlayerImp::GetMainWnd()
{
return g_hwndPlayer;
}
// 返回歌曲的信息,格式为:artist - title 作者 - 歌曲名
int CPlayerImp::GetFullTitle(char * lpszBuffer, int nBufSize)
{
strcpy_safe(lpszBuffer, nBufSize, m_szFullTitle);
return 1;
}
// 可以暂时不实现
int CPlayerImp::GetTitle(char * lpszBuffer, int nBufSize)
{
EmptyStr(lpszBuffer);
return 1;
}
// 可以暂时不实现
int CPlayerImp::GetArtist(char * lpszBuffer, int nBufSize)
{
EmptyStr(lpszBuffer);
return 1;
}
int CPlayerImp::GetAlbum(char * lpszBuffer, int nBufSize)
{
EmptyStr(lpszBuffer);
return 0;
}
// 返回歌曲的全文件名(如c:\\...., httP;//wwww......)
int CPlayerImp::GetSourceMedia(char * lpszBuffer, int nBufSize)
{
EmptyStr(lpszBuffer);
if (!WAGetPlayingSongByWndTitle(g_hwndPlayer, lpszBuffer))
return 0;
return 1;
}
// 歌曲的长度(单位ms)
DWORD CPlayerImp::GetMediaLength()
{
DWORD dwLength;
if (WAGetCurSongLength(g_hwndPlayer, dwLength))
return dwLength * 1000;
else
return 0;
}
// 歌曲播放的位置(单位ms)
DWORD CPlayerImp::GetPlayPos()
{
DWORD dwCurPos;
WAGetCurSongPos(g_hwndPlayer, dwCurPos);
return dwCurPos;
}
// 返回歌曲的信息,格式为:artist - title 作者 - 歌曲名
void CPlayerImp::OnSongChanged(LPCTSTR szFullTitle)
{
strcpy_safe(m_szFullTitle, CountOf(m_szFullTitle), szFullTitle);
g_MLService.OnFullTitleChanged(szFullTitle);
}
// 歌曲播放位置改变了
void CPlayerImp::OnPlayTimeChanged(DWORD dwTimeCur)
{
m_dwPos = dwTimeCur;
g_MLService.OnPlayTimeChanged(dwTimeCur);
}
// control player
BOOL CPlayerImp::Play()
{
WAPlay(g_hwndPlayer);
return TRUE;
}
BOOL CPlayerImp::Pause()
{
WAPlayPause(g_hwndPlayer);
return TRUE;
}
BOOL CPlayerImp::PlayPause()
{
WAPlayPause(g_hwndPlayer);
return TRUE;
}
BOOL CPlayerImp::Stop()
{
WAStop(g_hwndPlayer);
return TRUE;
}
BOOL CPlayerImp::Prev()
{
WAPrev(g_hwndPlayer);
return TRUE;
}
BOOL CPlayerImp::Next()
{
WANext(g_hwndPlayer);
return TRUE;
}
BOOL CPlayerImp::SeekTo(int nMsPos)
{
int nResult;
return WAJumpToTime(g_hwndPlayer, nMsPos, nResult);
}
BOOL CPlayerImp::Init()
{
g_hwndPlayer = FindWindow("Winamp v1.x", NULL);
DWORD dwVer;
WAGetVersion(g_hwndPlayer, dwVer);
g_MLService.AddWndCloseto(NULL, "Winamp Gen", "Winamp Library");
g_MLService.AddWndCloseto(NULL, "Winamp v1.x", "");
g_MLService.AddWndCloseto(NULL, "Winamp EQ", "");
g_MLService.AddWndCloseto(NULL, "Winamp PE", "");
g_MLService.AddWndCloseto(NULL, "Winamp MB", "");
//
// 创建线程查询Winamp播放器的状态
g_hEventThrdWinampQuery = CreateEvent(NULL, FALSE, FALSE, NULL);
if (g_hEventThrdWinampQuery == NULL)
{
// MLLOG1(LOG_LVL_ERROR, LOG_MOD_MAIN, "Create Exit QueryWinamp Thread Event Failed! Error Id: %d.", GetLastError());
}
// g_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadWinampQuery, NULL, 0, &dwThreadId);
g_hWinampQueryThrd = (HANDLE)_beginthread(ThreadWinampQuery, 0, NULL);
if (g_hWinampQueryThrd == NULL)
{
// MLLOGOUT0(LOG_LVL_ERROR, LOG_MOD_MAIN, "Create Winamp state Query Thread FAILED!");
return FALSE;
}
return TRUE;
}
// COMMENT:
// 关闭WINAMP 状态查询线程
void CPlayerImp::Quit()
{
// MLDBGLOG0(LOG_MOD_MAIN, "CWinamp2Player::Quit()");
// 恢复winamp窗口的窗口过程
if (g_pOrigProc)
SetWindowLong(g_hwndPlayer, GWL_WNDPROC, (LONG)g_pOrigProc);
// 设置退出线程的事件
SetEvent(g_hEventThrdWinampQuery);
CloseHandle(g_hEventThrdWinampQuery);
g_hEventThrdWinampQuery = NULL;
// 等待,直到线程退出,如果超时,则强制终止该线程
DWORD dwRet = WaitForSingleObject(g_hWinampQueryThrd, 1000);
if (dwRet != WAIT_OBJECT_0)
{
TerminateThread(g_hWinampQueryThrd, 0);
}
g_hWinampQueryThrd = NULL;
// CloseHandle(g_hWinampQueryThrd);
PostQuitMessage(0);
}
int CPlayerImp::HasVideo()
{
// 返回是否正在播放器视频?
return -1;
}
void CPlayerImp::SetTimeUpdateFreq(int nFreq)
{
if (nFreq == 0)
g_UpdateTimeSpan = 100;
else if (nFreq == 1)
g_UpdateTimeSpan = 50;
else
g_UpdateTimeSpan = 10;
}
void ThreadWinampQuery(void *)
{
DWORD dwRet;
DWORD dwPosLast = 0;
TCHAR szSongLast[MAX_PATH] = "";
TCHAR szSong[MAX_PATH] = "";
int nCount = 5;
while (1)
{
dwRet = WaitForSingleObject(g_hEventThrdWinampQuery, g_UpdateTimeSpan);
if (dwRet == WAIT_TIMEOUT)
{
// 在程序外,使用该方式来取得winamp的播放歌曲的标题
// 在winamp中的DLL拦截WM_SETTEXT消息取得当前歌曲
if (nCount > 5)
{
nCount = 0;
/*DWORD dwPos;
if (WAGetListPos(g_hwndPlayer, dwPos))
{
TCHAR szMsg[256];
wsprintf(szMsg, "%d", dwPos);
g_MLService.Log(szMsg);
}*/
if (!WAGetPlayingSongByWndTitle(g_hwndPlayer, szSong))
{
// get current mp3 song failed, so clear showing lyric.
szSongLast[0] = '\0';
if (!IsEmptyString(g_Player.m_szFullTitle))
g_Player.OnSongChanged("");
continue;
}
if (lstrcmp(szSong, szSongLast) != 0)
{
// DWORD dwCurPos;
// if (WAGetCurSongPos(g_hwndPlayer, dwCurPos))
// g_LyricData.SetPlayElapsedTime(dwCurPos);
lstrcpy(szSongLast, szSong);
g_Player.OnSongChanged(szSong);
continue;
}
}
nCount++;
// update current play time.
DWORD dwCurPos;
if (!IsEmptyString(szSong) && WAGetCurSongPos(g_hwndPlayer, dwCurPos))
{
if (dwCurPos < dwPosLast)
{
// 如果上次的时间比现在的时间还大,则,可能切换了歌曲。
dwPosLast = dwCurPos;
nCount = 6;
continue;
}
dwPosLast = dwCurPos;
g_Player.OnPlayTimeChanged(dwCurPos);
}
}
else if (dwRet == WAIT_OBJECT_0)
{
// Exit Thread
break;
}
else
{
// Other return value
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -