From 840e44417402bbc6048ca5e8ff3dd6be966e753f Mon Sep 17 00:00:00 2001 From: alwin Date: Sun, 10 Apr 2005 22:18:50 +0000 Subject: added opieplayer3 this moment not just more than another container around xine like opieplayer2 (and uses a lot of code direct from there) difference: first it was a testcontainer to find the bugs in player2 now it is a player looks more like kino2 (eg, no stylesheets) so it has a real resizeable video-display. early stage (saving playlists and so on doesn't work) - but it can display videos on my C860 in bigger box than this small stamp like player2 ;) --- diff --git a/apps/Applications/opieplayer3.desktop b/apps/Applications/opieplayer3.desktop new file mode 100644 index 0000000..cc2574d --- a/dev/null +++ b/apps/Applications/opieplayer3.desktop @@ -0,0 +1,30 @@ +[Desktop Entry] +Exec=opie-mediaplayer3 +Icon=opieplayer2/OpiePlayer +MimeType=audio/mpeg;audio/x-wav;audio/x-mpegurl;audio/x-ogg;video/x-ogm;video/x-ms-asf;video/quicktime;video/mpeg;video/x-msvideo;playlist/plain; +MimeTypeIcons=Sound;Sound;Sound;Sound;MPEGPlayer;MPEGPlayer;MPEGPlayer;MPEGPlayer;MPEGPlayer;opieplayer2/playlist2 +Type=Application +Name=Opie Media Player 3 +Comment=A Media Player +Name[da]=Opie Player 3 +Comment[da]=En medie-afspiller +Name[de]=Media Player 3 +Comment[de]=Ein Abspielprogramm fuer Multimediadateien +Name[es]=Multimedia +Comment[es]=Reproductor de ficheros multimedia +Name[fr]=Opie Media Player 3 +Comment[fr]=Lecteur multimédia +Name[it]=Lettore Multimediale 3 +Comment[it]=Lettore di file multimediali +Name[pt]=Multimédia +Comment[pt]=Leitor de ficheiros multimédia +Name[pt_BR]=Leitor multimédia +Comment[pt_BR]=Leitor de ficheiros multimédia +Name[sl]=Večpredstavnostni predvajalnik +Comment[sl]=Večpredstavnostni predvajalnik +Name[nl]=Mediaspeler +Comment[nl]=Speler voor Audio en Filmpjes +Name[lv]=Medijuplejeris +Comment[lv]=Programma Audio failu atskaņošanai +Name[ru]=Медиаплеер Opie +Comment[ru]=Медиаплеер diff --git a/noncore/multimedia/opieplayer3/audiowidget.cpp b/noncore/multimedia/opieplayer3/audiowidget.cpp new file mode 100644 index 0000000..7ba6274 --- a/dev/null +++ b/noncore/multimedia/opieplayer3/audiowidget.cpp @@ -0,0 +1,125 @@ +#include "audiowidget.h" +#include "../opieplayer2/lib.h" +#include "../opieplayer2/threadutil.h" + +#include + +#include +#include +#include +#include + +AudioWidget::AudioWidget( QWidget * parent, const char * name, WFlags f) + :QWidget(parent,name,f) +{ + m_xineLib = 0; + + m_MainLayout = new QVBoxLayout(this); + m_MainLayout->setAutoAdd(true); + m_InfoBox = new QTextView(this); + m_PosSlider = new QSlider(QSlider::Horizontal,this); + m_PosSlider->setTickInterval(60); + connect(m_PosSlider,SIGNAL(valueChanged(int)),this,SLOT(slotNewPos(int))); + connect(m_PosSlider,SIGNAL(sliderMoved(int)),this,SLOT(slotNewPos(int))); + connect(m_PosSlider,SIGNAL(sliderPressed()),this,SLOT(sliderPressed())); + connect(m_PosSlider,SIGNAL(sliderReleased()),this,SLOT(sliderReleased())); + m_pressed = false; + m_uppos=0; +} + +AudioWidget::~AudioWidget() +{ +} + +void AudioWidget::slotNewPos(int pos) +{ + if (!m_xineLib) return; + if (m_uppos==pos) return; + m_xineLib->seekTo(pos); +} + +void AudioWidget::sliderPressed() +{ + m_pressed = true; +} + +void AudioWidget::sliderReleased() +{ + m_pressed = false; +} + +void AudioWidget::closeEvent(QCloseEvent*e) +{ + odebug << "AudioWidget::closeEvent(QCloseEvent*e)" << oendl; + if (m_xineLib) { + m_xineLib->stop(); + } + QWidget::closeEvent(e); +} + +void AudioWidget::playFile(const DocLnk&aLnk,XINE::Lib*aLib) +{ + m_current = aLnk; + if (m_xineLib != aLib) { + disconnect(m_xineLib); + m_xineLib = aLib; + } + if (!m_xineLib) { + return; + } + m_uppos=0; + m_PosSlider->setValue(0); + m_xineLib->setShowVideo(false); + m_xineLib->play(m_current.file()); + // title + QString title = m_xineLib->metaInfo(0); + // artist + QString artist = m_xineLib->metaInfo(2); + // album + QString album = m_xineLib->metaInfo(4); + + int l = m_xineLib->length(); + m_PosSlider->setRange(0,l); + QString laenge=""; + int h = l/3600; + l-=h*3600; + int m = l/60; + l-=m*60; + if (h>0) { + laenge+=QString("%1 h").arg(h); + } + if (m>0) { + if (!laenge.isEmpty()) laenge+=" "; + laenge+=QString("%1 m").arg(m); + } + if (l>0) { + if (!laenge.isEmpty()) laenge+=" "; + laenge+=QString("%1 s").arg(l); + } + QString text = ""; + if (artist.length()) { + text+="

"+artist+"

"; + } + if (title.length()) { + text+="

"+title+"

"; + } + if (album.length()) { + text+="

"+album+"

"; + } + text+="

"+laenge+"

"; + m_InfoBox->setText(text); +} + +void AudioWidget::stopPlaying() +{ + if (m_xineLib) { + m_xineLib->stop(); + } +} + +void AudioWidget::updatePos(int val) +{ + if (m_pressed) return; + m_uppos = val; + m_PosSlider->setValue(val); +} diff --git a/noncore/multimedia/opieplayer3/audiowidget.h b/noncore/multimedia/opieplayer3/audiowidget.h new file mode 100644 index 0000000..07b51b6 --- a/dev/null +++ b/noncore/multimedia/opieplayer3/audiowidget.h @@ -0,0 +1,46 @@ +#ifndef _audiowidget_h +#define _audiowidget_h + +#include + +#include + +namespace XINE { + class Lib; +} + +class QVBoxLayout; +class QTextView; +class QSlider; +class QLabel; + +class AudioWidget:public QWidget +{ + Q_OBJECT +public: + AudioWidget( QWidget * parent=0, const char * name=0, WFlags f=0 ); + virtual ~AudioWidget(); + + void playFile(const DocLnk&,XINE::Lib*); + +public slots: + virtual void stopPlaying(); + virtual void updatePos(int); + +protected: + XINE::Lib*m_xineLib; + DocLnk m_current; + QVBoxLayout*m_MainLayout; + QTextView*m_InfoBox; + QSlider*m_PosSlider; + bool m_pressed; + int m_uppos; + +protected slots: + virtual void closeEvent(QCloseEvent*e); + virtual void slotNewPos(int pos); + virtual void sliderPressed(); + virtual void sliderReleased(); +}; + +#endif diff --git a/noncore/multimedia/opieplayer3/config.in b/noncore/multimedia/opieplayer3/config.in new file mode 100644 index 0000000..f2465a8 --- a/dev/null +++ b/noncore/multimedia/opieplayer3/config.in @@ -0,0 +1,6 @@ + config OPIEPLAYER3 + boolean "opieplayer3 (multimedia player based on libxine)" + default "n" + depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2UI && LIBXINE_DEP + comment "opieplayer2 requires libopie2core, libopie2ui and libxine" + depends !( ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2UI && LIBXINE_DEP ) diff --git a/noncore/multimedia/opieplayer3/mwindow.cpp b/noncore/multimedia/opieplayer3/mwindow.cpp new file mode 100644 index 0000000..dab910a --- a/dev/null +++ b/noncore/multimedia/opieplayer3/mwindow.cpp @@ -0,0 +1,320 @@ +/* + This file is part of the Opie Project + + Copyright (c) 2002 Max Reiss + Copyright (c) 2002 L. Potter + Copyright (c) 2002 Holger Freyther + =. + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include "mwindow.h" +#include "playlist.h" +#include "audiowidget.h" +#include "videowidget.h" +#include "../opieplayer2/lib.h" + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +OPIE_EXPORT_APP( Opie::Core::OApplicationFactory) + +using namespace Opie::Ui; + +PMainWindow::PMainWindow(QWidget*w, const char*name, WFlags f) + : QMainWindow(w,name,f) +{ + setCaption( QObject::tr("Opie Mediaplayer 3" ) ); + setupActions(); + setupToolBar(); + setupMenu(); + + m_stack = new OWidgetStack(this); + m_stack->forceMode(Opie::Ui::OWidgetStack::SmallScreen); + setCentralWidget(m_stack ); + m_playList = new PlaylistView(m_stack,"playlist"); + m_stack->addWidget(m_playList,stack_list); + + m_sfl = new OFileSelector("video/*;audio/*",m_stack); + m_stack->addWidget(m_sfl,stack_file); + connect(m_sfl, SIGNAL(fileSelected(const DocLnk &)), m_playList, SLOT(slotAddFile(const DocLnk &))); + m_AudioPlayer = new AudioWidget(m_stack); + m_stack->addWidget(m_AudioPlayer,stack_audio); + connect(this,SIGNAL(sigPos(int)),m_AudioPlayer,SLOT(updatePos(int))); + m_VideoPlayer = new VideoWidget(m_stack); + m_stack->addWidget(m_VideoPlayer,stack_video); + connect(this,SIGNAL(sigPos(int)),m_VideoPlayer,SLOT(updatePos(int))); + connect(m_VideoPlayer,SIGNAL(videoclicked()),this,SLOT(slotVideoclicked())); + + m_stack->raiseWidget(stack_list); + m_PlayLib = 0; + m_LastItem = 0; +} + +void PMainWindow::checkLib() +{ + if (m_PlayLib == 0) { + m_PlayLib = new XINE::Lib(XINE::Lib::InitializeImmediately); + m_PlayLib->ensureInitialized(); + connect(m_PlayLib,SIGNAL(stopped()),this,SLOT(slotStopped())); + } +} + +PMainWindow::~PMainWindow() +{ + if (m_PlayLib) { + m_PlayLib->stop(); + delete m_PlayLib; + } +} + +void PMainWindow::fileSelected(const DocLnk&) +{ +} + +void PMainWindow::slotAppendFiles() +{ + m_stack->raiseWidget(m_sfl); +} + +void PMainWindow::slotShowList() +{ + m_stack->raiseWidget(m_playList); +} + +void PMainWindow::slotPlayList() +{ + if (m_playing && m_LastItem && m_PlayLib) { + if (!m_LastItem->isVideo()) { + m_stack->raiseWidget(stack_audio); + } else { + m_stack->raiseWidget(stack_video); + } + return; + } + + m_LastItem = m_playList->currentItem(); + if (!m_LastItem) { + slotPlayNext(); + return; + } + //m_VideoPlayer->setFullScreen(a_ShowFull->isOn()); + slotPlayCurrent(); +} + +void PMainWindow::hideVideo() +{ + if (m_VideoPlayer->isVisible() && a_ShowFull->isOn()) { + m_VideoPlayer->showNormal(); + m_VideoPlayer->hide(); + } +} + +void PMainWindow::slotPlayCurrent() +{ + if (!m_LastItem) { + if (m_PlayLib) m_PlayLib->stop(); + hideVideo(); + m_stack->raiseWidget(stack_list); + return; + } + checkLib(); + m_CurrentPos = 0; + m_playList->setCurrentItem(m_LastItem); + odebug << "Pos: " << m_PlayLib->currentTime() << oendl; + if (!m_LastItem->isVideo()) { + hideVideo(); + m_playing = true; + QTimer::singleShot( 500, this, SLOT( slotCheckPos() ) ); + m_stack->raiseWidget(stack_audio); + m_AudioPlayer->playFile(m_LastItem->Lnk(),m_PlayLib); + } else { + m_playing = true; + QTimer::singleShot( 500, this, SLOT( slotCheckPos() ) ); + setupVideo(a_ShowFull->isOn()); + m_VideoPlayer->playFile(m_LastItem->Lnk(),m_PlayLib); + } +} + +void PMainWindow::slotPlayNext() +{ + PlaylistItem*item = m_playList->nextItem(m_LastItem); + if (!item) return; + m_LastItem = item; + slotPlayCurrent(); +} + +void PMainWindow::slotGoNext() +{ + m_LastItem = m_playList->nextItem(m_LastItem); + slotPlayCurrent(); +} + +void PMainWindow::slotPlayPrevious() +{ + PlaylistItem*item = m_playList->prevItem(m_LastItem); + if (!item) return; + m_LastItem = item; + slotPlayCurrent(); +} + +void PMainWindow::slotUserStop() +{ + if (!m_playing || !m_PlayLib) return; + m_playing = false; + m_PlayLib->stop(); + hideVideo(); + m_stack->raiseWidget(stack_list); +} + +void PMainWindow::slotStopped() +{ + if (!m_playing) return; + m_playing = false; + slotGoNext(); +} + +void PMainWindow::slotCheckPos() +{ + if (!m_playing) return; + emit sigPos(m_PlayLib->currentTime()); + QTimer::singleShot( 1000, this, SLOT( slotCheckPos() ) ); +} + +void PMainWindow::slotRemoveFiles() +{ + slotUserStop(); + PlaylistItem* Item = m_playList->currentItem(); + m_stack->raiseWidget(stack_list); + m_playList->removeFromList(Item); +} + +void PMainWindow::setupActions() +{ + a_appendFiles = new QAction(tr("Open file(s)"),Resource::loadIconSet( "opieplayer2/add_to_playlist" ), 0, 0, this, 0, false ); + connect(a_appendFiles,SIGNAL(activated()),this,SLOT(slotAppendFiles())); + a_showPlaylist = new QAction(tr("Show playlist"),Resource::loadIconSet( "txt" ), 0, 0, this, 0, false ); + connect(a_showPlaylist,SIGNAL(activated()),this,SLOT(slotShowList())); + a_removeFiles = new QAction(tr("Remove file"),Resource::loadIconSet( "opieplayer2/remove_from_playlist" ), 0, 0, this, 0, false ); + connect(a_removeFiles,SIGNAL(activated()),this,SLOT(slotRemoveFiles())); + + playersGroup = new QActionGroup(this,"playgroup",false); + + a_playAction = new QAction(tr("Play list"),Resource::loadIconSet( "opieplayer2/play" ), 0, 0, this, 0, false ); + connect(a_playAction,SIGNAL(activated()),this,SLOT(slotPlayList())); + a_playNext = new QAction(tr("Play next in list"),Resource::loadIconSet( "fastforward" ), 0, 0, this, 0, false ); + connect(a_playNext,SIGNAL(activated()),this,SLOT(slotPlayNext())); + a_playPrevious = new QAction(tr("Play previous in list"),Resource::loadIconSet( "fastback" ), 0, 0, this, 0, false ); + connect(a_playPrevious,SIGNAL(activated()),this,SLOT(slotPlayPrevious())); + a_ShowFull = new QAction(tr("Show videos fullscreen"),Resource::loadIconSet( "fullscreen" ), 0, 0, this, 0, true ); + connect(a_ShowFull,SIGNAL(toggled(bool)),this,SLOT(slotToggleFull(bool))); + a_stopPlay = new QAction(tr("Show videos fullscreen"),Resource::loadIconSet( "stop" ), 0, 0, this, 0, false ); + connect(a_stopPlay,SIGNAL(activated()),this,SLOT(slotUserStop())); + + playersGroup->insert(a_playPrevious); + playersGroup->insert(a_playAction); + playersGroup->insert(a_stopPlay); + playersGroup->insert(a_playNext); + //playersGroup->insert(a_ShowFull); +} + +void PMainWindow::setupToolBar() +{ + setToolBarsMovable( false ); + m_toolBar = new QToolBar( this ); + //m_menuBar = new QMenuBar(m_toolBar); + m_menuBar=menuBar(); + addToolBar(m_toolBar); + m_toolBar->setHorizontalStretchable( true ); + a_appendFiles->addTo(m_toolBar); + a_removeFiles->addTo(m_toolBar); + a_showPlaylist->addTo(m_toolBar); + a_ShowFull->addTo(m_toolBar); + playersGroup->addTo(m_toolBar); +} + +void PMainWindow::setupVideo(bool full) +{ + if (full) { + m_VideoPlayer->setBackgroundColor(black); + m_VideoPlayer->reparent(0, WStyle_Customize | WStyle_NoBorderEx, QPoint(0,0)); + m_VideoPlayer->setGeometry(0,0,qApp->desktop()->size().width(),qApp->desktop()->size().height()); + m_VideoPlayer->showFullScreen(); + } else { + m_VideoPlayer->hide(); + m_stack->addWidget(m_VideoPlayer,stack_video); + m_stack->raiseWidget(stack_video); + } + m_VideoPlayer->fullScreen(full); + m_VideoPlayer->disconnect(this); + connect(m_VideoPlayer,SIGNAL(videoclicked()),this,SLOT(slotVideoclicked())); +} + +void PMainWindow::slotVideoclicked() +{ + odebug << "PMainWindow::slotVideoclicked()" << oendl; + if (a_ShowFull->isOn()) { + a_ShowFull->setOn(false); + slotToggleFull(false); + } +} + +void PMainWindow::slotToggleFull(bool how) +{ + if (m_PlayLib && m_VideoPlayer->isVisible() && m_PlayLib->isShowingVideo()) { + m_PlayLib->pause(true); + setupVideo(how); + m_PlayLib->pause(false); + } +} + +void PMainWindow::setupMenu() +{ + fileMenu = new QPopupMenu( m_menuBar ); + m_menuBar->insertItem( tr( "Playlist" ), fileMenu ); + a_appendFiles->addTo(fileMenu); + a_removeFiles->addTo(fileMenu); + + dispMenu = new QPopupMenu( m_menuBar ); + m_menuBar->insertItem( tr( "Show" ), dispMenu ); + a_showPlaylist->addTo(dispMenu); + a_ShowFull->addTo(dispMenu); + playMenu = new QPopupMenu(m_menuBar); + m_menuBar->insertItem(tr("Playing"),playMenu); + + playersGroup->addTo(playMenu); +} diff --git a/noncore/multimedia/opieplayer3/mwindow.h b/noncore/multimedia/opieplayer3/mwindow.h new file mode 100644 index 0000000..28f820f --- a/dev/null +++ b/noncore/multimedia/opieplayer3/mwindow.h @@ -0,0 +1,120 @@ +/* + This file is part of the Opie Project + + Copyright (c) 2002 Max Reiss + Copyright (c) 2002 L. Potter + Copyright (c) 2002 Holger Freyther + =. + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef _mwindow_h +#define _mwindow_h + +#include + +#include + +#include + +namespace Opie { +namespace Ui { + class OWidgetStack; + class OFileSelector; +} +} + +namespace XINE { + class Lib; +} + +class PlaylistView; +class QToolBar; +class QPopupMenu; +class QMenuBar; +class AudioWidget; +class VideoWidget; +class PlaylistItem; + +class PMainWindow : public QMainWindow { + Q_OBJECT +public: + static QString appName() { return QString::fromLatin1("opie-mediaplayer3" ); } + PMainWindow(QWidget*, const char*, WFlags ); + virtual ~PMainWindow(); + +public slots: + virtual void slotVideoclicked(); +protected: + static const int stack_list = 0; + static const int stack_file = 1; + static const int stack_audio = 2; + static const int stack_video = 3; + Opie::Ui::OWidgetStack *m_stack; + Opie::Ui::OFileSelector*m_sfl; + PlaylistView*m_playList; + AudioWidget*m_AudioPlayer; + VideoWidget*m_VideoPlayer; + + QAction*a_appendFiles,*a_removeFiles,*a_showPlaylist,*a_playAction,*a_deleteItem,*a_stopAction; + QAction*a_playNext,*a_playPrevious,*a_ShowFull,*a_stopPlay; + QActionGroup*playersGroup; + QToolBar*m_toolBar; + QPopupMenu *fileMenu,*dispMenu,*playMenu; + QMenuBar*m_menuBar; + XINE::Lib*m_PlayLib; + + void setupActions(); + void setupToolBar(); + void setupMenu(); + void checkLib(); + void setupVideo(bool full); + void hideVideo(); + + bool m_playing:1; + int m_CurrentPos; + PlaylistItem*m_LastItem; + +protected slots: + virtual void fileSelected(const DocLnk&); + virtual void slotAppendFiles(); + virtual void slotRemoveFiles(); + virtual void slotShowList(); + virtual void slotPlayList(); + virtual void slotPlayNext(); + virtual void slotPlayPrevious(); + virtual void slotPlayCurrent(); + virtual void slotStopped(); + virtual void slotCheckPos(); + virtual void slotToggleFull(bool); + virtual void slotUserStop(); + virtual void slotGoNext(); + +signals: + void sigPos(int); +}; + +#endif diff --git a/noncore/multimedia/opieplayer3/opieplayer3.pro b/noncore/multimedia/opieplayer3/opieplayer3.pro new file mode 100644 index 0000000..1c7149f --- a/dev/null +++ b/noncore/multimedia/opieplayer3/opieplayer3.pro @@ -0,0 +1,26 @@ +CONFIG = qt warn_on quick-app +HEADERS = mwindow.h playlist.h ../opieplayer2/lib.h ../opieplayer2/threadutil.h \ + ../opieplayer2/alphablend.h ../opieplayer2/yuv2rgb.h \ + audiowidget.h ../opieplayer2/xinevideowidget.h \ + videowidget.h +SOURCES = mwindow.cpp playlist.cpp ../opieplayer2/lib.cpp ../opieplayer2/threadutil.cpp \ + ../opieplayer2/nullvideo.c \ + ../opieplayer2/alphablend.c ../opieplayer2/yuv2rgb.c \ + audiowidget.cpp ../opieplayer2/xinevideowidget.cpp \ + videowidget.cpp ../opieplayer2/yuv2rgb_arm2.c ../opieplayer2/yuv2rgb_arm4l.S + +TARGET = opie-mediaplayer3 +INCLUDEPATH += $(OPIEDIR)/include +DEPENDPATH += $(OPIEDIR)/include +LIBS += -lqpe -lpthread -lopiecore2 -lopieui2 -lqtaux2 -lxine +MOC_DIR = qpeobj +OBJECTS_DIR = qpeobj + +include( $(OPIEDIR)/include.pro ) + +!isEmpty( LIBXINE_INC_DIR ) { + INCLUDEPATH = $$LIBXINE_INC_DIR $$INCLUDEPATH +} +!isEmpty( LIBXINE_LIB_DIR ) { + LIBS = -L$$LIBXINE_LIB_DIR $$LIBS +} diff --git a/noncore/multimedia/opieplayer3/playlist.cpp b/noncore/multimedia/opieplayer3/playlist.cpp new file mode 100644 index 0000000..272a71e --- a/dev/null +++ b/noncore/multimedia/opieplayer3/playlist.cpp @@ -0,0 +1,210 @@ +/* + This file is part of the Opie Project + + Copyright (c) 2002 Max Reiss + Copyright (c) 2002 L. Potter + Copyright (c) 2002 Holger Freyther + =. + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#include "playlist.h" +#include "../opieplayer2/lib.h" + +#include +#include + +#include + +#include + +PlaylistItem::PlaylistItem(const DocLnk& aLink,PlaylistView*parent) + :QListViewItem(parent),m_Content(aLink),m_video(false) +{ +} + +PlaylistItem::PlaylistItem(const DocLnk&aLink,PlaylistView*parent,PlaylistItem*after) + :QListViewItem(parent,after),m_Content(aLink),m_video(false) +{ +} + +void PlaylistItem::Video(bool y) +{ + m_video=y; + if (m_video) { + setPixmap(0,Opie::Core::OResource::loadPixmap("opieplayer2/videofile")); + } else { + setPixmap(0,Opie::Core::OResource::loadPixmap("opieplayer2/musicfile")); + } +} + +PlaylistItem::~PlaylistItem() +{ +} + +/* PlaylistView Methods */ +PlaylistView::PlaylistView(QWidget *parent, const char *name) + : QListView(parent,name) +{ +// columnLabels << tr("FullName"); + columnLabels << tr(""); // icon + columnLabels << tr("File"); + columnLabels << tr("Playtime"); + columnLabels << tr("Artist"); + columnLabels << tr("Album"); + columnLabels << tr("Title"); + columnLabels << tr("Type"); + columnLabels << tr("Size"); + for (QStringList::Iterator it = columnLabels.begin(); it != columnLabels.end(); ++it) { + addColumn(*it); + } + m_Infolib=0; + setAllColumnsShowFocus(true); + setSelectionMode(Single); + setSorting(-1); + m_lastItem = 0; +} + +PlaylistView::~PlaylistView() +{ + if (m_Infolib) delete m_Infolib; +} + +void PlaylistView::checkLib() +{ + if (!m_Infolib) { + m_Infolib = new XINE::Lib(XINE::Lib::InitializeImmediately); + m_Infolib->ensureInitialized(); + } +} + +void PlaylistView::slotAddFile(const DocLnk&aLink) +{ + QFileInfo fileInfo(aLink.file()); + if (!fileInfo.exists()) return; + checkLib(); + + m_Infolib->stop(); + + if (m_lastItem) { + m_lastItem = new PlaylistItem(aLink,this,m_lastItem); + } else { + m_lastItem = new PlaylistItem(aLink,this); + } + m_lastItem->setExpandable(false); + m_lastItem->setText(1,aLink.name()); + int i = m_Infolib->setfile(aLink.file()); + odebug << "File set: " << i << oendl; + if (i<1) { + return; + } + + QString codec = m_Infolib->metaInfo(6); + if (codec.isEmpty()) { + codec = m_Infolib->metaInfo(7); + } + // codec + m_lastItem->setText(COL_TYPE,codec); + // title + m_lastItem->setText(COL_TITLE,m_Infolib->metaInfo(0)); + // artist + m_lastItem->setText(COL_ARTIST,m_Infolib->metaInfo(2)); + // album + m_lastItem->setText(COL_ALBUM,m_Infolib->metaInfo(4)); + int l = m_Infolib->length(); + int h = l/3600; + l-=h*3600; + int m = l/60; + l-=m*60; + codec = ""; + if (h>0) { + codec+=QString("%1 h").arg(h); + } + if (m>0) { + if (!codec.isEmpty()) codec+=" "; + codec+=QString("%1 m").arg(m); + } + if (l>0) { + if (!codec.isEmpty()) codec+=" "; + codec+=QString("%1 s").arg(l); + } + // time + m_lastItem->setText(COL_TIME,codec); + m_lastItem->Video(m_Infolib->hasVideo()); + m_items.append(m_lastItem); +} + +void PlaylistView::removeFromList(PlaylistItem*Item) +{ + if (!Item)return; + t_itemlist::Iterator iter; + iter = m_items.find(Item); + if (iter!=m_items.end()) { + m_items.remove(iter); + } + delete Item; +} + +XINE::Lib*PlaylistView::getXine() +{ + checkLib(); + return m_Infolib; +} + +void PlaylistView::setCurrentItem(PlaylistItem*aItem) +{ + setSelected(aItem,true); +} + +PlaylistItem* PlaylistView::currentItem()const +{ + QListViewItem*it = selectedItem(); + if (!it) return 0; + return (PlaylistItem*)it; +} + +PlaylistItem* PlaylistView::nextItem(PlaylistItem*parent)const +{ + if (m_items.count()==0) return 0; + if (!parent) return m_items[0]; + for (unsigned j=0; j0;--j) { + if (m_items[j]==parent) { + return m_items[j-1]; + } + } + return 0; +} diff --git a/noncore/multimedia/opieplayer3/playlist.h b/noncore/multimedia/opieplayer3/playlist.h new file mode 100644 index 0000000..ad4c472 --- a/dev/null +++ b/noncore/multimedia/opieplayer3/playlist.h @@ -0,0 +1,100 @@ +/* + This file is part of the Opie Project + + Copyright (c) 2002 Max Reiss + Copyright (c) 2002 L. Potter + Copyright (c) 2002 Holger Freyther + =. + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#ifndef __playlist_h +#define __playlist_h + +#include + +#include +#include + +namespace XINE { + class Lib; +} + +class PlaylistView; + +class PlaylistItem:public QListViewItem +{ +public: + PlaylistItem(const DocLnk&aLink,PlaylistView*parent); + PlaylistItem(const DocLnk&aLink,PlaylistView*parent,PlaylistItem*after); + virtual ~PlaylistItem(); + + const DocLnk&Lnk()const{return m_Content;} + void Video(bool y); + bool isVideo()const{return m_video;} + +protected: + DocLnk m_Content; + bool m_video:1; +}; + +typedef QValueList t_itemlist; + +class PlaylistView:public QListView +{ + Q_OBJECT +public: + PlaylistView( QWidget *parent = 0, const char *name = 0); + virtual ~PlaylistView(); + XINE::Lib*getXine(); + PlaylistItem* currentItem()const; + void setCurrentItem(PlaylistItem*); + PlaylistItem* nextItem(PlaylistItem*parent)const; + PlaylistItem* prevItem(PlaylistItem*parent)const; + + void removeFromList(PlaylistItem*Item); + + enum itemcolumns{ + COL_ICON=0, + COL_FILE=1, + COL_TIME=2, + COL_ARTIST=3, + COL_ALBUM=4, + COL_TITLE=5, + COL_TYPE=6, + COL_SIZE=7 + }; +public slots: + virtual void slotAddFile(const DocLnk&); + +protected: + void checkLib(); + QStringList columnLabels; + XINE::Lib*m_Infolib; + PlaylistItem*m_lastItem; + t_itemlist m_items; +}; + +#endif diff --git a/noncore/multimedia/opieplayer3/videowidget.cpp b/noncore/multimedia/opieplayer3/videowidget.cpp new file mode 100644 index 0000000..c5c63c7 --- a/dev/null +++ b/noncore/multimedia/opieplayer3/videowidget.cpp @@ -0,0 +1,122 @@ +#include "videowidget.h" +#include "../opieplayer2/lib.h" +#include "../opieplayer2/threadutil.h" +#include "../opieplayer2/xinevideowidget.h" + +#include + +#include + +#include +#include +#include + +VideoWidget::VideoWidget( QWidget * parent, const char * name, WFlags f) + :QWidget(parent,name,f) +{ + m_xineLib = 0; + + m_MainLayout = new QVBoxLayout(this); + m_MainLayout->setAutoAdd(true); + m_Videodisplay = new XineVideoWidget(this,"videodisp"); + m_PosSlider = new QSlider(QSlider::Horizontal,this); + m_PosSlider->setTickInterval(60); + connect(m_PosSlider,SIGNAL(valueChanged(int)),this,SLOT(slotNewPos(int))); + connect(m_PosSlider,SIGNAL(sliderMoved(int)),this,SLOT(slotNewPos(int))); + connect(m_PosSlider,SIGNAL(sliderPressed()),this,SLOT(sliderPressed())); + connect(m_PosSlider,SIGNAL(sliderReleased()),this,SLOT(sliderReleased())); + connect(m_Videodisplay,SIGNAL(videoResized ( const QSize & )),this,SLOT(slot_Videoresized(const QSize&))); + connect(m_Videodisplay,SIGNAL(clicked()),this,SLOT(slotClicked())); + m_pressed = false; + m_uppos=0; +} + +VideoWidget::~VideoWidget() +{ +} + +void VideoWidget::slotClicked() +{ + odebug << "clicked " << oendl; + emit videoclicked(); +} + +void VideoWidget::closeEvent(QCloseEvent*e) +{ +} + +void VideoWidget::slotNewPos(int pos) +{ + if (!m_xineLib) return; + if (m_uppos==pos) return; + m_xineLib->seekTo(pos); +} + +void VideoWidget::sliderPressed() +{ + m_pressed = true; +} + +void VideoWidget::sliderReleased() +{ + m_pressed = false; +} + +void VideoWidget::fullScreen(bool how) +{ + if (how) { + m_PosSlider->hide(); + } else { + m_PosSlider->show(); + } +} + +void VideoWidget::playFile(const DocLnk&aLnk,XINE::Lib*aLib) +{ + m_current = aLnk; + if (m_xineLib != aLib) { + disconnect(m_xineLib); + m_xineLib = aLib; + if (aLib) m_xineLib->setWidget(m_Videodisplay); + } + if (!m_xineLib) { + return; + } + connect(m_xineLib,SIGNAL(stopped()),this,SLOT(slotStopped())); + m_uppos=0; + m_PosSlider->setValue(0); + m_xineLib->setWidget(m_Videodisplay); + m_xineLib->setShowVideo(true); + m_xineLib->resize(m_Videodisplay->size()); + m_xineLib->play(m_current.file()); + int l = m_xineLib->length(); + m_PosSlider->setRange(0,l); + m_PosSlider->setPageStep(l/10); +} + +void VideoWidget::stopPlaying() +{ + if (m_xineLib) { + m_xineLib->stop(); + } +} + +void VideoWidget::slotStopped() +{ +// check fullscreen here! +} + +void VideoWidget::slot_Videoresized(const QSize&s) +{ + odebug << "Videoresized: " << s << oendl; + if (m_xineLib) { + m_xineLib->resize(s); + } +} + +void VideoWidget::updatePos(int val) +{ + if (m_pressed) return; + m_uppos = val; + m_PosSlider->setValue(val); +} diff --git a/noncore/multimedia/opieplayer3/videowidget.h b/noncore/multimedia/opieplayer3/videowidget.h new file mode 100644 index 0000000..f181980 --- a/dev/null +++ b/noncore/multimedia/opieplayer3/videowidget.h @@ -0,0 +1,53 @@ +#ifndef __videowidget_h +#define __videowidget_h +#include + +#include + +namespace XINE { + class Lib; +} + +class QVBoxLayout; +class QSlider; +class QLabel; +class XineVideoWidget; + +class VideoWidget:public QWidget +{ + Q_OBJECT +public: + VideoWidget( QWidget * parent=0, const char * name=0, WFlags f=0 ); + virtual ~VideoWidget(); + + void playFile(const DocLnk&,XINE::Lib*); + void fullScreen(bool how); + +signals: + void videoclicked(); + +public slots: + virtual void stopPlaying(); + virtual void updatePos(int); + +protected: + XINE::Lib*m_xineLib; + DocLnk m_current; + QVBoxLayout*m_MainLayout; + XineVideoWidget*m_Videodisplay; + QWidget * m_holder; + QSlider*m_PosSlider; + bool m_pressed:1; + int m_uppos; + +protected slots: + virtual void closeEvent(QCloseEvent*e); + virtual void slotNewPos(int pos); + virtual void sliderPressed(); + virtual void sliderReleased(); + virtual void slot_Videoresized(const QSize&); + virtual void slotStopped(); + virtual void slotClicked(); +}; + +#endif diff --git a/packages b/packages index 59b0873..fab711b 100644 --- a/packages +++ b/packages @@ -160,6 +160,7 @@ CONFIG_OPIEIRC noncore/net/opieirc opieirc.pro CONFIG_OPIE-LOGIN core/opie-login opie-login.pro CONFIG_OPIEMAIL2 noncore/unsupported/mail2 mail.pro CONFIG_OPIEPLAYER2 noncore/multimedia/opieplayer2 opieplayer2.pro +CONFIG_OPIEPLAYER3 noncore/multimedia/opieplayer3 opieplayer3.pro CONFIG_OPIEPLAYER core/multimedia/opieplayer opieplayer.pro CONFIG_OPIE-RDESKTOP noncore/net/opierdesktop opierdesktop.pro CONFIG_OPIE-READER noncore/apps/opie-reader opie-reader.pro -- cgit v0.9.0.2