Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
183
Src/Plugins/Input/in_wmvdrm/WinampInterface.cpp
Normal file
183
Src/Plugins/Input/in_wmvdrm/WinampInterface.cpp
Normal file
|
@ -0,0 +1,183 @@
|
|||
#include "Main.h"
|
||||
#include "WinampInterface.h"
|
||||
#include "../Winamp/wa_ipc.h"
|
||||
#include <cassert>
|
||||
#include "WMDRMModule.h"
|
||||
#include <strsafe.h>
|
||||
#include "WMPlaylist.h"
|
||||
#include "../nu/AutoChar.h"
|
||||
WinampInterface winamp;
|
||||
|
||||
extern WMDRM mod;
|
||||
using namespace Nullsoft::Utility;
|
||||
|
||||
#ifndef NO_DRM
|
||||
#include "vid_overlay.h"
|
||||
#include "vid_ddraw.h"
|
||||
|
||||
OverlayVideoOutput overlay;
|
||||
DDrawVideoOutput ddraw;
|
||||
#endif
|
||||
|
||||
|
||||
WinampInterface::WinampInterface()
|
||||
: videoWindow(0), bufferCount(0),
|
||||
statusGuard(GUARDNAME("WinampInterface::statusGuard"))
|
||||
{
|
||||
statusFilename[0] = 0;
|
||||
status[0] = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@returns winamp's video window handle
|
||||
*/
|
||||
HWND WinampInterface::GetVideoWindow()
|
||||
{
|
||||
return (HWND)GetVideoOutput()->extended(VIDUSER_GET_VIDEOHWND, 0, 0); // ask for the video hwnd
|
||||
}
|
||||
|
||||
IVideoOutput *WinampInterface::GetVideoOutput()
|
||||
{
|
||||
if (!videoWindow)
|
||||
videoWindow = (IVideoOutput *)SendMessage(GetWinampWindow(), WM_WA_IPC, 0, IPC_GET_IVIDEOOUTPUT); // ask winamp for an interface to the video output
|
||||
return videoWindow;
|
||||
|
||||
}
|
||||
|
||||
void WinampInterface::EndOfFile()
|
||||
{
|
||||
PostMessage(GetWinampWindow(), WM_WA_MPEG_EOF, 0, 0);
|
||||
}
|
||||
|
||||
HWND WinampInterface::GetWinampWindow()
|
||||
{
|
||||
return plugin.hMainWindow;
|
||||
}
|
||||
|
||||
void WinampInterface::SetStatus(wchar_t *_status)
|
||||
{
|
||||
{
|
||||
AutoLock lock (statusGuard);
|
||||
StringCchCopy(status, 1024, _status);
|
||||
StringCchCopy(statusFilename, FILENAME_SIZE, activePlaylist.GetFileName());
|
||||
}
|
||||
PostMessage(GetWinampWindow(), WM_WA_IPC, 0, IPC_UPDTITLE);
|
||||
}
|
||||
|
||||
bool WinampInterface::GetStatus(wchar_t *title, size_t titleLen, const wchar_t *filename)
|
||||
{
|
||||
AutoLock lock (statusGuard);
|
||||
|
||||
if (status[0] && title && filename && !lstrcmpi(statusFilename, filename))
|
||||
{
|
||||
StringCchPrintf(title, titleLen, L"[%s]%s", status, filename);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
bool WinampInterface::GetStatusHook(wchar_t *title, size_t titleLen, const wchar_t *filename)
|
||||
{
|
||||
AutoLock lock (statusGuard);
|
||||
|
||||
if (status[0] && title && filename && !lstrcmpi(statusFilename, filename))
|
||||
{
|
||||
wchar_t *oldTitle = _wcsdup(title);
|
||||
StringCchPrintf(title, titleLen, L"[%s]%s", status, oldTitle);
|
||||
free(oldTitle);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
bool WinampInterface::HasStatus(const wchar_t *filename)
|
||||
{
|
||||
AutoLock lock (statusGuard);
|
||||
if (status[0] && filename && !lstrcmpi(statusFilename, filename))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void WinampInterface::ClearStatus()
|
||||
{
|
||||
{
|
||||
//AutoLock lock (statusGuard); // should be safe not to lock here
|
||||
status[0] = 0;
|
||||
statusFilename[0]=0;
|
||||
}
|
||||
PostMessage(GetWinampWindow(), WM_WA_IPC, 0, IPC_UPDTITLE);
|
||||
}
|
||||
|
||||
void WinampInterface::EncryptedDrawFrame(void *frame)
|
||||
{
|
||||
#ifndef NO_DRM
|
||||
overlay.SetFrame(frame);
|
||||
ddraw.SetFrame(frame);
|
||||
SecureZeroMemory(&frame, sizeof(void *));
|
||||
GetVideoOutput()->draw((void *)1);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool WinampInterface::OpenEncryptedVideo(int width, int height, bool flip, double aspect, int fourcc)
|
||||
{
|
||||
#ifndef NO_DRM
|
||||
VideoOpenStruct openVideo = {width, height, flip, aspect, fourcc};
|
||||
|
||||
bool openedOK = false;
|
||||
if (config_video.overlays())
|
||||
{
|
||||
openedOK = !!GetVideoOutput()->extended(VIDUSER_OPENVIDEORENDERER, (intptr_t)(VideoRenderer *)&overlay, (intptr_t)&openVideo);
|
||||
if (openedOK)
|
||||
return true;
|
||||
}
|
||||
|
||||
openedOK = !!GetVideoOutput()->extended(VIDUSER_OPENVIDEORENDERER, (intptr_t)(VideoRenderer *)&ddraw, (intptr_t)&openVideo);
|
||||
if (openedOK)
|
||||
return true;
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void WinampInterface::CloseEncryptedVideo()
|
||||
{
|
||||
GetVideoOutput()->extended(VIDUSER_CLOSEVIDEORENDERER, 0, 0);
|
||||
}
|
||||
|
||||
void WinampInterface::Buffering(int bufStatus, const wchar_t *displayString)
|
||||
{
|
||||
char tempdata[75*2] = {0, };
|
||||
|
||||
int csa = plugin.SAGetMode();
|
||||
if (csa & 1)
|
||||
{
|
||||
for (int x = 0; x < bufStatus*75 / 100; x ++)
|
||||
tempdata[x] = x * 16 / 75;
|
||||
}
|
||||
else if (csa&2)
|
||||
{
|
||||
int offs = (csa & 1) ? 75 : 0;
|
||||
int x = 0;
|
||||
while (x < bufStatus*75 / 100)
|
||||
{
|
||||
tempdata[offs + x++] = -6 + x * 14 / 75;
|
||||
}
|
||||
while (x < 75)
|
||||
{
|
||||
tempdata[offs + x++] = 0;
|
||||
}
|
||||
}
|
||||
else if (csa == 4)
|
||||
{
|
||||
tempdata[0] = tempdata[1] = (bufStatus * 127 / 100);
|
||||
}
|
||||
if (csa) plugin.SAAdd(tempdata, ++bufferCount, (csa == 3) ? 0x80000003 : csa);
|
||||
|
||||
wchar_t temp[64] = {0};
|
||||
StringCchPrintf(temp, 64, L"%s: %d%%",displayString, bufStatus);
|
||||
SetStatus(temp);
|
||||
//SetVideoStatusText(temp); // TODO: find a way to set the old status back
|
||||
GetVideoOutput()->notifyBufferState(static_cast<int>(bufStatus*2.55f));
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue