File indexing completed on 2024-05-12 04:51:01

0001 /*
0002     SPDX-FileCopyrightText: 2005-2008 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-FileCopyrightText: 2010 Michal Malek <michalm@jabster.pl>
0004     SPDX-FileCopyrightText: 1998-2010 Sebastian Trueg <trueg@k3b.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "k3baudiofilereader.h"
0010 #include "k3baudiofile.h"
0011 #include "k3baudiodecoder.h"
0012 
0013 
0014 namespace K3b {
0015 
0016 class AudioFileReader::Private
0017 {
0018 public:
0019     Private( AudioFile& s )
0020     :
0021         source( s )
0022     {
0023     }
0024 
0025     AudioFile& source;
0026 };
0027 
0028 
0029 AudioFileReader::AudioFileReader( AudioFile& source, QObject* parent )
0030     : QIODevice( parent ),
0031       d( new Private( source ) )
0032 {
0033 }
0034 
0035 
0036 AudioFileReader::~AudioFileReader()
0037 {
0038     close();
0039 }
0040 
0041 
0042 bool AudioFileReader::open( OpenMode mode )
0043 {
0044     if( !mode.testFlag( QIODevice::WriteOnly ) ) {
0045         return QIODevice::open( mode );
0046     }
0047     else {
0048         return false;
0049     }
0050 }
0051 
0052 
0053 void AudioFileReader::close()
0054 {
0055     QIODevice::close();
0056 }
0057 
0058 
0059 bool AudioFileReader::isSequential() const
0060 {
0061     return false;
0062 }
0063 
0064 
0065 qint64 AudioFileReader::size() const
0066 {
0067     return d->source.length().audioBytes();
0068 }
0069 
0070 
0071 bool AudioFileReader::seek( qint64 pos )
0072 {
0073     Msf msf = Msf::fromAudioBytes( pos );
0074     // this is valid once the decoder has been initialized.
0075     if( d->source.startOffset() + msf <= d->source.lastSector() &&
0076         d->source.decoder()->seek( d->source.startOffset() + msf ) ) {
0077         return QIODevice::seek( pos );
0078     }
0079     else {
0080         return false;
0081     }
0082 }
0083 
0084 
0085 qint64 AudioFileReader::writeData( const char* /*data*/, qint64 /*len*/ )
0086 {
0087     return -1;
0088 }
0089 
0090 
0091 qint64 AudioFileReader::readData( char* data, qint64 maxlen )
0092 {
0093     // here we can trust on the decoder to always provide enough data
0094     // see if we decode too much
0095     if( maxlen + pos() > size() )
0096         maxlen = size() - pos();
0097 
0098     qint64 read = d->source.decoder()->decode( data, maxlen );
0099 
0100     if( read > 0 )
0101         return read;
0102     else
0103         return -1;
0104 }
0105 
0106 } // namespace K3b