1 /*
2     SPDX-FileCopyrightText: 2010 Michal Malek <michalm@jabster.pl>
3     SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org>
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "k3baudiocdtracksource.h"
8 #include "k3baudiocdtrackreader.h"
9 #include "k3baudiodoc.h"
10 #include "k3baudiotrack.h"
11 #include "k3bcore.h"
12 #include "k3bdevice.h"
13 #include "k3bdevicemanager.h"
14 #include "k3bdeviceselectiondialog.h"
15 #include "k3bthreadwidget.h"
16 #include "k3btoc.h"
17 #include "k3b_i18n.h"
18 
19 #include <QDebug>
20 
21 
22 class K3b::AudioCdTrackSource::Private
23 {
24 public:
Private(AudioCdTrackSource * source)25     Private( AudioCdTrackSource* source ) : q( source ) {}
26 
27     AudioCdTrackSource* q;
28     unsigned int discId;
29     Msf length;
30     Device::Toc toc;
31     int cdTrackNumber;
32 
33     QString artist;
34     QString title;
35     QString cdArtist;
36     QString cdTitle;
37 
38     // ripping
39     // we only save the device we last saw the CD in
40     Device::Device* lastUsedDevice;
41     Msf position;
42     bool initialized;
43 
44     bool searchForAudioCD( Device::Device* ) const;
45 };
46 
47 
searchForAudioCD(K3b::Device::Device * dev) const48 bool K3b::AudioCdTrackSource::Private::searchForAudioCD( K3b::Device::Device* dev ) const
49 {
50     qDebug() << "(K3b::AudioCdTrackSource::searchForAudioCD(" << dev->description() << ")";
51     K3b::Device::Toc toc = dev->readToc();
52     return ( toc.discId() == discId );
53 }
54 
55 
AudioCdTrackSource(const K3b::Device::Toc & toc,int cdTrackNumber,const QString & artist,const QString & title,const QString & cdartist,const QString & cdtitle,K3b::Device::Device * dev)56 K3b::AudioCdTrackSource::AudioCdTrackSource( const K3b::Device::Toc& toc, int cdTrackNumber,
57                                               const QString& artist, const QString& title,
58                                               const QString& cdartist, const QString& cdtitle,
59                                               K3b::Device::Device* dev )
60     : K3b::AudioDataSource(),
61       d( new Private( this ) )
62 {
63     d->discId = toc.discId();
64     d->length = toc[cdTrackNumber-1].length();
65     d->toc = toc;
66     d->cdTrackNumber = cdTrackNumber;
67     d->artist = artist;
68     d->title = title;
69     d->cdArtist = cdartist;
70     d->cdTitle = cdtitle;
71     d->lastUsedDevice = dev;
72     d->initialized = false;
73 }
74 
75 
AudioCdTrackSource(unsigned int discid,const K3b::Msf & length,int cdTrackNumber,const QString & artist,const QString & title,const QString & cdArtist,const QString & cdTitle)76 K3b::AudioCdTrackSource::AudioCdTrackSource( unsigned int discid, const K3b::Msf& length, int cdTrackNumber,
77                                               const QString& artist, const QString& title,
78                                               const QString& cdArtist, const QString& cdTitle )
79     : K3b::AudioDataSource(),
80       d( new Private( this ) )
81 {
82     d->discId = discid;
83     d->length = length;
84     d->cdTrackNumber = cdTrackNumber;
85     d->artist = artist;
86     d->title = title;
87     d->cdArtist = cdArtist;
88     d->cdTitle = cdTitle;
89     d->lastUsedDevice = 0;
90     d->initialized = false;
91 }
92 
93 
AudioCdTrackSource(const K3b::AudioCdTrackSource & source)94 K3b::AudioCdTrackSource::AudioCdTrackSource( const K3b::AudioCdTrackSource& source )
95     : K3b::AudioDataSource( source ),
96       d( new Private( this ) )
97 {
98     d->discId = source.d->discId;
99     d->toc = source.d->toc;
100     d->cdTrackNumber = source.d->cdTrackNumber;
101     d->artist = source.d->artist;
102     d->title = source.d->title;
103     d->cdArtist = source.d->cdArtist;
104     d->cdTitle = source.d->cdTitle;
105     d->lastUsedDevice = source.d->lastUsedDevice;
106     d->initialized = false;
107 }
108 
109 
~AudioCdTrackSource()110 K3b::AudioCdTrackSource::~AudioCdTrackSource()
111 {
112 }
113 
114 
discId() const115 unsigned int K3b::AudioCdTrackSource::discId() const
116 {
117     return d->discId;
118 }
119 
120 
cdTrackNumber() const121 int K3b::AudioCdTrackSource::cdTrackNumber() const
122 {
123     return d->cdTrackNumber;
124 }
125 
126 
artist() const127 QString K3b::AudioCdTrackSource::artist() const
128 {
129     return d->artist;
130 }
131 
132 
title() const133 QString K3b::AudioCdTrackSource::title() const
134 {
135     return d->title;
136 }
137 
138 
cdArtist() const139 QString K3b::AudioCdTrackSource::cdArtist() const
140 {
141     return d->cdArtist;
142 }
143 
144 
cdTitle() const145 QString K3b::AudioCdTrackSource::cdTitle() const
146 {
147     return d->cdTitle;
148 }
149 
150 
searchForAudioCD() const151 K3b::Device::Device* K3b::AudioCdTrackSource::searchForAudioCD() const
152 {
153     qDebug() << "(K3b::AudioCdTrackSource::searchForAudioCD()";
154     // first try the saved device
155     if( d->lastUsedDevice && d->searchForAudioCD( d->lastUsedDevice ) )
156         return d->lastUsedDevice;
157 
158     QList<K3b::Device::Device*> devices = k3bcore->deviceManager()->readingDevices();
159     Q_FOREACH( K3b::Device::Device* dev, devices ) {
160         if( d->searchForAudioCD( dev ) ) {
161             return dev;
162         }
163     }
164 
165     qDebug() << "(K3b::AudioCdTrackSource::searchForAudioCD) failed.";
166 
167     return 0;
168 }
169 
170 
setDevice(K3b::Device::Device * dev)171 void K3b::AudioCdTrackSource::setDevice( K3b::Device::Device* dev )
172 {
173     if( dev && dev != d->lastUsedDevice ) {
174         d->lastUsedDevice = dev;
175         if( d->initialized ) {
176         }
177     }
178 }
179 
180 
toc() const181 const K3b::Device::Toc& K3b::AudioCdTrackSource::toc() const
182 {
183     return d->toc;
184 }
185 
186 
setToc(const Device::Toc & toc)187 void K3b::AudioCdTrackSource::setToc( const Device::Toc& toc )
188 {
189     d->toc = toc;
190 }
191 
192 
originalLength() const193 K3b::Msf K3b::AudioCdTrackSource::originalLength() const
194 {
195     return d->length;
196 }
197 
198 
type() const199 QString K3b::AudioCdTrackSource::type() const
200 {
201     return i18n("CD Track");
202 }
203 
204 
sourceComment() const205 QString K3b::AudioCdTrackSource::sourceComment() const
206 {
207     return ki18n("Track %1 from Audio CD %2").subs(d->cdTrackNumber).subs(d->discId,0,16).toString();
208 }
209 
210 
copy() const211 K3b::AudioDataSource* K3b::AudioCdTrackSource::copy() const
212 {
213     return new K3b::AudioCdTrackSource( *this );
214 }
215 
216 
createReader(QObject * parent)217 QIODevice* K3b::AudioCdTrackSource::createReader( QObject* parent )
218 {
219     return new AudioCdTrackReader( *this, parent );
220 }
221