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

📄 mplayer.cpp

📁 Last change: 2008-02-03 This is the source code of KCeasy。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
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 + -