[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdemultimedia/dragonplayer/src/app
From: Ian Monroe <ian.monroe () gmail ! com>
Date: 2010-07-29 18:52:11
Message-ID: 20100729185211.188A3AC7A9 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1156812 by ianmonroe:
* Add an analyzer to the audio view mode
* Audio mode now uses QGV, and displays more info
* Show an album cover from Amarok if available
* Fix a bug with persistant 'busy cursor' when playing music
* Fixed another bug, it wouldn't show the audio view mode the first time
you played some music.
M +6 -1 CMakeLists.txt
A analyzer (directory)
A analyzer/analyzerBase.cpp [License: UNKNOWN]
A analyzer/analyzerBase.h [License: UNKNOWN]
A analyzer/blockAnalyzer.cpp [License: GPL (v2+)]
A analyzer/blockAnalyzer.h [License: GPL (v2+)]
A analyzer/fht.cpp [License: GPL (v2+)]
A analyzer/fht.h [License: Public Domain GPL (v2+)]
M +122 -17 audioView.cpp
M +20 -6 audioView.h
M +21 -11 mainWindow.cpp
M +2 -0 playlistFile.cpp
A textItem.cpp [License: GPL (v2/3)]
A textItem.h [License: GPL (v2/3)]
M +9 -0 theStream.cpp
M +4 -0 theStream.h
M +19 -0 videoWindow.cpp
M +5 -3 videoWindow.h
--- trunk/KDE/kdemultimedia/dragonplayer/src/app/CMakeLists.txt #1156811:1156812
@@ -9,7 +9,11 @@
set(videoplayer_app_SRCS
${videoplayer_common_SRCS}
+ analyzer/analyzerBase.cpp
+ analyzer/blockAnalyzer.cpp
+ analyzer/fht.cpp
stateChange.cpp
+ textItem.cpp
playDialog.cpp
discSelectionDialog.cpp
adjustSizeButton.cpp
@@ -39,7 +43,8 @@
${KDE4_KIO_LIBS}
${KDE4_KDEUI_LIBS}
${KDE4_PHONON_LIBS}
- ${KDE4_SOLID_LIBS})
+ ${KDE4_SOLID_LIBS}
+ ${KDE4_PLASMA_LIBS} )
if(XINE_XCB_FOUND)
target_link_libraries(dragon
--- trunk/KDE/kdemultimedia/dragonplayer/src/app/audioView.cpp #1156811:1156812
@@ -1,6 +1,6 @@
/***********************************************************************
* Copyright 2008 David Edmundson <kde@davidedmundson.co.uk>
- *
+ * Copyright 2010 Ian Monroe <ian@monroe.nu>
* 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
@@ -19,40 +19,145 @@
***********************************************************************/
#include "audioView.h"
+
+#include "analyzer/blockAnalyzer.h"
+#include "textItem.h"
#include "theStream.h"
+#include "videoWindow.h"
+
+#include <QFileInfo>
+#include <QGraphicsItem>
+#include <QGraphicsGridLayout>
+#include <QGraphicsPixmapItem>
+#include <QLabel>
+
+#include <Plasma/Label>
+#include <KMD5>
+#include <KStandardDirs>
+
namespace Dragon
{
AudioView::AudioView( QWidget *parent)
- : QWidget( parent )
+ : QGraphicsView( parent )
+ , m_image(0)
{
- m_message.clear();
- setAutoFillBackground(true);
- QPalette pal;
- pal.setColor( QPalette::Window, Qt::black );
- setPalette( pal );
+/*
+ | 0 | 1 |
+ 0 | Image | Artist |
+ 1 | Image | Album |
+ 2 | Image | # - Track |
+ 3 | Analyzer |
+ */
+ m_widget = new QGraphicsWidget();
+ m_layout = new QGraphicsGridLayout();
+ m_layout->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, \
QSizePolicy::MinimumExpanding)); + QGraphicsScene* scene = new QGraphicsScene();
+
+ #define setup_label(l) \
+ l = new ExpandingTextItem(m_widget); \
+ l->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, \
QSizePolicy::MinimumExpanding)); +
+
+ setup_label(m_artist);
+ m_layout->addItem(m_artist, 0, 1, Qt::AlignVCenter);
+ setup_label(m_album);
+ m_layout->addItem(m_album, 1, 1, Qt::AlignVCenter);
+ setup_label(m_track);
+ m_layout->addItem(m_track, 2, 1, Qt::AlignVCenter);
+
+ m_analyzer = new BlockAnalyzer(0);
+ QGraphicsProxyWidget* analyzerWidget = scene->addWidget(m_analyzer);
+ analyzerWidget->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, \
QSizePolicy::MinimumExpanding)); + analyzerWidget->setMinimumHeight(100.0);
+ analyzerWidget->setMaximumWidth(450.0);
+ analyzerWidget->setMaximumHeight(300.0);
+ m_layout->addItem(analyzerWidget, 3, 0, 1, 2, Qt::AlignCenter);
+ engine()->setupAnalyzer(m_analyzer);
+ m_layout->setRowMinimumHeight(2, 100.0);
+
+ m_widget->setLayout(m_layout);
+ setScene(scene);
+ scene->addItem(m_widget);
+ #undef setup_label
}
-void
-AudioView::updateText()
+AudioView::~AudioView()
+{//scene deleted automatically
+}
+
+void AudioView::resizeEvent(QResizeEvent *event)
{
- m_message = TheStream::prettyTitle();
- repaint();
+ QGraphicsView::resizeEvent(event);
+ QRectF newRect(QPointF(0.0,0.0), event->size());
+ scene()->setSceneRect(newRect);
+ m_widget->resize( event->size());
+ kDebug() << scene()->sceneRect() << m_widget->rect();
}
+#define COVER_WIDTH 100.0
+#define COVER_COLUMN_WIDTH (COVER_WIDTH+3.0)
+
void
-AudioView::paintEvent(QPaintEvent* event)
+AudioView::updateText()
{
- QPainter painter(this);
- painter.setPen(Qt::white);
- painter.drawText(rect(), Qt::AlignCenter, m_message);
+ QString artist = TheStream::metaData( Phonon::ArtistMetaData );
+ kDebug() << "its being set: " << artist << scene()->sceneRect();
+ m_artist->setPlainText(artist);
+ QString album = TheStream::metaData( Phonon::AlbumMetaData );
+ m_album->setPlainText(album);
+ QString trackString;
+ {
+ QString trackName = TheStream::metaData( Phonon::TitleMetaData );
+ QString trackNumber = TheStream::metaData( Phonon::TracknumberMetaData );
+ bool okInt = false;
+ if ( trackNumber.toInt(&okInt) > 0 && okInt)
+ {
+ trackString = QString( trackNumber + QLatin1String(" - ") + trackName \
); }
+ else
+ trackString = trackName;
+ }
+ m_track->setPlainText( trackString );
+ { //somewhat of a longshot: try to find Amarok cover for the music
+ QString imagePath = checkForAmarokImage( artist, album );
+ if(imagePath.isNull())
+ {
+ delete m_image;
+ m_image = 0;
+ m_layout->setColumnFixedWidth(0, 0.0);
+ }
+ else
+ {
+ m_layout->setColumnFixedWidth(0, COVER_COLUMN_WIDTH);
+ if(!m_image)
+ {
+ m_image = new QGraphicsPixmapItem();
+ scene()->addItem( m_image );
+ m_image->setPos( 3.0, 3.0 );
+ }
+ QPixmap cover( imagePath );
+ m_image->setPixmap( cover );
+ qreal width = static_cast<qreal>( cover.width() );
+ qreal scale = COVER_WIDTH / width;
+ m_image->setScale( scale );
+ }
+ }
+}
-
-AudioView::~AudioView()
+QString
+AudioView::checkForAmarokImage(const QString& artist, const QString& album)
{
+ KMD5 context( artist.toLower().toLocal8Bit() + album.toLower().toLocal8Bit() );
+ const QByteArray md5sum = context.hexDigest();
+ QString location = KStandardDirs::locate("data", \
QLatin1String("amarok/albumcovers/large/") + md5sum); + \
if(QFileInfo(location).exists()) + return location;
+ else
+ return QString();
}
+
}
#include "audioView.moc"
--- trunk/KDE/kdemultimedia/dragonplayer/src/app/audioView.h #1156811:1156812
@@ -21,24 +21,38 @@
#define AUDIOVIEW_H
#include <QGraphicsView>
-#include <QGraphicsScene>
-#include <Phonon/MediaObject>
+#include <QPointer>
+class ExpandingTextItem;
+class QGraphicsGridLayout;
+class QGraphicsPixmapItem;
-using Phonon::MediaObject;
+namespace Plasma{
+ class Label;
+}
+class BlockAnalyzer;
namespace Dragon
{
-class AudioView : public QWidget
+class AudioView : public QGraphicsView
{
Q_OBJECT
public:
explicit AudioView(QWidget *parent);
virtual ~AudioView();
- virtual void paintEvent(QPaintEvent* event);
virtual void updateText();
+ protected:
+ void resizeEvent(QResizeEvent *event);
private:
- QString m_message;
+ QString checkForAmarokImage(const QString &, const QString &);
+
+ QPointer<ExpandingTextItem> m_artist;
+ QPointer<ExpandingTextItem> m_album;
+ QPointer<ExpandingTextItem> m_track;
+ QGraphicsPixmapItem* m_image;
+ QPointer<QGraphicsWidget> m_widget;
+ QGraphicsGridLayout* m_layout;
+ BlockAnalyzer* m_analyzer;
};
}
--- trunk/KDE/kdemultimedia/dragonplayer/src/app/mainWindow.cpp #1156811:1156812
@@ -87,7 +87,7 @@
MainWindow::MainWindow()
: KXmlGuiWindow()
, m_mainView( 0 )
- , m_audioView(new AudioView(this) )
+ , m_audioView( 0 )
, m_loadView( new LoadView(this) )
, m_currentWidget( new QWidget(this) )
, m_leftDock( 0 )
@@ -113,6 +113,7 @@
m_positionSlider = videoWindow()->newPositionSlider();
m_mainView->addWidget(m_loadView);
+ m_audioView = new AudioView(this);
m_mainView->addWidget(m_audioView);
m_mainView->addWidget(videoWindow());
m_mainView->setCurrentWidget(m_loadView);
@@ -517,11 +518,6 @@
kDebug() << "Initial offset is "<< offset;
engine()->loadSettings();
updateSliders();
- if( TheStream::hasVideo() )
- m_currentWidget = engine();
- else
- m_currentWidget = m_audioView;
- m_mainView->setCurrentWidget(m_currentWidget);
return engine()->play( offset );
}
@@ -568,8 +564,17 @@
//let xine handle invalid, etc, KUrlS
//TODO it handles non-existing files with bad error message
- return engine()->load( url );
+ bool ret = engine()->load( url );
+ if( ret )
+ {
+ if( TheStream::hasVideo() )
+ m_currentWidget = engine();
+ else
+ m_currentWidget = m_audioView;
+ m_mainView->setCurrentWidget(m_currentWidget);
}
+ return ret;
+}
void
MainWindow::play()
@@ -589,7 +594,7 @@
else
m_currentWidget = m_audioView;
engine()->play();
- m_mainView->setCurrentWidget(engine());
+ m_mainView->setCurrentWidget(m_currentWidget);
break;
default:
break;
@@ -605,7 +610,8 @@
mimeFilter << "video/mp4";
mimeFilter << "application/x-cd-image"; // added for *.iso images
- const KUrl url = KFileDialog::getOpenUrl( \
KUrl("kfiledialog:///dragonplayer"),mimeFilter.join(" "), this, i18n("Select File to \
Play") ); + const KUrl url = KFileDialog::getOpenUrl( \
KUrl("kfiledialog:///dragonplayer"),mimeFilter.join(" ") + \
, this, i18n("Select File to Play") ); if( url.isEmpty() )
{
kDebug() << "URL empty in MainWindow::playDialogResult()";
@@ -644,11 +650,15 @@
}
else //only one optical disc inserted, play whatever it is
{
- kDebug() << "playing disc", engine()->playDisc( playableDiscs.first() );
+ bool status = engine()->playDisc( playableDiscs.first() );
+ kDebug() << "playing disc" << status ;
}
}
else
- engine()->playDvd(); kDebug() << "no disc in drive or Solid isn't working";
+ {
+ engine()->playDvd();
+ kDebug() << "no disc in drive or Solid isn't working";
+ }
}
--- trunk/KDE/kdemultimedia/dragonplayer/src/app/playlistFile.cpp #1156811:1156812
@@ -48,6 +48,7 @@
else {
m_type = Unknown;
m_error = i18n( "The file is not a playlist" );
+ QApplication::restoreOverrideCursor();
return;
}
@@ -55,6 +56,7 @@
path.clear();
if( !KIO::NetAccess::download( url, path, Dragon::mainWindow() ) ) {
m_error = i18n( "Dragon Player could not download the remote playlist: \
%1", url.prettyUrl() ); + QApplication::restoreOverrideCursor();
return;
}
}
--- trunk/KDE/kdemultimedia/dragonplayer/src/app/theStream.cpp #1156811:1156812
@@ -199,6 +199,15 @@
return KGlobal::config()->hasGroup( url().prettyUrl() );
}
+ QString
+ TheStream::metaData(Phonon::MetaData key)
+ {
+ QStringList values = videoWindow()->m_media->metaData(key);
+ kDebug() << values;
+ return (values.isEmpty()) ? QString() : values.join(QString(' '));
+ }
+
+
/*
static inline QString
entryHelper( const QString &plate, const QString &s1, const QString &s2 )
--- trunk/KDE/kdemultimedia/dragonplayer/src/app/theStream.h #1156811:1156812
@@ -26,6 +26,7 @@
#include <KUrl> // larger :( but no macros at least
#include <QSize> // small header
#include <QString> // small header
+#include <Phonon/Global>
/// for purely static classes
#define DRAGONPLAYER_NO_EXPORT( T ) \
@@ -66,6 +67,9 @@
static QString prettyTitle();
static QString fullTitle();
+
+ static QString metaData(Phonon::MetaData key);
+
static bool hasProfile();
static KConfigGroup profile();
--- trunk/KDE/kdemultimedia/dragonplayer/src/app/videoWindow.cpp #1156811:1156812
@@ -49,6 +49,7 @@
#include <KStandardDirs>
#include <Phonon/AudioOutput>
+#include <phonon/audiodataoutput.h>
#include <Phonon/MediaController>
#include <Phonon/MediaObject>
#include <Phonon/MediaSource>
@@ -91,6 +92,7 @@
, m_subLanguages( new QActionGroup( this ) )
, m_audioLanguages( new QActionGroup( this ) )
, m_logo( new QLabel( this ) )
+ , m_aDataOutput(0)
{
m_isPreview = false;
@@ -465,6 +467,23 @@
}
bool
+VideoWindow::setupAnalyzer(QObject* analyzer)
+{
+ if(!m_aDataOutput)
+ {
+ m_aDataOutput = new Phonon::AudioDataOutput(this);
+ }
+
+ bool successful = m_audioPath.reconnect(m_media, m_aDataOutput);
+ m_audioDataPath = Phonon::createPath(m_aDataOutput, m_aOutput);
+ successful &= m_audioDataPath.isValid();
+
+ connect(m_aDataOutput, SIGNAL(dataReady(const \
QMap<Phonon::AudioDataOutput::Channel, QVector<qint16> >&)), + analyzer, \
SLOT(drawFrame(const QMap<Phonon::AudioDataOutput::Channel,QVector<qint16> >&))); + \
return successful; +}
+
+bool
VideoWindow::isDVD() const
{
return m_media->currentSource().discType() == Phonon::Dvd;
--- trunk/KDE/kdemultimedia/dragonplayer/src/app/videoWindow.h #1156811:1156812
@@ -29,7 +29,6 @@
#include <Phonon/Path>
#include <Phonon/MediaSource>
-
#include <Phonon/ObjectDescription>
#include <Solid/Device>
#include <KUrl>
@@ -42,6 +41,7 @@
class AudioOutput;
class MediaObject;
class MediaController;
+ class AudioDataOutput;
}
typedef struct xine_stream_s xine_stream_t;
@@ -75,7 +75,9 @@
Phonon::AudioOutput *m_aOutput;
Phonon::MediaObject *m_media;
Phonon::MediaController *m_controller;
+ Phonon::AudioDataOutput* m_aDataOutput;
Phonon::Path m_audioPath;
+ Phonon::Path m_audioDataPath;
friend class TheStream;
@@ -102,9 +104,9 @@
qint64 length() const;
bool isDVD() const;
+ bool setupAnalyzer(QObject* analzyer); ///return whether setup was \
successful +
///stuff for dbus:
- //{
-
qreal volume() const;
void setVolume( qreal );
QString urlOrDisc() const;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic