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