[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