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

📄 mediaplayer.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2002 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include <qtopia/qpeapplication.h>#include <qtopia/qlibrary.h>#include <qtopia/resource.h>#include <qtopia/config.h>#include <qmainwindow.h>#include <qmessagebox.h>#include <qwidgetstack.h>#include <qfile.h>#include "mediaplayer.h"#include "playlistwidget.h"#include "audiowidget.h"#include "videowidget.h"#include "loopcontrol.h"#include "audiodevice.h"#include "mediaplayerstate.h"#include "maindocumentwidgetstack.h"extern PlayListWidget *playList;extern LoopControl *loopControl;MediaPlayer::MediaPlayer( QObject *parent, const char *name )    : QObject( parent, name ), currentFile( NULL ), upTimerId( 0 ), dnTimerId( 0 ), rtTimerId( 0 ), ltTimerId( 0 ){    connect( mainDocumentWindow, SIGNAL( openURL( const QString&, const QString& ) ), this, SLOT( openURL( const QString&, const QString& ) ) );    connect( mediaPlayerState, SIGNAL( playingToggled( bool ) ), this, SLOT( setPlaying( bool ) ) );    connect( mediaPlayerState, SIGNAL( pausedToggled( bool ) ),  this, SLOT( pauseCheck( bool ) ) );    connect( mediaPlayerState, SIGNAL( next() ),		 this, SLOT( next() ) );    connect( mediaPlayerState, SIGNAL( prev() ),		 this, SLOT( prev() ) );    connect( mediaPlayerState, SIGNAL( increaseVolume() ),	 this, SLOT( startIncreasingVolume() ) );    connect( mediaPlayerState, SIGNAL( endIncreaseVolume() ),	 this, SLOT( stopIncreasingVolume() ) );    connect( mediaPlayerState, SIGNAL( decreaseVolume() ),	 this, SLOT( startDecreasingVolume() ) );    connect( mediaPlayerState, SIGNAL( endDecreaseVolume() ),	 this, SLOT( stopDecreasingVolume() ) );    connect( mediaPlayerState, SIGNAL( scanForward() ),		 this, SLOT( startScanningForward() ) );    connect( mediaPlayerState, SIGNAL( endScanForward() ),	 this, SLOT( stopScanningForward() ) );    connect( mediaPlayerState, SIGNAL( scanBackward() ),	 this, SLOT( startScanningBackward() ) );    connect( mediaPlayerState, SIGNAL( endScanBackward() ),	 this, SLOT( stopScanningBackward() ) );    // Handle all key presses    qApp->installEventFilter( this );}MediaPlayer::~MediaPlayer(){}void MediaPlayer::pauseCheck( bool b ){    // Only pause if playing    if ( b && !mediaPlayerState->playing() )	mediaPlayerState->setPaused( FALSE );}void MediaPlayer::play(){    mediaPlayerState->setPlaying( FALSE );    mediaPlayerState->setPlaying( TRUE );}void MediaPlayer::error( const QString& error, const QString& errorMsg ){    QMessageBox::critical( 0, error, errorMsg );    mediaPlayerState->setPlaying( FALSE );    mediaPlayerState->closeView();}void MediaPlayer::openURL( const QString &URL, const QString &mimetype ){    setPlaying( false );    if ( !mediaPlayerState->streamingDecoder( URL, mimetype ) ) {	error( tr( "No decoder found"), tr( "Sorry, no appropriate decoders found for the url: %1" ).arg( "<i>" + URL + "</i>" ) );	return;    }    if ( !loopControl->init( URL, mimetype, true ) ) {	error( tr( "Error opening file"), tr( "Sorry, an error occurred trying to play the url: %1" ).arg( "<i>" + URL + "</i>" ) );	return;    }    loopControl->play();    if ( !loopControl->hasVideo() ) {	QString tickerText = " " + tr( "URL: %1" ).arg( URL );	long seconds = loopControl->totalPlaytime() / 1000;	if ( seconds > 0 ) 	    tickerText += "   " + tr( "Length: %1" ).arg( ControlWidgetBase::toTimeString( seconds ) );	mediaPlayerState->audioUI()->setTickerText( tickerText + "  " );    }}void MediaPlayer::setPlaying( bool play ){    if ( !play ) {	loopControl->stop( FALSE );	mediaPlayerState->setPaused( FALSE );	return;    }    if ( mediaPlayerState->paused() ) {	mediaPlayerState->setPaused( FALSE );	return;    }    const DocLnk *playListCurrent = playList->current();    if ( playListCurrent != NULL ) {	loopControl->stop( TRUE );	currentFile = playListCurrent;    }    if ( currentFile == NULL ) {	error( tr( "No file"), tr( "Error: There is no file selected" ) );	return;    }    QString fileStr = currentFile->file();    QString nameStr = currentFile->name();    if ( !QFile::exists( fileStr ) ) {	error( tr( "File not found" ), tr( "The following file was not found: <br>%1<br><i>%2</i>" ).arg( nameStr ).arg( fileStr ) );	return;    }    if ( !mediaPlayerState->decoder( fileStr ) ) {	error( tr( "No decoder found" ), tr( "Sorry, no appropriate decoders found for this file: <br>%1<br><i>%2</i>" ).arg( nameStr ).arg( fileStr ) );	return;    }    if ( !loopControl->init( fileStr ) ) {	error( tr( "Error opening file" ), tr( "Sorry, an error occurred trying to play the file: <br>%1<br><i>%2</i>" ).arg( nameStr ).arg( fileStr ) );	return;    }    loopControl->play();    if ( !loopControl->hasVideo() ) {	QString tickerText = " " + tr( "File: %1" ).arg( nameStr );	long seconds = loopControl->totalPlaytime() / 1000;	if ( seconds > 0 ) 	    tickerText += "   " + tr( "Length: %1" ).arg( ControlWidgetBase::toTimeString( seconds ) );	mediaPlayerState->audioUI()->setTickerText( tickerText + "  " );    }}void MediaPlayer::prev(){    if ( playList->prev() )	play();    else 	mediaPlayerState->setList();}void MediaPlayer::next(){    if ( playList->next() )	play();    else    	mediaPlayerState->setList();}void MediaPlayer::startDecreasingVolume(){    if ( dnTimerId )	return;    dnTimerId = startTimer( 100 );    AudioDevice::decreaseVolume();}void MediaPlayer::startIncreasingVolume(){    if ( upTimerId )	return;     upTimerId = startTimer( 100 );    AudioDevice::increaseVolume();}void MediaPlayer::startScanningBackward(){    if ( !mediaPlayerState->seekable() )	return;    if ( ltTimerId )	return;    mediaPlayerState->setPaused( !mediaPlayerState->paused() );    ltTimerId = startTimer( 200 );    mediaPlayerState->startTemporaryMute();}void MediaPlayer::startScanningForward(){    if ( !mediaPlayerState->seekable() )	return;    if ( rtTimerId )	return;    mediaPlayerState->setPaused( !mediaPlayerState->paused() );    rtTimerId = startTimer( 200 );    mediaPlayerState->startTemporaryMute();}bool drawnOnScreenDisplay = FALSE;unsigned int onScreenDisplayVolume = 0;const int yoff = 110;void MediaPlayer::updateOnscreenDisplay(){    // Display an on-screen display volume    unsigned int l, r, v;    bool m;    AudioDevice::getVolume( l, r, m );    v = ((l + r) * 11) / (2*0xFFFF);    if ( drawnOnScreenDisplay && onScreenDisplayVolume == v )	return;    // Must make this draw according to the screen size    int w = mediaPlayerState->audioUI()->width();    int h = mediaPlayerState->audioUI()->height();    int vW = w * 90 / 100;    int mW = vW / 10;    int mH = mW * 3 / 2;    int tickWidth = mW / 2;    if ( drawnOnScreenDisplay ) {	if ( onScreenDisplayVolume > v )	    mediaPlayerState->audioUI()->repaint( (w - vW) / 2 + v * mW + 10, h - yoff + 40 - mH, (onScreenDisplayVolume - v) * mW + 9, mH, FALSE );    }    drawnOnScreenDisplay = TRUE;    onScreenDisplayVolume = v;    QPainter p( mediaPlayerState->audioUI() );    p.setPen( QColor( 0x10, 0xD0, 0x10 ) );    p.setBrush( QColor( 0x10, 0xD0, 0x10 ) );    QFont f;    f.setPixelSize( mW );    f.setBold( TRUE );    p.setFont( f );    p.drawText( (w - vW) / 2, h - yoff + 20 - mH, tr("Volume") );    for ( unsigned int i = 0; i < 10; i++ ) {	if ( v > i ) 	    p.drawRect( (w - vW) / 2 + i * mW + 10, h - yoff + 40 - mH, tickWidth, mH );	 else 	    p.drawRect( (w - vW) / 2 + i * mW + 13, h - yoff + 40 - mH + mW/2, tickWidth / 2, mH - mW );    }}void MediaPlayer::hideOnscreenDisplay(){    if ( drawnOnScreenDisplay == FALSE )	return;    // Get rid of the on-screen display stuff    drawnOnScreenDisplay = FALSE;    onScreenDisplayVolume = 0;    // Must fix this to repaint the area scaled by the screen size        int w = mediaPlayerState->audioUI()->width();    int h = mediaPlayerState->audioUI()->height();    int vW = w * 90 / 100;    int mW = vW / 10;    int mH = mW * 3 / 2;    mediaPlayerState->audioUI()->repaint( (w - vW) / 2, h - yoff - mH, vW + 9, 50 + mH, FALSE );}void MediaPlayer::stopDecreasingVolume(){    if ( dnTimerId ) {	killTimer( dnTimerId );	dnTimerId = 0;	hideOnscreenDisplay();    }}void MediaPlayer::stopIncreasingVolume(){    if ( upTimerId ) {	killTimer( upTimerId );	upTimerId = 0;	hideOnscreenDisplay();    }}void MediaPlayer::stopScanningBackward(){    if ( ltTimerId ) {	killTimer( ltTimerId );	ltTimerId = 0;	mediaPlayerState->setPaused( !mediaPlayerState->paused() );	mediaPlayerState->stopTemporaryMute( 500 );    }}void MediaPlayer::stopScanningForward(){    if ( rtTimerId ) {	killTimer( rtTimerId );	rtTimerId = 0;	mediaPlayerState->setPaused( !mediaPlayerState->paused() );	mediaPlayerState->stopTemporaryMute( 500 );    }}void MediaPlayer::timerEvent( QTimerEvent *te ){    if ( te->timerId() == dnTimerId ) {        AudioDevice::decreaseVolume();	updateOnscreenDisplay();    } else if ( te->timerId() == upTimerId ) {	AudioDevice::increaseVolume();	updateOnscreenDisplay();    } else if ( te->timerId() == ltTimerId ) {	scanning = TRUE;	int newPos;	if ( mediaPlayerState->view() == AudioView )	    newPos = mediaPlayerState->position() - 200000;	else {	    int increment = mediaPlayerState->length() / 50;	    newPos = mediaPlayerState->position() - increment;	}	if ( newPos > 0 )	    mediaPlayerState->setPosition( newPos );	else	    mediaPlayerState->setPosition( 0 );    } else if ( te->timerId() == rtTimerId ) {	scanning = TRUE;	int newPos;	if ( mediaPlayerState->view() == AudioView )	    newPos = mediaPlayerState->position() + 200000;	else {	    int increment = mediaPlayerState->length() / 50;	    newPos = mediaPlayerState->position() + increment;	}	if ( newPos <= mediaPlayerState->length() )	    mediaPlayerState->setPosition( newPos );	else	    mediaPlayerState->setPosition( mediaPlayerState->length() );    }}bool MediaPlayer::eventFilter( QObject *o, QEvent *e ){    if ( e->type() == QEvent::WindowActivate ) {	if ( o == mainDocumentWindow && mediaPlayerState && mediaPlayerState->view() == VideoView ) {	    mediaPlayerState->videoUI()->makeVisible();	    return TRUE;	}    }    if ( e->type() == QEvent::KeyPress )	if ( keyPressEvent( (QKeyEvent *)e ) )	    return TRUE;    if ( e->type() == QEvent::KeyRelease )	if ( keyReleaseEvent( (QKeyEvent *)e ) )	    return TRUE;    return QObject::eventFilter( o, e );}  bool MediaPlayer::keyPressEvent( QKeyEvent *e ){    if ( !mediaPlayerState->playing() ) {	// Ignore key presses that will be handled by the menubar	if ( !playList->listHasFocus() )	    return FALSE;	switch ( e->key() ) {	    case Key_Left:		mediaPlayerState->setPrevTab();		return TRUE;	    case Key_Right:		mediaPlayerState->setNextTab();		return TRUE;	    case Key_Space:		play();		return TRUE;	    default:		break;	}    } else {	if ( e->isAutoRepeat() )	    return FALSE;	switch( e->key() ) {	    case Key_Left:		scanning = FALSE;		startScanningBackward();		return TRUE;	    case Key_Right:		scanning = FALSE;		startScanningForward();		return TRUE;	    case Key_Up:		startIncreasingVolume();		return TRUE;	    case Key_Down:		startDecreasingVolume();		return TRUE;	    case Key_Space:		mediaPlayerState->setPaused( !mediaPlayerState->paused() );		return TRUE;	    case Key_Escape:		mediaPlayerState->setList();		return TRUE;	    default:		break;	}    }    return FALSE;}bool MediaPlayer::keyReleaseEvent( QKeyEvent *e ){    // Ignore all auto repeats    if ( e->isAutoRepeat() )	return FALSE;    switch( e->key() ) {	case Key_Left:	    if ( ltTimerId ) {		if ( !scanning ) {		    prev();		    mediaPlayerState->setPaused( !mediaPlayerState->paused() );		}		stopScanningBackward();		return TRUE;	    }	    break;	case Key_Right:	    if ( rtTimerId ) {		if ( !scanning ) {		    next();		    mediaPlayerState->setPaused( !mediaPlayerState->paused() );		}		stopScanningForward();		return TRUE;	    }	    break;    }    if ( !mediaPlayerState->playing() )	return FALSE;    switch( e->key() ) {	case Key_Up:	    stopIncreasingVolume();	    return TRUE;	case Key_Down:	    stopDecreasingVolume();	    return TRUE;	default:	    break;    }    return FALSE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -