[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/multimedia/k3b
From:       Michal Malek <michalm () jabster ! pl>
Date:       2010-07-03 20:31:25
Message-ID: 20100703203125.23944AC8EB () svn ! kde ! org
[Download RAW message or body]

SVN commit 1145694 by mmalek:

Handle cases when new track is removed or added

 M  +1 -1      libk3b/projects/audiocd/k3baudiocdtrackreader.cpp  
 M  +120 -62   libk3b/projects/audiocd/k3baudiodocreader.cpp  
 M  +2 -0      libk3b/projects/audiocd/k3baudiodocreader.h  
 M  +1 -0      libk3b/projects/audiocd/k3baudiofilereader.cpp  
 M  +6 -4      libk3b/projects/audiocd/k3baudiotrackreader.cpp  
 M  +1 -0      libk3b/projects/audiocd/k3baudiozerodatareader.cpp  
 M  +1 -0      libk3b/projects/audiocd/k3brawaudiodatareader.cpp  
 M  +3 -37     src/projects/k3baudiotrackplayer.cpp  
 M  +1 -6      src/projects/k3baudiotrackplayer.h  


--- trunk/extragear/multimedia/k3b/libk3b/projects/audiocd/k3baudiocdtrackreader.cpp \
#1145693:1145694 @@ -131,7 +131,7 @@
 
 AudioCdTrackReader::~AudioCdTrackReader()
 {
-    d->closeParanoia();
+    close();
 }
 
 
--- trunk/extragear/multimedia/k3b/libk3b/projects/audiocd/k3baudiodocreader.cpp \
#1145693:1145694 @@ -18,41 +18,61 @@
 #include "k3baudiotrack.h"
 #include "k3baudiotrackreader.h"
 
-#include <QLinkedList>
+#include <QList>
+#include <QMutex>
+#include <QMutexLocker>
 
 namespace K3b {
 
 namespace {
-    typedef QLinkedList< AudioTrackReader* > AudioTrackReaders;
-    typedef AudioTrackReaders::const_iterator AudioTrackReaderIterator;
+    typedef QList< AudioTrackReader* > AudioTrackReaders;
 }
 
 class AudioDocReader::Private
 {
 public:
-    Private( AudioDoc& d )
+    Private( AudioDocReader& audioDocReader, AudioDoc& d );
+    void setCurrentReader( int position );
+    void updatePos();
+    void slotTrackAdded( int position );
+    void slotTrackAboutToBeRemoved( int position );
+
+    AudioDocReader& q;
+    AudioDoc& doc;
+    qint64 pos;
+    AudioTrackReaders readers;
+    int current;
+
+    // used to make sure that no seek and read operation occur in parallel
+    QMutex mutex;
+};
+
+
+AudioDocReader::Private::Private( AudioDocReader& audioDocReader, AudioDoc& d )
     :
+    q( audioDocReader ),
         doc( d ),
         pos( 0 ),
-        currentReader( readers.end() )
+    current( -1 )
     {
     }
 
-    void updatePos();
 
-    AudioDoc& doc;
-    qint64 pos;
-    AudioTrackReaders readers;
-    AudioTrackReaderIterator currentReader;
-};
+void AudioDocReader::Private::setCurrentReader( int position )
+{
+    if( position >= 0 && position < readers.size() && position != current ) {
+        emit q.currentTrackChanged( readers.at( position )->track() );
+    }
+    current = position;
+}
 
 
 void AudioDocReader::Private::updatePos()
 {
-    if( currentReader != readers.end() ) {
+    if( current >= 0 && current < readers.size() ) {
         qint64 newPos = 0LL;
         Q_FOREACH( AudioTrackReader* reader, readers ) {
-            if( reader != *currentReader )
+            if( reader != readers.at( current ) )
                 newPos += reader->size();
             else
                 break;
@@ -62,24 +82,58 @@
 }
 
 
+void AudioDocReader::Private::slotTrackAdded( int position )
+{
+    QMutexLocker locker( &mutex );
+    if( q.isOpen() && position >= 0 && position <= readers.size() ) { // No mistake \
here, "position" can have size() value +        if( AudioTrack* track = doc.getTrack( \
position + 1 ) ) { +            readers.insert( position, new AudioTrackReader( \
*track ) ); +            readers.at( position )->open( q.openMode() );
+            if( position == current )
+                readers.at( position )->seek( 0 );
+        }
+    }
+}
+
+
+void AudioDocReader::Private::slotTrackAboutToBeRemoved( int position )
+{
+    QMutexLocker locker( &mutex );
+    if( q.isOpen() ) {
+        if( position >= 0 && position < readers.size() ) {
+            readers.removeAt( position );
+            if( position == current ) {
+                if( current < readers.size() - 1 )
+                    setCurrentReader( ++current );
+                else
+                    setCurrentReader( --current );
+            }
+        }
+    }
+}
+
+
 AudioDocReader::AudioDocReader( AudioDoc& doc, QObject* parent )
     : QIODevice( parent ),
-      d( new Private( doc ) )
+      d( new Private( *this, doc ) )
 {
+    connect( &doc, SIGNAL(trackAdded(int)),
+             this, SLOT(slotTrackAdded(int)) );
+    connect( &doc, SIGNAL(trackAboutToBeRemoved(int)),
+             this, SLOT(slotTrackAboutToBeRemoved(int)) );
 }
 
 
 AudioDocReader::~AudioDocReader()
 {
-    qDeleteAll( d->readers.begin(), d->readers.end() );
-    d->readers.clear();
+    close();
 }
 
 
 AudioTrackReader* AudioDocReader::currentTrackReader() const
 {
-    if( d->currentReader != d->readers.end() )
-        return *d->currentReader;
+    if( d->current >=0 && d->current < d->readers.size() )
+        return d->readers.at( d->current );
     else
         return 0;
 }
@@ -89,17 +143,16 @@
 {
     qint64 newPos = 0LL;
 
-    for( AudioTrackReaderIterator reader = d->readers.begin();
-         reader != d->readers.end(); ++reader ) {
-        if( &(*reader)->track() == &track ) {
+    for( int position = 0; position < d->readers.size(); ++position ) {
+        AudioTrackReader* reader = d->readers.at( position );
+        if( &reader->track() == &track ) {
             d->pos = newPos;
-            d->currentReader = reader;
-            emit currentTrackChanged( (*d->currentReader)->track() );
-            (*d->currentReader)->seek( 0 );
+            d->setCurrentReader( position );
+            reader->seek( 0 );
             return true;
         }
         else {
-            newPos += (*reader)->size();
+            newPos += reader->size();
         }
     }
     return false;
@@ -112,14 +165,16 @@
 
         for( AudioTrack* track = d->doc.firstTrack(); track != 0; track = \
track->next() ) {  d->readers.push_back( new AudioTrackReader( *track ) );
-            d->readers.back()->open( mode );
+            if( !d->readers.back()->open( mode ) ) {
+                close();
+                return false;
         }
+        }
 
         d->pos = 0;
-        d->currentReader = d->readers.begin();
-        if( d->currentReader != d->readers.end() ) {
-            emit currentTrackChanged( (*d->currentReader)->track() );
-            (*d->currentReader)->seek( 0 );
+        d->setCurrentReader( 0 );
+        if( d->current >=0 && d->current < d->readers.size() ) {
+            d->readers.at( d->current )->seek( 0 );
         }
 
         return QIODevice::open( mode );
@@ -132,7 +187,7 @@
 
 void AudioDocReader::close()
 {
-    qDeleteAll( d->readers.begin(), d->readers.end() );
+    qDeleteAll( d->readers );
     d->readers.clear();
     QIODevice::close();
 }
@@ -158,18 +213,17 @@
 
 bool AudioDocReader::seek( qint64 pos )
 {
-    AudioTrackReaderIterator reader = d->readers.begin();
+    QMutexLocker locker( &d->mutex );
+    int reader = 0;
     qint64 curPos = 0;
 
-    for( ; reader != d->readers.end() && curPos + (*reader)->size() < pos; ++reader \
                ) {
-        curPos += (*reader)->size();
+    for( ; reader < d->readers.size() && curPos + d->readers.at( reader )->size() < \
pos; ++reader ) { +        curPos += d->readers.at( reader )->size();
     }
 
-    if( reader != d->readers.end() ) {
-        d->currentReader = reader;
-        d->pos = pos;
-        emit currentTrackChanged( (*d->currentReader)->track() );
-        return (*reader)->seek( pos - curPos );
+    if( reader >= 0 && reader < d->readers.size() ) {
+        d->setCurrentReader( reader );
+        return d->readers.at( reader )->seek( pos - curPos );
     }
     else {
         return false;
@@ -179,12 +233,12 @@
 
 void AudioDocReader::nextTrack()
 {
-    if( d->currentReader != d->readers.end() ) {
-        ++d->currentReader;
+    QMutexLocker locker( &d->mutex );
+    if( d->current >= 0 && d->current < d->readers.size() ) {
+        d->setCurrentReader( d->current + 1 );
         d->updatePos();
-        if( d->currentReader != d->readers.end() ) {
-            emit currentTrackChanged( (*d->currentReader)->track() );
-            (*d->currentReader)->seek( 0 );
+        if( d->current >= 0 && d->current < d->readers.size() ) {
+            d->readers.at( d->current )->seek( 0 );
         }
     }
 }
@@ -192,12 +246,12 @@
 
 void AudioDocReader::previousTrack()
 {
-    if( d->currentReader != d->readers.end() ) {
-        --d->currentReader;
+    QMutexLocker locker( &d->mutex );
+    if( d->current >= 0 && d->current < d->readers.size() ) {
+        d->setCurrentReader( d->current - 1 );
         d->updatePos();
-        if( d->currentReader != d->readers.end() ) {
-            emit currentTrackChanged( (*d->currentReader)->track() );
-            (*d->currentReader)->seek( 0 );
+        if( d->current >= 0 && d->current < d->readers.size() ) {
+            d->readers.at( d->current )->seek( 0 );
         }
     }
 }
@@ -211,21 +265,21 @@
 
 qint64 AudioDocReader::readData( char* data, qint64 maxlen )
 {
-    if( d->currentReader == d->readers.end() ) {
-        d->currentReader = d->readers.begin();
-        if( d->currentReader != d->readers.end() ) {
-            emit currentTrackChanged( (*d->currentReader)->track() );
-            (*d->currentReader)->seek( 0 );
-        }
-        d->pos = 0;
-    }
+    QMutexLocker locker( &d->mutex );
+//     if( d->current < 0 || d->current >= d->readers.size() ) {
+//         d->setCurrentReader( 0 );
+//         if( d->current >= 0 && d->current < d->readers.size() ) {
+//             d->readers.at( d->current )->seek( 0 );
+//         }
+//         d->pos = 0;
+//     }
 
-    qint64 readData = (*d->currentReader)->read( data, maxlen );
+    if( d->current >= 0 && d->current < d->readers.size() ) {
+        qint64 readData = d->readers.at( d->current )->read( data, maxlen );
     if( readData < 0 ) {
-        ++d->currentReader;
-        if( d->currentReader != d->readers.end() ) {
-            emit currentTrackChanged( (*d->currentReader)->track() );
-            (*d->currentReader)->seek( 0 );
+            d->setCurrentReader( d->current + 1 );
+            if( d->current >= 0 && d->current < d->readers.size() ) {
+                d->readers.at( d->current )->seek( 0 );
             return read( data, maxlen ); // read from next source
         }
     }
@@ -234,6 +288,10 @@
 
     return readData;
 }
+    else {
+        return -1;
+    }
+}
 
 } // namespace K3b
 
--- trunk/extragear/multimedia/k3b/libk3b/projects/audiocd/k3baudiodocreader.h \
#1145693:1145694 @@ -60,6 +60,8 @@
         class Private;
         QScopedPointer<Private> d;
         Q_DISABLE_COPY(AudioDocReader)
+        Q_PRIVATE_SLOT( d, void slotTrackAdded( int position ) )
+        Q_PRIVATE_SLOT( d, void slotTrackAboutToBeRemoved( int position ) )
     };
 
 } // namespace K3b
--- trunk/extragear/multimedia/k3b/libk3b/projects/audiocd/k3baudiofilereader.cpp \
#1145693:1145694 @@ -44,6 +44,7 @@
 
 AudioFileReader::~AudioFileReader()
 {
+    close();
 }
 
 
--- trunk/extragear/multimedia/k3b/libk3b/projects/audiocd/k3baudiotrackreader.cpp \
#1145693:1145694 @@ -109,8 +109,7 @@
 
 AudioTrackReader::~AudioTrackReader()
 {
-    qDeleteAll( d->readers.begin(), d->readers.end() );
-    d->readers.clear();
+    close();
     d->current = -1;
 }
 
@@ -133,8 +132,11 @@
 
         for( AudioDataSource* source = d->track.firstSource(); source != 0; source = \
source->next() ) {  d->readers.push_back( source->createReader() );
-            d->readers.back()->open( mode );
+            if( !d->readers.back()->open( mode ) ) {
+                d->readers.clear();
+                return false;
         }
+        }
 
         d->pos = 0;
         if( !d->readers.isEmpty() ) {
@@ -152,7 +154,7 @@
 
 void AudioTrackReader::close()
 {
-    qDeleteAll( d->readers.begin(), d->readers.end() );
+    qDeleteAll( d->readers );
     d->readers.clear();
     QIODevice::close();
 }
--- trunk/extragear/multimedia/k3b/libk3b/projects/audiocd/k3baudiozerodatareader.cpp \
#1145693:1145694 @@ -43,6 +43,7 @@
 
 AudioZeroDataReader::~AudioZeroDataReader()
 {
+    close();
 }
 
 
--- trunk/extragear/multimedia/k3b/libk3b/projects/audiocd/k3brawaudiodatareader.cpp \
#1145693:1145694 @@ -44,6 +44,7 @@
 
 RawAudioDataReader::~RawAudioDataReader()
 {
+    close();
 }
 
 
--- trunk/extragear/multimedia/k3b/src/projects/k3baudiotrackplayer.cpp \
#1145693:1145694 @@ -19,6 +19,7 @@
 #include "k3baudiodocreader.h"
 #include "k3baudiotrack.h"
 #include "k3baudiotrackreader.h"
+#include "k3bmsf.h"
 
 #include <KAction>
 #include <KActionCollection>
@@ -166,12 +167,6 @@
         actionCollection->addAction( "player_seek", d->actionSeek );
     }
 
-    connect( d->doc, SIGNAL(changed()),
-             this, SLOT(slotDocChanged()) );
-    connect( d->doc, SIGNAL(trackChanged(K3b::AudioTrack*)),
-             this, SLOT(slotTrackChanged(K3b::AudioTrack*)) );
-    connect( d->doc, SIGNAL(trackAboutToBeRemoved(int)),
-             this, SLOT(slotTrackAboutToBeRemoved(int)) );
     connect( d->audioOutput, SIGNAL(notify()),
              this, SLOT(slotUpdateSlider()) );
     connect( d->audioOutput, SIGNAL(stateChanged(QAudio::State)),
@@ -216,9 +211,10 @@
 {
     if( d->audioOutput->state() == QAudio::StoppedState ||
         d->audioOutput->state() == QAudio::IdleState ) {
-        d->audioDocReader->open();
+        if( d->audioDocReader->open() ) {
         d->audioOutput->start( d->audioDocReader );
     }
+    }
     else if( d->audioOutput->state() == QAudio::SuspendedState ) {
         d->audioOutput->resume();
     }
@@ -257,25 +253,6 @@
 }
 
 
-void AudioTrackPlayer::slotTrackAboutToBeRemoved( int /*position*/ )
-{
-    /*if( m_currentTrack == track ) {
-        stop();
-        m_currentTrack = 0;
-    }*/
-}
-
-
-void AudioTrackPlayer::slotTrackChanged( K3b::AudioTrack* /*track*/ )
-{
-/*
-    if( m_currentTrack == track ) {
-        d->actionSeek->setMaximum( track->length().audioBytes() );
-    }
-*/
-}
-
-
 void AudioTrackPlayer::slotUpdateSlider()
 {
     if( AudioTrackReader* reader = d->audioDocReader->currentTrackReader() )
@@ -283,17 +260,6 @@
 }
 
 
-void AudioTrackPlayer::slotDocChanged()
-{/*
-    // update the controls in case a new track has been added before or after
-    // the current one and it has been the first or last track
-    if( m_currentTrack ) {
-        d->actionNext->setEnabled( m_currentTrack->next() != 0 );
-        d->actionPrevious->setEnabled( m_currentTrack->prev() != 0 );
-    }*/
-}
-
-
 void AudioTrackPlayer::slotCurrentTrackChanged( const K3b::AudioTrack& track )
 {
     d->actionSeek->setCurrentTrack( track );
--- trunk/extragear/multimedia/k3b/src/projects/k3baudiotrackplayer.h \
#1145693:1145694 @@ -18,10 +18,8 @@
 
 #include <QtCore/QObject>
 #include <QtCore/QScopedPointer>
-#include <QtMultimedia/qaudio.h>
+#include <QtMultimedia/QAudio>
 
-#include "k3bmsf.h"
-
 class KActionCollection;
 
 namespace K3b {
@@ -55,10 +53,7 @@
 
     private Q_SLOTS:
         void slotSeek( int );
-        void slotTrackChanged( K3b::AudioTrack* track );
-        void slotTrackAboutToBeRemoved( int position );
         void slotUpdateSlider();
-        void slotDocChanged();
         void slotCurrentTrackChanged( const K3b::AudioTrack& track );
         void slotStateChanged( QAudio::State state );
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic