[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