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