NowPlayingPlugin:

- Minor improvements to CAD interface
- Fixed: TITLE was empty when listening to radio stations with Winamp
- Fixed: Metadata may not be updated until full refresh after closing one of multiple NowPlaying based skins
This commit is contained in:
Birunthan Mohanathas 2011-07-01 20:34:12 +00:00
parent 339e798ba3
commit 8ae8a68547
13 changed files with 145 additions and 199 deletions

View File

@ -316,6 +316,7 @@ UINT Update(UINT id)
ParentMeasure* parent = child->parent; ParentMeasure* parent = child->parent;
CPlayer* player = parent->player; CPlayer* player = parent->player;
// Only allow parent measure to update
if (parent->id == id) if (parent->id == id)
{ {
player->UpdateMeasure(); player->UpdateMeasure();
@ -451,14 +452,7 @@ void ExecuteBang(LPCTSTR bang, UINT id)
ParentMeasure* parent = child->parent; ParentMeasure* parent = child->parent;
CPlayer* player = parent->player; CPlayer* player = parent->player;
if (!player->IsInitialized()) if (_wcsicmp(bang, L"Pause") == 0)
{
if (_wcsicmp(bang, L"OpenPlayer") == 0 || _wcsicmp(bang, L"TogglePlayer") == 0)
{
player->OpenPlayer(parent->playerPath);
}
}
else if (_wcsicmp(bang, L"Pause") == 0)
{ {
player->Pause(); player->Pause();
} }
@ -482,7 +476,13 @@ void ExecuteBang(LPCTSTR bang, UINT id)
{ {
player->Previous(); player->Previous();
} }
else if (_wcsicmp(bang, L"ClosePlayer") == 0 || _wcsicmp(bang, L"TogglePlayer") == 0) else if (_wcsicmp(bang, L"OpenPlayer") == 0 ||
(!player->IsInitialized() && _wcsicmp(bang, L"TogglePlayer") == 0))
{
player->OpenPlayer(parent->playerPath);
}
else if (_wcsicmp(bang, L"ClosePlayer") == 0 ||
(player->IsInitialized() && _wcsicmp(bang, L"TogglePlayer") == 0))
{ {
player->ClosePlayer(); player->ClosePlayer();
} }

View File

@ -39,10 +39,8 @@ CPlayer::CPlayer() :
m_Position(), m_Position(),
m_Rating(), m_Rating(),
m_Volume(), m_Volume(),
m_CriticalSection(),
m_InternetThread() m_InternetThread()
{ {
InitializeCriticalSection(&m_CriticalSection);
} }
/* /*
@ -53,7 +51,10 @@ CPlayer::CPlayer() :
*/ */
CPlayer::~CPlayer() CPlayer::~CPlayer()
{ {
DeleteCriticalSection(&m_CriticalSection); if (m_InternetThread)
{
TerminateThread(m_InternetThread, 0);
}
} }
/* /*
@ -79,6 +80,8 @@ void CPlayer::RemoveInstance()
{ {
delete this; delete this;
} }
m_UpdateCount = 0;
} }
/* /*
@ -181,7 +184,7 @@ void CPlayer::FindCover()
*/ */
void CPlayer::FindLyrics() void CPlayer::FindLyrics()
{ {
if (TryEnterCriticalSection(&m_CriticalSection)) if (!m_InternetThread)
{ {
m_Lyrics.clear(); m_Lyrics.clear();
@ -195,8 +198,6 @@ void CPlayer::FindLyrics()
{ {
LSLog(LOG_DEBUG, L"Rainmeter", L"NowPlayingPlugin: Failed to start lyrics thread."); LSLog(LOG_DEBUG, L"Rainmeter", L"NowPlayingPlugin: Failed to start lyrics thread.");
} }
LeaveCriticalSection(&m_CriticalSection);
} }
} }
@ -210,7 +211,6 @@ unsigned __stdcall CPlayer::LyricsThreadProc(void* pParam)
{ {
CPlayer* player = (CPlayer*)pParam; CPlayer* player = (CPlayer*)pParam;
EnterCriticalSection(&player->m_CriticalSection);
std::wstring lyrics; std::wstring lyrics;
bool found; bool found;
@ -226,7 +226,7 @@ unsigned __stdcall CPlayer::LyricsThreadProc(void* pParam)
break; break;
} }
// Track changed, fetch lyrics for it // Track changed, try again
} }
if (found) if (found)
@ -236,7 +236,6 @@ unsigned __stdcall CPlayer::LyricsThreadProc(void* pParam)
CloseHandle(player->m_InternetThread); CloseHandle(player->m_InternetThread);
player->m_InternetThread = NULL; player->m_InternetThread = NULL;
LeaveCriticalSection(&player->m_CriticalSection);
return 0; return 0;
} }

View File

@ -117,7 +117,6 @@ private:
static unsigned __stdcall LyricsThreadProc(void* pParam); static unsigned __stdcall LyricsThreadProc(void* pParam);
HANDLE m_InternetThread; HANDLE m_InternetThread;
CRITICAL_SECTION m_CriticalSection;
}; };
#endif #endif

View File

@ -144,11 +144,27 @@ void CPlayerCAD::Initialize()
} }
else else
{ {
// TODO: Remove this in a few weeks (left here for MusicBee backwards compatibility) m_PlayerWindow = FindWindow(L"CD Art Display IPC Class", NULL);
m_PlayerWindow = FindWindow(L"WindowsForms10.Window.8.app.0.378734a", NULL);
if (m_PlayerWindow) if (m_PlayerWindow)
{ {
WritePrivateProfileString(L"NowPlaying.dll", L"ClassName", L"WindowsForms10.Window.8.app.0.378734a", file); classSz = L"CD Art Display IPC Class";
WritePrivateProfileString(L"NowPlaying.dll", L"ClassName", classSz, file);
windowSz = (GetWindowText(m_PlayerWindow, buffer, MAX_PATH) > 0) ? buffer : NULL;
WritePrivateProfileString(L"NowPlaying.dll", L"WindowName", windowSz, file);
DWORD pID;
GetWindowThreadProcessId(m_PlayerWindow, &pID);
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pID);
if (hProcess)
{
if (GetModuleFileNameEx(hProcess, NULL, buffer, MAX_PATH) > 0)
{
WritePrivateProfileString(L"NowPlaying.dll", L"PlayerPath", buffer, file);
}
CloseHandle(hProcess);
}
} }
} }
@ -156,7 +172,7 @@ void CPlayerCAD::Initialize()
{ {
m_Initialized = true; m_Initialized = true;
SendMessage(m_PlayerWindow, WM_USER, (WPARAM)m_Window, IPC_SET_CALLBACK_HWND); SendMessage(m_PlayerWindow, WM_USER, (WPARAM)m_Window, IPC_SET_CALLBACK_HWND);
m_State = (PLAYSTATE)SendMessage(m_PlayerWindow, WM_USER, 0, IPC_GET_PLAYER_STATE); m_State = (PLAYSTATE)SendMessage(m_PlayerWindow, WM_USER, 0, IPC_GET_STATE);
if (m_State != PLAYER_STOPPED) if (m_State != PLAYER_STOPPED)
{ {
@ -190,40 +206,62 @@ LRESULT CALLBACK CPlayerCAD::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
switch (msg) switch (msg)
{ {
case WM_CREATE: case WM_CREATE:
// Get pointer to the CPlayerCAD class from the CreateWindow call {
player = (CPlayerCAD*)((CREATESTRUCT*)lParam)->lpCreateParams; // Get pointer to the CPlayerCAD class from the CreateWindow call
return 0; player = (CPlayerCAD*)((CREATESTRUCT*)lParam)->lpCreateParams;
return 0;
}
case WM_DESTROY: case WM_DESTROY:
SendMessage(player->m_PlayerWindow, WM_USER, 0, IPC_SHUTDOWN_NOTIFICATION); {
return 0; SendMessage(player->m_PlayerWindow, WM_USER, 0, IPC_SHUTDOWN_NOTIFICATION);
return 0;
}
case WM_USER: case WM_USER:
switch (lParam) switch (lParam)
{ {
case IPC_TRACK_CHANGED_NOTIFICATION: case IPC_TRACK_CHANGED_NOTIFICATION:
PostMessage(player->m_PlayerWindow, WM_USER, 0, IPC_GET_CURRENT_TRACK);
break;
case IPC_PLAYER_STATE_CHANGED_NOTIFICATION:
player->m_State = (PLAYSTATE)wParam;
if (player->m_State == PLAYER_STOPPED)
{ {
player->ClearData(); PostMessage(player->m_PlayerWindow, WM_USER, 0, IPC_GET_CURRENT_TRACK);
break;
}
case IPC_STATE_CHANGED_NOTIFICATION:
{
player->m_State = (PLAYSTATE)wParam;
if (player->m_State == PLAYER_STOPPED)
{
player->ClearData();
}
break;
}
case IPC_VOLUME_CHANGED_NOTIFICATION:
{
player->m_Volume = wParam;
break;
}
case IPC_RATING_CHANGED_NOTIFICATION:
{
player->m_Rating = (wParam + 1) / 2; // From 0 - 10 to 0 - 5
break;
} }
break;
case IPC_SHUTDOWN_NOTIFICATION: case IPC_SHUTDOWN_NOTIFICATION:
player->m_Initialized = false; {
player->ClearData(); player->m_Initialized = false;
break; player->ClearData();
break;
}
} }
return 0; return 0;
case WM_COPYDATA: case WM_COPYDATA:
{ {
PCOPYDATASTRUCT cds = (PCOPYDATASTRUCT)lParam; PCOPYDATASTRUCT cds = (PCOPYDATASTRUCT)lParam;
if (cds->dwData == IPC_CURRENT_TRACK_INFO) if (cds->dwData == IPC_CURRENT_TRACK_NOTIFICATION)
{ {
// TODO: Sent on track update? // TODO: Sent on track update?
++player->m_TrackCount; ++player->m_TrackCount;
@ -269,7 +307,7 @@ LRESULT CALLBACK CPlayerCAD::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
player->FindLyrics(); player->FindLyrics();
} }
} }
else if (cds->dwData == IPC_REGISTER_PLAYER && !player->m_Initialized) else if (cds->dwData == IPC_REGISTER_NOTIFICATION && !player->m_Initialized)
{ {
std::wstring data = (WCHAR*)cds->lpData; std::wstring data = (WCHAR*)cds->lpData;
if (data[0] == L'1') if (data[0] == L'1')
@ -301,7 +339,7 @@ LRESULT CALLBACK CPlayerCAD::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
if (player->m_PlayerWindow) if (player->m_PlayerWindow)
{ {
player->m_Initialized = true; player->m_Initialized = true;
player->m_State = (PLAYSTATE)SendMessage(player->m_PlayerWindow, WM_USER, 0, IPC_GET_PLAYER_STATE); player->m_State = (PLAYSTATE)SendMessage(player->m_PlayerWindow, WM_USER, 0, IPC_GET_STATE);
if (player->m_State != PLAYER_STOPPED) if (player->m_State != PLAYER_STOPPED)
{ {
@ -341,7 +379,7 @@ void CPlayerCAD::UpdateData()
*/ */
void CPlayerCAD::Pause() void CPlayerCAD::Pause()
{ {
SendMessage(m_PlayerWindow, WM_USER, 0, IPC_FORCEPAUSE); SendMessage(m_PlayerWindow, WM_USER, 0, IPC_PAUSE);
} }
/* /*
@ -409,7 +447,7 @@ void CPlayerCAD::SetRating(int rating)
{ {
m_Rating = rating; m_Rating = rating;
rating *= 2; // From 0 - 5 to 0 - 10 rating *= 2; // From 0 - 5 to 0 - 10
SendMessage(m_PlayerWindow, WM_USER, rating, IPC_RATING_CHANGED_NOTIFICATION); SendMessage(m_PlayerWindow, WM_USER, rating, IPC_SET_RATING);
} }
/* /*
@ -439,7 +477,7 @@ void CPlayerCAD::SetVolume(int volume)
*/ */
void CPlayerCAD::ClosePlayer() void CPlayerCAD::ClosePlayer()
{ {
SendMessage(m_PlayerWindow, WM_USER, 0, IPC_CLOSE_PLAYER); SendMessage(m_PlayerWindow, WM_USER, 0, IPC_CLOSE);
// TODO // TODO
m_Initialized = false; m_Initialized = false;
ClearData(); ClearData();
@ -453,12 +491,20 @@ void CPlayerCAD::ClosePlayer()
*/ */
void CPlayerCAD::OpenPlayer(std::wstring& path) void CPlayerCAD::OpenPlayer(std::wstring& path)
{ {
if (!path.empty()) if (!m_Initialized)
{ {
ShellExecute(NULL, L"open", path.c_str(), NULL, NULL, SW_SHOW); if (!path.empty())
{
ShellExecute(NULL, L"open", path.c_str(), NULL, NULL, SW_SHOW);
}
else if (!m_PlayerPath.empty())
{
ShellExecute(NULL, L"open", m_PlayerPath.c_str(), NULL, NULL, SW_SHOW);
}
} }
else if (!m_PlayerPath.empty()) else
{ {
ShellExecute(NULL, L"open", m_PlayerPath.c_str(), NULL, NULL, SW_SHOW); // Bring player to front
SendMessage(m_PlayerWindow, WM_USER, 0, IPC_SHOW_WINDOW);
} }
} }

View File

@ -177,6 +177,7 @@ LRESULT CALLBACK CPlayerFoobar::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
break; break;
case FOO_PLAYERSTART: case FOO_PLAYERSTART:
player->m_Initialized = true;
player->m_FooWindow = (HWND)wParam; player->m_FooWindow = (HWND)wParam;
break; break;

View File

@ -197,15 +197,12 @@ void CPlayerITunes::Initialize()
if (position != 0) if (position != 0)
{ {
m_State = PLAYER_PAUSED; m_State = PLAYER_PAUSED;
OnTrackChange();
} }
} }
else if (state == ITPlayerStatePlaying) else if (state == ITPlayerStatePlaying)
{ {
m_State = PLAYER_PLAYING; m_State = PLAYER_PLAYING;
}
if (m_State != PLAYER_STOPPED)
{
OnTrackChange(); OnTrackChange();
} }

View File

@ -25,6 +25,7 @@
#ifndef _ATL_DLL #ifndef _ATL_DLL
#define _ATL_DLL #define _ATL_DLL
#define _ATL_APARTMENT_THREADED #define _ATL_APARTMENT_THREADED
#define _ATL_NO_EXCEPTIONS
#endif #endif
#include <atlbase.h> #include <atlbase.h>

View File

@ -19,12 +19,14 @@
#ifndef __PLAYERWMP_H__ #ifndef __PLAYERWMP_H__
#define __PLAYERWMP_H__ #define __PLAYERWMP_H__
#include "Player.h"
#ifndef _ATL_DLL #ifndef _ATL_DLL
#define _ATL_DLL #define _ATL_DLL
#define _ATL_APARTMENT_THREADED #define _ATL_APARTMENT_THREADED
#define _ATL_NO_EXCEPTIONS
#endif #endif
#include "Player.h"
#include <wmp.h> #include <wmp.h>
#include <atlbase.h> #include <atlbase.h>
#include <atlcom.h> #include <atlcom.h>

View File

@ -89,7 +89,7 @@ bool CPlayerWinamp::CheckWindow()
{ {
DWORD pID; DWORD pID;
GetWindowThreadProcessId(m_Window, &pID); GetWindowThreadProcessId(m_Window, &pID);
m_WinampHandle = OpenProcess(PROCESS_VM_READ, false, pID); m_WinampHandle = OpenProcess(PROCESS_VM_READ, FALSE, pID);
if (m_WinampHandle) if (m_WinampHandle)
{ {
@ -200,7 +200,6 @@ void CPlayerWinamp::UpdateData()
std::wstring title = wBuffer; std::wstring title = wBuffer;
std::wstring::size_type pos = title.find(L". "); std::wstring::size_type pos = title.find(L". ");
if (pos != std::wstring::npos && pos < 5) if (pos != std::wstring::npos && pos < 5)
{ {
pos += 2; // Skip ". " pos += 2; // Skip ". "
@ -217,8 +216,9 @@ void CPlayerWinamp::UpdateData()
} }
else else
{ {
ClearData(); m_Title = title;
return; m_Artist.clear();
m_Album.clear();
} }
} }

View File

@ -12,7 +12,7 @@
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,1,2,0 FILEVERSION 1,1,3,0
PRODUCTVERSION PRODUCTVER PRODUCTVERSION PRODUCTVER
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
@ -29,7 +29,7 @@ BEGIN
BLOCK "040904E4" BLOCK "040904E4"
BEGIN BEGIN
VALUE "FileDescription", "NowPlaying Plugin for Rainmeter" VALUE "FileDescription", "NowPlaying Plugin for Rainmeter"
VALUE "FileVersion", "1.1.2.0" VALUE "FileVersion", "1.1.3.0"
VALUE "InternalName", "NowPlaying" VALUE "InternalName", "NowPlaying"
VALUE "LegalCopyright", "Copyright (C) 2011 - Birunthan Mohanathas" VALUE "LegalCopyright", "Copyright (C) 2011 - Birunthan Mohanathas"
VALUE "OriginalFilename", "NowPlaying.dll" VALUE "OriginalFilename", "NowPlaying.dll"

View File

@ -122,7 +122,7 @@
<ProgramDatabaseFile>.\x32/Debug/NowPlaying.pdb</ProgramDatabaseFile> <ProgramDatabaseFile>.\x32/Debug/NowPlaying.pdb</ProgramDatabaseFile>
<ImportLibrary>.\x32/Debug/NowPlaying.lib</ImportLibrary> <ImportLibrary>.\x32/Debug/NowPlaying.lib</ImportLibrary>
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
<AdditionalDependencies>WinInet.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Psapi.lib;WinInet.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@ -163,7 +163,7 @@
<ProgramDatabaseFile>.\x64/Debug/NowPlaying.pdb</ProgramDatabaseFile> <ProgramDatabaseFile>.\x64/Debug/NowPlaying.pdb</ProgramDatabaseFile>
<ImportLibrary>.\x64/Debug/NowPlaying.lib</ImportLibrary> <ImportLibrary>.\x64/Debug/NowPlaying.lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine> <TargetMachine>MachineX64</TargetMachine>
<AdditionalDependencies>WinInet.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Psapi.lib;WinInet.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@ -192,15 +192,16 @@
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<DisableSpecificWarnings>4018;4090;4099;4114;4244;4267;4309;4351;4390;4786;4800;4996</DisableSpecificWarnings> <DisableSpecificWarnings>4018;4090;4099;4114;4244;4267;4309;4351;4390;4530;4786;4800;4996</DisableSpecificWarnings>
<AdditionalIncludeDirectories>.\sha2;.\taglib;.\taglib\toolkit;.\taglib\mpeg\id3v2\frames;.\taglib\ogg;.\taglib\asf;.\taglib\mp4;.\taglib\ogg\vorbis;.\taglib\ogg\flac;.\taglib\ogg\speex;.\taglib\riff;.\taglib\riff\wav;.\taglib\riff\aiff;.\taglib\flac;.\taglib\mpeg;.\taglib\mpeg\id3v1;.\taglib\mpeg\id3v2;.\taglib\mpc;.\taglib\ape;.\taglib\trueaudio;.\taglib\wavpack;.\SDKs\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.\sha2;.\taglib;.\taglib\toolkit;.\taglib\mpeg\id3v2\frames;.\taglib\ogg;.\taglib\asf;.\taglib\mp4;.\taglib\ogg\vorbis;.\taglib\ogg\flac;.\taglib\ogg\speex;.\taglib\riff;.\taglib\riff\wav;.\taglib\riff\aiff;.\taglib\flac;.\taglib\mpeg;.\taglib\mpeg\id3v1;.\taglib\mpeg\id3v2;.\taglib\mpc;.\taglib\ape;.\taglib\trueaudio;.\taglib\wavpack;.\SDKs\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<ExceptionHandling>false</ExceptionHandling>
</ClCompile> </ClCompile>
<ResourceCompile> <ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0409</Culture> <Culture>0x0409</Culture>
</ResourceCompile> </ResourceCompile>
<Link> <Link>
<AdditionalDependencies>Rainmeter.lib;WinInet.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Rainmeter.lib;Psapi.lib;WinInet.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../TestBench/x32/Release/Plugins/NowPlaying.dll</OutputFile> <OutputFile>../../TestBench/x32/Release/Plugins/NowPlaying.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\Library\x32\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>..\..\Library\x32\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -236,8 +237,9 @@
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<DisableSpecificWarnings>4018;4090;4099;4114;4244;4267;4309;4351;4390;4786;4800;4996</DisableSpecificWarnings> <DisableSpecificWarnings>4018;4090;4099;4114;4244;4267;4309;4351;4390;4530;4786;4800;4996</DisableSpecificWarnings>
<AdditionalIncludeDirectories>.\sha2;.\taglib;.\taglib\toolkit;.\taglib\mpeg\id3v2\frames;.\taglib\ogg;.\taglib\asf;.\taglib\mp4;.\taglib\ogg\vorbis;.\taglib\ogg\flac;.\taglib\ogg\speex;.\taglib\riff;.\taglib\riff\wav;.\taglib\riff\aiff;.\taglib\flac;.\taglib\mpeg;.\taglib\mpeg\id3v1;.\taglib\mpeg\id3v2;.\taglib\mpc;.\taglib\ape;.\taglib\trueaudio;.\taglib\wavpack;.\SDKs\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.\sha2;.\taglib;.\taglib\toolkit;.\taglib\mpeg\id3v2\frames;.\taglib\ogg;.\taglib\asf;.\taglib\mp4;.\taglib\ogg\vorbis;.\taglib\ogg\flac;.\taglib\ogg\speex;.\taglib\riff;.\taglib\riff\wav;.\taglib\riff\aiff;.\taglib\flac;.\taglib\mpeg;.\taglib\mpeg\id3v1;.\taglib\mpeg\id3v2;.\taglib\mpc;.\taglib\ape;.\taglib\trueaudio;.\taglib\wavpack;.\SDKs\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<ExceptionHandling>false</ExceptionHandling>
</ClCompile> </ClCompile>
<ResourceCompile> <ResourceCompile>
<PreprocessorDefinitions>NDEBUG;_WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -245,7 +247,7 @@
</ResourceCompile> </ResourceCompile>
<Link> <Link>
<AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>Rainmeter.lib;WinInet.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Rainmeter.lib;Psapi.lib;WinInet.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../TestBench/x64/Release/Plugins/NowPlaying.dll</OutputFile> <OutputFile>../../TestBench/x64/Release/Plugins/NowPlaying.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\Library\x64\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>..\..\Library\x64\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

View File

@ -3,140 +3,38 @@
enum IPCMESSAGE enum IPCMESSAGE
{ {
/* IPC_PLAY = 100,
Most of these messages are sent to the player. Messages that the player IPC_PLAYPAUSE = 101,
should send back to CAD are noted by '[Sent by player]' IPC_PAUSE = 102,
IPC_STOP = 103,
Based on information available in cad-sdk-2.1.pdf and in foo_cdartdisplay source. IPC_NEXT = 104,
*/ IPC_PREVIOUS = 105,
IPC_VOLUME_CHANGED_NOTIFICATION = 108,
// uMsg: WM_USER, wParam: 0, lParam: 100 IPC_SET_VOLUME = 108,
IPC_PLAY = 100, IPC_GET_VOLUME = 109,
IPC_GET_CURRENT_TRACK = 110,
// uMsg: WM_USER, wParam: 0, lParam: 101 IPC_GET_DURATION = 113,
IPC_PLAYPAUSE, IPC_SET_POSITION = 114,
IPC_SET_CALLBACK_HWND = 120,
// uMsg: WM_USER, wParam: 0, lParam: 102 IPC_GET_POSITION = 122,
IPC_FORCEPAUSE, IPC_TRACK_CHANGED_NOTIFICATION = 123,
IPC_SHOW_WINDOW = 124,
// uMsg: WM_USER, wParam: 0, lParam: 103 IPC_GET_STATE = 125,
IPC_STOP, IPC_STATE_CHANGED_NOTIFICATION = 126,
IPC_SET_REPEAT = 128,
// uMsg: WM_USER, wParam: 0, lParam: 104 IPC_SHUTDOWN_NOTIFICATION = 129,
IPC_NEXT, IPC_GET_REPEAT = 130,
IPC_CLOSE = 131,
// uMsg: WM_USER, wParam: 0, lParam: 105 IPC_GET_SHUFFLE = 140,
IPC_PREVIOUS, IPC_SET_SHUFFLE = 141,
// uMsg: WM_USER, wParam: volume (0 - 100), lParam: 108
IPC_SET_VOLUME = 108,
// uMsg: WM_USER, wParam: 0, lParam: 109, result: 0 to 100
IPC_GET_VOLUME,
// uMsg: WM_USER, wParam: 0, lParam: 110
// When the player recieves this message, it should send
// the IPC_CURRENT_TRACK message back to CAD
IPC_GET_CURRENT_TRACK,
// uMsg: WM_USER, wParam: 0, lParam: 113
IPC_GET_DURATION = 113,
// uMsg: WM_USER, wParam: position (seconds), lParam: 114
IPC_SET_POSITION,
// uMsg: WM_USER, wParam: 0, lParam: 115, result: 1 if playing
IPC_IS_PLAYING,
// uMsg: WM_USER, wParam: 0, lParam: 116, result: 1 if paused
IPC_IS_PAUSED,
// uMsg: WM_USER, wParam: 0, lParam: 117
IPC_GET_LIST_LENGTH,
// uMsg: WM_USER, wParam: position, lParam: 118
IPC_SET_LIST_POS,
// uMsg: WM_USER, wParam: 0, lParam: 119
IPC_GET_LIST_ITEM,
// uMsg: WM_USER, wParam: hwnd, lParam: 120
// CAD sends this mesage to the player on startup. The player
// should then send all future WM_COPYDATA messages to this window.
IPC_SET_CALLBACK_HWND,
// uMsg: WM_USER, wParam: 0, lParam: 121
IPC_GET_LIST_POS,
// uMsg: WM_USER, wParam: 0, lParam: 122, result: position (in seconds)
IPC_GET_POSITION,
// uMsg: WM_USER, wParam: 0, lParam: 123 [Sent by player]
// The player should send this message when the track changes.
IPC_TRACK_CHANGED_NOTIFICATION,
// uMsg: WM_USER, wParam: 0, lParam: 124
IPC_SHOW_PLAYER_WINDOW,
// uMsg: WM_USER, wParam: 0, lParam: 125, result: 0 (stopped), 1 (playing), or 2 (paused)
IPC_GET_PLAYER_STATE,
// uMsg: WM_USER, wParam: 0, lParam: 126 [Sent by player]
// The player should send this notification when the play state changes.
IPC_PLAYER_STATE_CHANGED_NOTIFICATION,
// uMsg: WM_USER, wParam: 0, lParam: 127 [Not implemented in CAD yet]
IPC_AUTOENQUEUE_OPTIONS,
// uMsg: WM_USER, wParam: 0 or 1, lParam: 128
IPC_SET_REPEAT,
// uMsg: WM_USER, wParam: 0 or 1, lParam: 129 [Sent by/to player]
// The player should send this message when it quits.
// CAD will also send this message on exit. Upon receival, the player should
// disconnect the communication interface and get ready for a IPC_SET_CALLBACK_HWND message.
IPC_SHUTDOWN_NOTIFICATION,
// uMsg: WM_USER, wParam: 0, lParam: 130, result: 1 if shuffle is active
IPC_GET_REPEAT,
// uMsg: WM_USER, wParam: 0, lParam: 131
// The player should quit completely upon receival.
IPC_CLOSE_PLAYER,
// uMsg: WM_USER, wParam: 0, lParam: 140, result: 1 if shuffle is active
IPC_GET_SHUFFLE = 140,
// uMsg: WM_USER, wParam: 0 or 1, lParam: 141
IPC_SET_SHUFFLE,
// uMsg: WM_USER, wParam: rating (0 - 10), lParam: 141 [Sent by/to player]
// CAD sends this message to the player with the new rating (0 - 10). The
// player sends this message when the rating changes.
IPC_RATING_CHANGED_NOTIFICATION = 639, IPC_RATING_CHANGED_NOTIFICATION = 639,
IPC_SET_RATING = 639,
// uMsg: WM_COPYDATA, wParam: 700, lParam: COPYDATASTRUCT [Sent by player] IPC_REGISTER_NOTIFICATION = 700,
// The player sends this message on start up. Refer to the SDK manual for detailed info. IPC_CURRENT_TRACK_NOTIFICATION = 701,
IPC_REGISTER_PLAYER = 700, // Sent by player to CAD on startup. IPC_CURRENT_LYRICS_NOTIFICATION = 702,
IPC_NEW_LYRICS_NOTIFICATION = 703,
// uMsg: WM_COPYDATA, wParam: 701, lParam: COPYDATASTRUCT [Sent by player] IPC_NEW_COVER_NOTIFICATION = 800,
// The player sends this when it receives the IPC_GET_CURRENT_TRACK message. IPC_GET_LYRICS = 801
IPC_CURRENT_TRACK_INFO,
// uMsg: WM_COPYDATA, wParam: 702, lParam: COPYDATASTRUCT [Sent by player]
// The player sends this when it receives the IPC_GET_CURRENT_LYRICS message.
IPC_CURRENT_LYRICS,
// uMsg: WM_COPYDATA, wParam: 703, lParam: COPYDATASTRUCT [Sent by player]
// The player sends this when, for example, new lyrics have been retrieved.
IPC_NEW_LYRICS,
// uMsg: WM_COPYDATA, wParam: 800, lParam: COPYDATASTRUCT [Sent by player]
// The player sends this when a new cover is available for playing track.
IPC_NEW_COVER = 800,
// uMsg: WM_USER, wParam: 0, lParam: 801
IPC_GET_CURRENT_LYRICS,
}; };
#endif #endif

View File

@ -22,6 +22,7 @@
// WinAPI // WinAPI
#include <Windows.h> #include <Windows.h>
#include <WinInet.h> #include <WinInet.h>
#include <Psapi.h>
// STL // STL
#include <string> #include <string>