📄 mplayer.cpp
字号:
/*
This file is part of KCeasy (http://www.kceasy.com)
Copyright (C) 2002-2004 Markus Kern <mkern@kceasy.com>
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.
*/
//---------------------------------------------------------------------------
#pragma hdrstop
#include "MPlayer.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#define SIMPLEVLC_DLL "simplevlc.dll"
// required simplevlc version
#define REQ_SVLC_VERSION_MAJOR 0
#define REQ_SVLC_VERSION_MINOR 1
// global window proc for our display window
static long FAR PASCAL gDisplayWndProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
TMPlayer* Player = (TMPlayer*)::GetProp(hWnd, "MPlayer");
if(Player)
return Player->DisplayWndProc(hWnd,Msg,wParam,lParam);
return ::DefWindowProc(hWnd,Msg,wParam,lParam);
}
// global svlc callback
static void SVLC_CC gSVlcCallbackFunc (HSVLC svlc, SVlcCallbackEvent event, void *edata, void *udata)
{
TMPlayer* Player = (TMPlayer*)udata;
if(svlc != Player->hVlc)
return; // wtf?
// send a windows message so we are in the right thread
::SendMessage(Player->Handle, WM_SVLC_CALLBACK, (WPARAM)event, (LPARAM)edata);
}
// public
__fastcall TMPlayer::TMPlayer(TComponent* Owner)
: TWinControl(Owner),
hVlcDll(NULL),
hVlc(NULL),
VlcIntf(NULL),
DisplayWnd(NULL)
{
Align = alClient;
BevelInner = bvNone;
BevelOuter = bvNone;
}
__fastcall TMPlayer::~TMPlayer()
{
Shutdown();
}
bool TMPlayer::Initialize(int LogLevel)
{
if(!LoadVlc(LogLevel))
return false;
if(!CreateDisplayWnd())
return false;
// set display window
if(VlcIntf->set_window(hVlc,(unsigned int)DisplayWnd) < 0)
return false;
// display video in original size by default
SetDisplaySize(MPDefaultSize);
return true;
}
bool TMPlayer::Shutdown()
{
if(!IsVlcLoaded())
return true;
UnloadVlc();
DestroyDisplayWnd();
return true;
}
// playback
bool TMPlayer::Play(string Filename)
{
if(!IsVlcLoaded())
return false;
// make at least sure the file exists
if(::GetFileAttributes (Filename.c_str()) == 0xFFFFFFFF)
return false;
if(VlcIntf->play(hVlc, Filename.c_str()) < 0)
return false;
return true;
}
bool TMPlayer::PlayNetwork(string Url)
{
if(!IsVlcLoaded())
return false;
if(VlcIntf->play(hVlc, Url.c_str()) < 0)
return false;
return true;
}
bool TMPlayer::Stop()
{
if(!IsVlcLoaded())
return false;
if(VlcIntf->stop(hVlc) < 0)
return false;
return true;
}
bool TMPlayer::Pause(bool Pause)
{
if(!IsVlcLoaded())
return false;
if(VlcIntf->pause(hVlc, Pause) < 0)
return false;
return true;
}
bool TMPlayer::TogglePause()
{
if(!IsVlcLoaded())
return false;
if(VlcIntf->pause(hVlc, -1) < 0)
return false;
return true;
}
TMPlayerState TMPlayer::GetState()
{
if(!IsVlcLoaded())
return MPStopped;
return ConvertVlcState(VlcIntf->get_playback_state(hVlc));
}
bool TMPlayer::IsSeekable()
{
int seekable;
if(!IsVlcLoaded())
return false;
if((seekable = VlcIntf->is_seekable(hVlc)) < 0)
return false; // hmm
return seekable;
}
bool TMPlayer::SetPosition(float Position)
{
if(!IsVlcLoaded())
return false;
if(VlcIntf->set_position(hVlc, Position) < 0)
return false;
return true;
}
float TMPlayer::GetPosition()
{
float Position;
if(!IsVlcLoaded())
return 0;
if((Position = VlcIntf->get_position(hVlc)) < 0)
return 0;
return Position;
}
int TMPlayer::GetDuration()
{
int Duration;
if(!IsVlcLoaded())
return false;
if((Duration = VlcIntf->get_duration(hVlc)) < 0)
return 0;
return Duration;
}
bool TMPlayer::GetStreamCount(int* Audio, int* Video)
{
SVlcStreamInfo Info;
if(!IsVlcLoaded())
return false;
if(VlcIntf->get_stream_info(hVlc, &Info) < 0)
return false;
if(Audio) *Audio = Info.audio_streams;
if(Video) *Video = Info.video_streams;
return true;
}
bool TMPlayer::SetVisualization(bool Show)
{
if(!IsVlcLoaded())
return false;
char* Name = Show ? "goom" : NULL;
if(VlcIntf->set_visualization(hVlc, Name) < 0)
return false;
return true;
}
// video output
TMPlayerDisplaySize TMPlayer::GetDisplaySize()
{
int Fullscreen, FitToScreen;
float Zoom;
if((Fullscreen = VlcIntf->get_fullscreen(hVlc)) < 0)
return MPDefaultSize;
if(Fullscreen == 1)
return MPFullscreen;
if((FitToScreen = VlcIntf->get_fitwindow(hVlc)) < 0)
return MPDefaultSize;
if(FitToScreen == 1)
return MPFitToWindow;
if((Zoom = VlcIntf->get_zoom(hVlc)) < 0)
return MPDefaultSize;
if(Zoom == 0.5) return MPHalfSize;
if(Zoom == 1) return MPDefaultSize;
if(Zoom == 2) return MPDoubleSize;
return MPDefaultSize;
}
bool TMPlayer::SetDisplaySize(TMPlayerDisplaySize Size)
{
if(!IsVlcLoaded())
return false;
switch(Size)
{
case MPHalfSize:
// switch to normal size
if(VlcIntf->set_fullscreen(hVlc,0) < 0)
return false;
// unfit fit to window
if(VlcIntf->set_fitwindow(hVlc,0) < 0)
return false;
// set zoom factor
if(VlcIntf->set_zoom(hVlc,0.5) < 0)
return false;
break;
case MPDefaultSize:
// switch to normal size
if(VlcIntf->set_fullscreen(hVlc,0) < 0)
return false;
// unfit fit to window
if(VlcIntf->set_fitwindow(hVlc,0) < 0)
return false;
// set zoom factor
if(VlcIntf->set_zoom(hVlc,1.0) < 0)
return false;
break;
case MPDoubleSize:
// switch to normal size
if(VlcIntf->set_fullscreen(hVlc,0) < 0)
return false;
// unfit fit to window
if(VlcIntf->set_fitwindow(hVlc,0) < 0)
return false;
// set zoom factor
if(VlcIntf->set_zoom(hVlc,2.0) < 0)
return false;
break;
case MPFitToWindow:
// switch to normal size
if(VlcIntf->set_fullscreen(hVlc,0) < 0)
return false;
// fit to window
if(VlcIntf->set_fitwindow(hVlc,1) < 0)
return false;
break;
case MPFullscreen:
// switch to fullscreen
if(VlcIntf->set_fullscreen(hVlc,1) < 0)
return false;
// fit to window
if(VlcIntf->set_fitwindow(hVlc,1) < 0)
return false;
break;
default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -