• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdemultimedia API Reference
  • KDE Home
  • Contact Us
 

libkcompactdisc

  • sources
  • kde-4.14
  • kdemultimedia
  • libkcompactdisc
phonon_interface.cpp
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (C) 2004-2007 Matthias Kretz <kretz@kde.org>
4  * Copyright (C) by Alexander Kern <alex.kern@gmx.de>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the Free
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  *
20  *
21  * CDDA version taken from guitest in phonon test directory
22  */
23 
24 #include "phonon_interface.h"
25 
26 #include <kdebug.h>
27 #include <klocale.h>
28 
29 #include <Phonon/Global>
30 #include <Phonon/MediaObject>
31 #include <Phonon/AudioOutput>
32 #include <Phonon/Path>
33 #include <Phonon/MediaController>
34 
35 #include <solid/device.h>
36 #include <solid/opticaldrive.h>
37 #include <solid/opticaldisc.h>
38 
39 #define WM_MSG_CLASS WM_MSG_CLASS_PLATFORM
40 
41 using namespace Phonon;
42 
43 class ProducerWidget : public QObject
44 {
45  public:
46  ProducerWidget(KPhononCompactDiscPrivate *, const QString &);
47  ~ProducerWidget();
48 
49  public:
50  MediaObject *m_media;
51  AudioOutput *m_output;
52  MediaController *m_mediaController;
53 };
54 
55 ProducerWidget::ProducerWidget(KPhononCompactDiscPrivate *p, const QString &Udi) :
56  m_media(0),
57  m_output(0),
58  m_mediaController(0)
59 {
60  m_media = new MediaObject(this);
61  connect(m_media, SIGNAL(metaDataChanged()), SLOT(updateMetaData()));
62  m_media->setTickInterval(1000);
63 
64  m_output = new AudioOutput(Phonon::MusicCategory, this);
65  Phonon::createPath(m_media, m_output);
66 
67  connect(m_media, SIGNAL(stateChanged(Phonon::State,Phonon::State)),
68  p, SLOT(stateChanged(Phonon::State,Phonon::State)));
69 
70  connect(m_media, SIGNAL(tick(qint64)), p, SLOT(tick(qint64)));
71 
72  MediaSource *m_mediaSource = new MediaSource(Phonon::Cd, Udi);
73  m_media->setCurrentSource(*m_mediaSource);
74 
75  m_mediaController = new MediaController(m_media);
76 }
77 
78 ProducerWidget::~ProducerWidget()
79 {
80  delete(m_mediaController);
81  delete(m_output);
82  delete(m_media);
83 }
84 
85 KPhononCompactDiscPrivate::KPhononCompactDiscPrivate(KCompactDisc *p,
86  const QString &dev) :
87  KCompactDiscPrivate(p, dev),
88  m_producerWidget(NULL),
89  m_udi(KCompactDisc::cdromDeviceUdi(dev))
90 {
91  m_interface = QLatin1String("phonon");
92 }
93 
94 KPhononCompactDiscPrivate::~KPhononCompactDiscPrivate()
95 {
96  delete m_producerWidget;
97  m_producerWidget = NULL;
98 }
99 
100 bool KPhononCompactDiscPrivate::createInterface()
101 {
102  Solid::Device opticalDevice(m_udi);
103  Solid::OpticalDrive *opticalDrive = opticalDevice.as<Solid::OpticalDrive>();
104 
105  if(opticalDrive) {
106  Q_Q(KCompactDisc);
107 
108  m_deviceVendor = opticalDevice.vendor();
109  m_deviceModel = opticalDevice.product();
110 
111  emit q->discChanged(0);
112 
113  producer();
114 
115  return true;
116  }
117 
118  return false;
119 }
120 
121 ProducerWidget *KPhononCompactDiscPrivate::producer()
122 {
123  //try to create
124  if(!m_producerWidget) {
125  Solid::Device opticalDevice(m_udi);
126  Solid::OpticalDrive *opticalDrive = opticalDevice.as<Solid::OpticalDrive>();
127 
128  if(opticalDrive) {
129  Solid::OpticalDisc *opticalDisc = opticalDevice.as<Solid::OpticalDisc>();
130  kDebug() << "opticalDisc " << opticalDisc;
131  //if(opticalDisc && (opticalDisc->availableContent() == Solid::OpticalDisc::Audio)) {
132  m_producerWidget = new ProducerWidget(this, m_udi);
133  //}
134  }
135  }
136 
137  return m_producerWidget;
138 }
139 
140 unsigned KPhononCompactDiscPrivate::trackLength(unsigned track)
141 {
142  if(!producer() || m_producerWidget->m_mediaController->currentTitle() != track)
143  return 0;
144 
145  return MS2SEC(m_producerWidget->m_media->totalTime());
146 }
147 
148 bool KPhononCompactDiscPrivate::isTrackAudio(unsigned)
149 {
150  return true;
151 }
152 
153 void KPhononCompactDiscPrivate::playTrackPosition(unsigned track, unsigned position)
154 {
155  if(!producer())
156  return;
157 
158  kDebug() << "play track " << track << " position " << position;
159 
160  m_producerWidget->m_mediaController->setCurrentTitle(track);
161  m_producerWidget->m_media->seek(SEC2MS(position));
162  emit m_producerWidget->m_media->play();
163 }
164 
165 void KPhononCompactDiscPrivate::pause()
166 {
167  if(!producer())
168  return;
169 
170  emit m_producerWidget->m_media->pause();
171 }
172 
173 void KPhononCompactDiscPrivate::stop()
174 {
175  if(!producer())
176  return;
177 
178  emit m_producerWidget->m_media->stop();
179 }
180 
181 void KPhononCompactDiscPrivate::eject()
182 {
183  Solid::Device opticalDevice(m_udi);
184  Solid::OpticalDrive *opticalDrive = opticalDevice.as<Solid::OpticalDrive>();
185  Solid::OpticalDisc *opticalDisc = opticalDevice.as<Solid::OpticalDisc>();
186 
187  if(!opticalDrive || !opticalDisc)
188  return;
189 
190  opticalDrive->eject();
191 }
192 
193 void KPhononCompactDiscPrivate::closetray()
194 {
195  Solid::Device opticalDevice(m_udi);
196  Solid::OpticalDrive *opticalDrive = opticalDevice.as<Solid::OpticalDrive>();
197  Solid::OpticalDisc *opticalDisc = opticalDevice.as<Solid::OpticalDisc>();
198 
199  if(!opticalDrive || opticalDisc)
200  return;
201 
202  opticalDrive->eject();
203 }
204 
205 void KPhononCompactDiscPrivate::setVolume(unsigned volume)
206 {
207  if(!producer())
208  return;
209 
210  /* 1.0 = 100% */
211  m_producerWidget->m_output->setVolume(volume * 0.01);
212 }
213 
214 void KPhononCompactDiscPrivate::setBalance(unsigned)
215 {
216 }
217 
218 unsigned KPhononCompactDiscPrivate::volume()
219 {
220  if(!producer())
221  return 0;
222 
223  return (unsigned)(m_producerWidget->m_output->volume() * 100.0);
224 }
225 
226 unsigned KPhononCompactDiscPrivate::balance()
227 {
228  return 50;
229 }
230 
231 void KPhononCompactDiscPrivate::queryMetadata()
232 {
233  Q_Q(KCompactDisc);
234 
235  if(!producer())
236  return;
237 
238  QMultiMap<QString, QString> data = m_producerWidget->m_media->metaData();
239  kDebug() << "METADATA";
240  //kDebug() << data;
241 
242  m_trackArtists[0] = data.take(QLatin1String( "ARTIST" ));
243  m_trackTitles[0] = data.take(QLatin1String( "ALBUM" ));
244 
245  m_trackArtists[m_track] = data.take(QLatin1String( "ARTIST" ));
246  m_trackTitles[m_track] = data.take(QLatin1String( "TITLE" ));
247 
248  emit q->discInformation(KCompactDisc::PhononMetadata);
249 }
250 
251 KCompactDisc::DiscStatus KPhononCompactDiscPrivate::discStatusTranslate(Phonon::State state)
252 {
253  switch (state) {
254  case Phonon::PlayingState:
255  return KCompactDisc::Playing;
256  case Phonon::PausedState:
257  return KCompactDisc::Paused;
258  case Phonon::StoppedState:
259  return KCompactDisc::Stopped;
260  case Phonon::ErrorState:
261  return KCompactDisc::NoDisc;
262  case Phonon::LoadingState:
263  case Phonon::BufferingState:
264  return KCompactDisc::NotReady;
265  default:
266  return KCompactDisc::Error;
267  }
268 }
269 
270 void KPhononCompactDiscPrivate::tick(qint64 t)
271 {
272  unsigned track;
273  Q_Q(KCompactDisc);
274 
275  track = m_producerWidget->m_mediaController->currentTitle();
276  if(track != m_track) {
277  m_track = track;
278  m_discLength = trackLength(m_track);
279  emit q->playoutTrackChanged(m_track);
280 
281  /* phonon gives us Metadata only per Track */
282  if(m_autoMetadata)
283  queryMetadata();
284  }
285 
286  m_trackPosition = MS2SEC(t);
287  m_discPosition = m_trackPosition;
288  // Update the current playing position.
289  if(m_seek) {
290  kDebug() << "seek: " << m_seek << " trackPosition " << m_trackPosition;
291  if(abs((long)(m_trackExpectedPosition - m_trackPosition)) > m_seek)
292  m_seek = 0;
293  else
294  m_seek = abs((long)(m_trackExpectedPosition - m_trackPosition));
295  }
296 
297  if(!m_seek) {
298  emit q->playoutPositionChanged(m_trackPosition);
299  }
300 }
301 
302 void KPhononCompactDiscPrivate::stateChanged(Phonon::State newstate, Phonon::State)
303 {
304  KCompactDisc::DiscStatus status;
305  Q_Q(KCompactDisc);
306 
307  status = discStatusTranslate(newstate);
308 
309  if(m_status != status) {
310  if(skipStatusChange(status))
311  return;
312 
313  m_status = status;
314 
315  switch(m_status) {
316  case KCompactDisc::Ejected:
317  case KCompactDisc::NoDisc:
318  clearDiscInfo();
319  break;
320  default:
321  if(m_tracks == 0) {
322  m_tracks = m_producerWidget->m_mediaController->availableTitles();
323  if(m_tracks > 0) {
324  kDebug() << "New disc with " << m_tracks << " tracks";
325 
326  make_playlist();
327 
328  m_trackArtists.append(i18n("Unknown Artist"));
329  m_trackTitles.append(i18n("Unknown Title"));
330  for(unsigned i = 1; i <= m_tracks; i++) {
331  m_trackArtists.append(i18n("Unknown Artist"));
332  m_trackTitles.append(ki18n("Track %1").subs(i, 2).toString());
333  }
334 
335  emit q->discChanged(m_tracks);
336 
337  if(m_autoMetadata)
338  queryMetadata();
339  }
340  }
341 
342  break;
343  }
344  }
345 }
346 
347 #include "phonon_interface.moc"
348 
KCompactDiscPrivate::m_tracks
unsigned m_tracks
Definition: kcompactdisc_p.h:51
KCompactDiscPrivate
Definition: kcompactdisc_p.h:31
KCompactDisc::PhononMetadata
Definition: kcompactdisc.h:170
KPhononCompactDiscPrivate::pause
virtual void pause()
Definition: phonon_interface.cpp:165
KPhononCompactDiscPrivate
Definition: phonon_interface.h:32
KCompactDiscPrivate::m_status
KCompactDisc::DiscStatus m_status
Definition: kcompactdisc_p.h:46
KPhononCompactDiscPrivate::volume
virtual unsigned volume()
Definition: phonon_interface.cpp:218
KCompactDiscPrivate::m_interface
QString m_interface
Definition: kcompactdisc_p.h:42
KPhononCompactDiscPrivate::stateChanged
void stateChanged(Phonon::State, Phonon::State)
Definition: phonon_interface.cpp:302
KCompactDisc::Playing
Definition: kcompactdisc.h:157
KCompactDiscPrivate::m_seek
int m_seek
Definition: kcompactdisc_p.h:55
KCompactDiscPrivate::m_discLength
unsigned m_discLength
Definition: kcompactdisc_p.h:49
KCompactDisc::DiscStatus
DiscStatus
Definition: kcompactdisc.h:155
KPhononCompactDiscPrivate::KPhononCompactDiscPrivate
KPhononCompactDiscPrivate(KCompactDisc *, const QString &)
Definition: phonon_interface.cpp:85
KCompactDiscPrivate::m_trackPosition
unsigned m_trackPosition
Definition: kcompactdisc_p.h:52
KPhononCompactDiscPrivate::playTrackPosition
virtual void playTrackPosition(unsigned, unsigned)
Definition: phonon_interface.cpp:153
KCompactDisc::Ejected
Definition: kcompactdisc.h:160
phonon_interface.h
QList::append
void append(const T &value)
KPhononCompactDiscPrivate::isTrackAudio
virtual bool isTrackAudio(unsigned)
Definition: phonon_interface.cpp:148
KCompactDiscPrivate::m_deviceModel
QString m_deviceModel
Definition: kcompactdisc_p.h:91
QObject
Phonon::MediaObject
KCompactDisc::Error
Definition: kcompactdisc.h:163
KPhononCompactDiscPrivate::setBalance
virtual void setBalance(unsigned)
Definition: phonon_interface.cpp:214
Phonon::MediaSource
KPhononCompactDiscPrivate::~KPhononCompactDiscPrivate
virtual ~KPhononCompactDiscPrivate()
Definition: phonon_interface.cpp:94
QString
KPhononCompactDiscPrivate::createInterface
virtual bool createInterface()
Definition: phonon_interface.cpp:100
KPhononCompactDiscPrivate::stop
virtual void stop()
Definition: phonon_interface.cpp:173
KPhononCompactDiscPrivate::eject
virtual void eject()
Definition: phonon_interface.cpp:181
Phonon::MediaController
KCompactDiscPrivate::m_trackExpectedPosition
unsigned m_trackExpectedPosition
Definition: kcompactdisc_p.h:54
MS2SEC
#define MS2SEC(ms)
Definition: kcompactdisc_p.h:102
KPhononCompactDiscPrivate::tick
void tick(qint64)
Definition: phonon_interface.cpp:270
KCompactDisc::Stopped
Definition: kcompactdisc.h:159
KCompactDisc
KCompactDisc - A CD drive interface for the KDE Project.
Definition: kcompactdisc.h:102
Phonon::createPath
Path createPath(MediaNode *source, MediaNode *sink)
KCompactDisc::NotReady
Definition: kcompactdisc.h:162
KCompactDiscPrivate::m_trackArtists
QStringList m_trackArtists
Definition: kcompactdisc_p.h:58
KPhononCompactDiscPrivate::queryMetadata
virtual void queryMetadata()
Definition: phonon_interface.cpp:231
KCompactDiscPrivate::skipStatusChange
bool skipStatusChange(KCompactDisc::DiscStatus)
KCompactDiscPrivate::m_trackTitles
QStringList m_trackTitles
Definition: kcompactdisc_p.h:59
KCompactDiscPrivate::clearDiscInfo
void clearDiscInfo()
QLatin1String
KPhononCompactDiscPrivate::balance
virtual unsigned balance()
Definition: phonon_interface.cpp:226
KCompactDisc::Paused
Definition: kcompactdisc.h:158
SEC2MS
#define SEC2MS(sec)
Definition: kcompactdisc_p.h:103
KPhononCompactDiscPrivate::setVolume
virtual void setVolume(unsigned)
Definition: phonon_interface.cpp:205
Phonon::AudioOutput
QMultiMap
KPhononCompactDiscPrivate::trackLength
virtual unsigned trackLength(unsigned)
Definition: phonon_interface.cpp:140
KCompactDisc::NoDisc
Definition: kcompactdisc.h:161
KPhononCompactDiscPrivate::closetray
virtual void closetray()
Definition: phonon_interface.cpp:193
KCompactDiscPrivate::m_deviceVendor
QString m_deviceVendor
Definition: kcompactdisc_p.h:90
KCompactDiscPrivate::m_track
unsigned m_track
Definition: kcompactdisc_p.h:50
QMap::take
T take(const Key &key)
KCompactDiscPrivate::m_autoMetadata
bool m_autoMetadata
Definition: kcompactdisc_p.h:65
KCompactDiscPrivate::make_playlist
void make_playlist()
KCompactDiscPrivate::m_discPosition
unsigned m_discPosition
Definition: kcompactdisc_p.h:53
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:28:18 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libkcompactdisc

Skip menu "libkcompactdisc"
  • Main Page
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdemultimedia API Reference

Skip menu "kdemultimedia API Reference"
  • libkcddb
  • libkcompactdisc

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal