rainmeter-studio/Plugins/PluginNowPlaying/PlayerWLM.cpp

208 lines
4.3 KiB
C++
Raw Normal View History

/*
Copyright (C) 2011 Birunthan Mohanathas (www.poiru.net)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "StdAfx.h"
#include "PlayerWLM.h"
2013-05-31 14:28:39 +00:00
Player* PlayerWLM::c_Player = nullptr;
2011-07-15 15:18:02 +00:00
extern HINSTANCE g_Instance;
// This player emulates the MSN/WLM Messenger 'Listening to' interface, which is
// supported by OpenPandora, Last.fm, Media Player Classic, TTPlayer, Zune, etc.
/*
** Constructor.
**
*/
2013-05-31 14:18:52 +00:00
PlayerWLM::PlayerWLM() : Player(),
m_Window()
{
// Create windows class
WNDCLASS wc = {0};
2011-07-15 15:18:02 +00:00
wc.hInstance = g_Instance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = L"MsnMsgrUIManager";
RegisterClass(&wc);
// Create dummy window
m_Window = CreateWindow(L"MsnMsgrUIManager",
L"",
WS_DISABLED,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
2013-05-31 14:28:39 +00:00
nullptr,
nullptr,
2011-07-15 15:18:02 +00:00
g_Instance,
this);
m_Initialized = true;
}
/*
** Destructor.
**
*/
2013-05-31 14:18:52 +00:00
PlayerWLM::~PlayerWLM()
{
2013-05-31 14:28:39 +00:00
c_Player = nullptr;
DestroyWindow(m_Window);
2011-07-15 15:18:02 +00:00
UnregisterClass(L"MsnMsgrUIManager", g_Instance);
}
/*
** Creates a shared class object.
**
*/
2013-05-31 14:18:52 +00:00
Player* PlayerWLM::Create()
{
if (!c_Player)
{
2013-05-31 14:18:52 +00:00
c_Player = new PlayerWLM();
}
return c_Player;
}
2013-05-31 14:18:52 +00:00
LRESULT CALLBACK PlayerWLM::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
2013-05-31 14:18:52 +00:00
static PlayerWLM* player;
switch (msg)
{
case WM_CREATE:
{
2013-05-31 14:18:52 +00:00
// Get pointer to the PlayerWLM class from the CreateWindow call
player = (PlayerWLM*)((CREATESTRUCT*)lParam)->lpCreateParams;
return 0;
}
case WM_COPYDATA:
{
PCOPYDATASTRUCT cds = (PCOPYDATASTRUCT)lParam;
if (cds->dwData != 1351) return 0;
// lpData: \0Music\0<status>\0<format>\0<title>\0<artist>\0<album>\0
std::wstring data = (WCHAR*)cds->lpData;
// Some players include player name in the beginning. Skip that.
std::wstring::size_type len = data.find(L"\\0Music\\0");
len += 9;
data.erase(0, len); // Get rid of \0Music\0
bool playing = (data[0] == L'1');
if (playing)
{
++player->m_TrackCount;
2012-01-08 17:35:29 +00:00
player->m_State = STATE_PLAYING;
data.erase(0, 3); // Get rid of the status
// TODO: Handle invalid
len = data.find_first_of(L'\\');
len += 2;
data.erase(0, len); // Get rid of the format
len = data.find_first_of(L'\\');
2011-07-14 10:12:02 +00:00
player->m_Title.assign(data, 0, len);
len += 2;
data.erase(0, len);
len = data.find_first_of(L'\\');
2011-07-14 10:12:02 +00:00
player->m_Artist.assign(data, 0, len);
len += 2;
data.erase(0, len);
len = data.find_first_of(L'\\');
2011-07-14 10:12:02 +00:00
player->m_Album.assign(data, 0, len);
2011-09-08 12:42:03 +00:00
if (player->m_Measures & MEASURE_LYRICS)
{
player->FindLyrics();
}
}
else
{
player->ClearData(false);
}
return 0;
}
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
2013-05-31 14:18:52 +00:00
void PlayerWLM::SendKeyInput(WORD key)
{
KEYBDINPUT kbi = {0};
kbi.wVk = key;
kbi.dwExtraInfo = (ULONG_PTR)GetMessageExtraInfo();
INPUT input = {0};
input.type = INPUT_KEYBOARD;
input.ki = kbi;
SendInput(1, &input, sizeof(INPUT));
}
/*
** Called during each update of the main measure.
**
*/
2013-05-31 14:18:52 +00:00
void PlayerWLM::UpdateData()
{
}
/*
** Handles the Play bang.
**
*/
2013-05-31 14:18:52 +00:00
void PlayerWLM::Play()
{
SendKeyInput(VK_MEDIA_PLAY_PAUSE);
}
/*
** Handles the Stop bang.
**
*/
2013-05-31 14:18:52 +00:00
void PlayerWLM::Stop()
{
SendKeyInput(VK_MEDIA_STOP);
}
/*
** Handles the Next bang.
**
*/
2013-05-31 14:18:52 +00:00
void PlayerWLM::Next()
{
SendKeyInput(VK_MEDIA_NEXT_TRACK);
}
/*
** Handles the Previous bang.
**
*/
2013-05-31 14:18:52 +00:00
void PlayerWLM::Previous()
{
SendKeyInput(VK_MEDIA_PREV_TRACK);
}