File indexing completed on 2024-04-28 04:49:44

0001 /*
0002     SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "k3binffilewriter.h"
0008 
0009 #include "k3bcdtext.h"
0010 #include "k3btrack.h"
0011 #include "k3bmsf.h"
0012 #include "k3bcore.h"
0013 #include "k3bversion.h"
0014 
0015 #include <QDateTime>
0016 #include <QFile>
0017 
0018 
0019 
0020 K3b::InfFileWriter::InfFileWriter()
0021     : m_index0(-1),
0022       m_trackNumber(1),
0023       m_trackStart(0),
0024       m_trackLength(0),
0025       m_preEmphasis(false),
0026       m_copyPermitted(true),
0027       m_bigEndian(false)
0028 {
0029 }
0030 
0031 
0032 bool K3b::InfFileWriter::save( const QString& filename )
0033 {
0034     QFile f( filename );
0035 
0036     if( !f.open( QIODevice::WriteOnly ) ) {
0037         qDebug() << "(K3b::InfFileWriter) could not open file " << f.fileName();
0038         return false;
0039     }
0040 
0041     QTextStream s( &f );
0042 
0043     return save( s );
0044 }
0045 
0046 
0047 bool K3b::InfFileWriter::save( QTextStream& s )
0048 {
0049     // now write the inf data
0050     // ----------------------
0051     // header
0052     s << "# Cdrecord-Inf-File written by K3b " << k3bcore->version()
0053       << ", " << QDateTime::currentDateTime().toString() << Qt::endl
0054       << "#" << Qt::endl;
0055 
0056     s << "ISRC=\t\t" << m_isrc << Qt::endl;
0057     s << "MCN=\t\t" << m_mcn << Qt::endl;
0058 
0059     // CD-Text
0060     s << "Albumperformer=\t" << "'" << m_albumPerformer << "'" << Qt::endl;
0061     s << "Albumtitle=\t" << "'" << m_albumTitle << "'" << Qt::endl;
0062 
0063     s << "Performer=\t" << "'" << m_trackPerformer << "'" << Qt::endl;
0064     s << "Songwriter=\t" << "'" << m_trackSongwriter << "'" << Qt::endl;
0065     s << "Composer=\t" << "'" << m_trackComposer << "'" << Qt::endl;
0066     s << "Arranger=\t" << "'" << m_trackArranger << "'" << Qt::endl;
0067     s << "Message=\t" << "'" << m_trackMessage << "'" << Qt::endl;
0068 
0069     s << "Tracktitle=\t" << "'" << m_trackTitle << "'" << Qt::endl;
0070 
0071     s << "Tracknumber=\t" << m_trackNumber << Qt::endl;
0072 
0073     // track start
0074     s << "Trackstart=\t" << m_trackStart.lba() << Qt::endl;
0075 
0076     // track length
0077     s << "# Tracklength: " << m_trackLength.toString() << Qt::endl;
0078     s << "Tracklength=\t" << m_trackLength.totalFrames() << ", 0" << Qt::endl;
0079 
0080     // pre-emphasis
0081     s << "Pre-emphasis=\t";
0082     if( m_preEmphasis )
0083         s << "yes";
0084     else
0085         s << "no";
0086     s << Qt::endl;
0087 
0088     // channels (always 2)
0089     s << "Channels=\t2" << Qt::endl;
0090 
0091     // copy-permitted
0092     // TODO: not sure about this!
0093     //       there are three options: yes, no, once
0094     //       but using "once" gives the same result as with cdrdao
0095     //       and that's important.
0096     s << "Copy_permitted=\t";
0097     if( m_copyPermitted )
0098         s << "yes";
0099     else
0100         s << "once";
0101     s << Qt::endl;
0102 
0103     // endianess - wav is little -> onthefly: big, with images: little
0104     s << "Endianess=\t";
0105     if( m_bigEndian )
0106         s << "big";
0107     else
0108         s << "little";
0109     s << Qt::endl;
0110 
0111     // write indices
0112     // the current tracks' data contains the pregap of the next track
0113     // if the pregap has length 0 we need no index 0
0114     if( m_indices.isEmpty() )
0115         s << "Index=\t\t0" << Qt::endl;
0116     else {
0117         for( int i = 0; i < m_indices.count(); ++i )
0118             s << "Index=\t\t" << m_indices[i] << Qt::endl;
0119     }
0120 
0121     s << "Index0=\t\t" << m_index0 << Qt::endl;
0122 
0123     return ( s.status() == QTextStream::Ok );
0124 }
0125 
0126 
0127 void K3b::InfFileWriter::setTrack( const K3b::Device::Track& track )
0128 {
0129     m_indices.clear();
0130 
0131     // the first index always has to be a zero (cdrecord manpage)
0132     m_indices.append( 0 );
0133 
0134     QList<K3b::Msf> indexList = track.indices();
0135     for( int i = 0; i < indexList.count(); ++i )
0136         m_indices.append( indexList[i].lba() );
0137 
0138     if( track.index0() > 0 )
0139         m_index0 = track.index0().lba();
0140     else
0141         m_index0 = -1;
0142 
0143     setPreEmphasis( track.preEmphasis() );
0144     setCopyPermitted( track.copyPermitted() );
0145 
0146     setTrackStart( track.firstSector() );
0147     setTrackLength( track.length() );
0148 
0149     setIsrc( track.isrc() );
0150 
0151     setBigEndian( true );
0152 }
0153 
0154 
0155 void K3b::InfFileWriter::addIndex( long i )
0156 {
0157     m_indices.append( i );
0158 }
0159 
0160 
0161 void K3b::InfFileWriter::setTrackCdText( const K3b::Device::TrackCdText& cdtext )
0162 {
0163     setTrackTitle( cdtext.title() );
0164     setTrackPerformer( cdtext.performer() );
0165     setTrackSongwriter( cdtext.songwriter() );
0166     setTrackComposer( cdtext.composer() );
0167     setTrackArranger( cdtext.arranger() );
0168     setTrackMessage( cdtext.message() );
0169 }
0170 
0171 
0172 void K3b::InfFileWriter::setCdText( const K3b::Device::CdText& cdtext )
0173 {
0174     setAlbumTitle( cdtext.title() );
0175     setAlbumPerformer( cdtext.performer() );
0176 }