⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playerimp.cpp

📁 这是一个用于歌词下载、上传、匹配的源代码
💻 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 + -