• 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
wmlib_interface.cpp
Go to the documentation of this file.
1 /*
2  * KCompactDisc - A CD drive interface for the KDE Project.
3  *
4  * Copyright (C) 2007 Alexander Kern <alex.kern@gmx.de>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * This program 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
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  */
20 
21 #include "wmlib_interface.h"
22 
23 #include <kdebug.h>
24 #include <klocale.h>
25 
26 extern "C"
27 {
28  // We don't have libWorkMan installed already, so get everything
29  // from within our own directory
30  #include "wmlib/include/wm_cdrom.h"
31  #include "wmlib/include/wm_cdtext.h"
32  #include "wmlib/include/wm_helpers.h"
33 }
34 
35 #define TRACK_VALID(track) ((track) && (track <= m_tracks))
36 
37 KWMLibCompactDiscPrivate::KWMLibCompactDiscPrivate(KCompactDisc *p,
38  const QString &dev, const QString &audioSystem, const QString &audioDevice) :
39  KCompactDiscPrivate(p, dev),
40  m_handle(NULL),
41  m_audioSystem(audioSystem),
42  m_audioDevice(audioDevice)
43 {
44  m_interface = m_audioSystem;
45 }
46 
47 KWMLibCompactDiscPrivate::~KWMLibCompactDiscPrivate()
48 {
49  if (m_handle) {
50  wm_cd_destroy(m_handle);
51  }
52 }
53 
54 bool KWMLibCompactDiscPrivate::createInterface()
55 {
56  QString devicePath;
57 
58  devicePath = KCompactDisc::cdromDeviceUrl(m_deviceName).path();
59 
60  // Debug.
61  //wm_cd_set_verbosity(WM_MSG_LEVEL_DEBUG | WM_MSG_CLASS_ALL);
62 
63  int status = wm_cd_init(
64  devicePath.toAscii().data(),
65  m_audioSystem.toAscii().data(),
66  m_audioDevice.toAscii().data(),
67  NULL,
68  &m_handle);
69 
70  if(!WM_CDS_ERROR(status)) {
71  m_deviceVendor = QLatin1String(wm_drive_vendor(m_handle));
72  m_deviceModel = QLatin1String(wm_drive_model(m_handle));
73  m_deviceRevision = QLatin1String(wm_drive_revision(m_handle));
74 
75  Q_Q(KCompactDisc);
76  emit q->discChanged(0);
77 
78  if (m_infoMode == KCompactDisc::Asynchronous) {
79  timerExpired();
80  } else {
81  QTimer::singleShot(1000, this, SLOT(timerExpired()));
82  }
83 
84  return true;
85  }
86  m_handle = NULL;
87  return false;
88 }
89 
90 unsigned KWMLibCompactDiscPrivate::trackLength(unsigned track)
91 {
92  return (unsigned)wm_cd_gettracklen(m_handle, track);
93 }
94 
95 bool KWMLibCompactDiscPrivate::isTrackAudio(unsigned track)
96 {
97  return !wm_cd_gettrackdata(m_handle, track);
98 }
99 
100 void KWMLibCompactDiscPrivate::playTrackPosition(unsigned track, unsigned position)
101 {
102  unsigned firstTrack, lastTrack;
103 
104  firstTrack = TRACK_VALID(track) ? track : 1;
105  lastTrack = firstTrack + 1;
106  lastTrack = TRACK_VALID(lastTrack) ? lastTrack : WM_ENDTRACK;
107 
108  kDebug() << "play track " << firstTrack << " position "
109  << position << endl;
110 
111  wm_cd_play(m_handle, firstTrack, position, lastTrack);
112 }
113 
114 void KWMLibCompactDiscPrivate::pause()
115 {
116  wm_cd_pause(m_handle);
117 }
118 
119 void KWMLibCompactDiscPrivate::stop()
120 {
121  wm_cd_stop(m_handle);
122 }
123 
124 void KWMLibCompactDiscPrivate::eject()
125 {
126  wm_cd_eject(m_handle);
127 }
128 
129 void KWMLibCompactDiscPrivate::closetray()
130 {
131  wm_cd_closetray(m_handle);
132 }
133 
134 /* WM_VOLUME_MUTE ... WM_VOLUME_MAXIMAL */
135 /* WM_BALANCE_ALL_LEFTS .WM_BALANCE_SYMMETRED. WM_BALANCE_ALL_RIGHTS */
136 #define RANGE2PERCENT(x, min, max) (((x) - (min)) * 100)/ ((max) - (min))
137 #define PERCENT2RANGE(x, min, max) ((((x) * ((max) - (min))) / 100 ) + (min))
138 void KWMLibCompactDiscPrivate::setVolume(unsigned volume)
139 {
140  int vol, bal;
141  vol = PERCENT2RANGE(volume, WM_VOLUME_MUTE, WM_VOLUME_MAXIMAL);
142  bal = wm_cd_getbalance(m_handle);
143  wm_cd_volume(m_handle, vol, bal);
144 }
145 
146 void KWMLibCompactDiscPrivate::setBalance(unsigned balance)
147 {
148  int vol, bal;
149  vol = wm_cd_getvolume(m_handle);
150  bal = PERCENT2RANGE(balance, WM_BALANCE_ALL_LEFTS, WM_BALANCE_ALL_RIGHTS);
151  wm_cd_volume(m_handle, vol, bal);
152 }
153 
154 unsigned KWMLibCompactDiscPrivate::volume()
155 {
156  int vol = wm_cd_getvolume(m_handle);
157  unsigned volume = RANGE2PERCENT(vol, WM_VOLUME_MUTE, WM_VOLUME_MAXIMAL);
158  return volume;
159 }
160 
161 unsigned KWMLibCompactDiscPrivate::balance()
162 {
163  int bal = wm_cd_getbalance(m_handle);
164  unsigned balance = RANGE2PERCENT(bal, WM_BALANCE_ALL_LEFTS, WM_BALANCE_ALL_RIGHTS);
165 
166  return balance;
167 }
168 
169 void KWMLibCompactDiscPrivate::queryMetadata()
170 {
171  cdtext();
172  //cddb();
173 }
174 
175 KCompactDisc::DiscStatus KWMLibCompactDiscPrivate::discStatusTranslate(int status)
176 {
177  switch (status) {
178  case WM_CDM_TRACK_DONE:
179  case WM_CDM_PLAYING:
180  case WM_CDM_FORWARD:
181  return KCompactDisc::Playing;
182  case WM_CDM_PAUSED:
183  return KCompactDisc::Paused;
184  case WM_CDM_STOPPED:
185  return KCompactDisc::Stopped;
186  case WM_CDM_EJECTED:
187  return KCompactDisc::Ejected;
188  case WM_CDM_NO_DISC:
189  case WM_CDM_UNKNOWN:
190  return KCompactDisc::NoDisc;
191  case WM_CDM_CDDAERROR:
192  case WM_CDM_LOADING:
193  case WM_CDM_BUFFERING:
194  return KCompactDisc::NotReady;
195  default:
196  return KCompactDisc::Error;
197  }
198 }
199 
200 void KWMLibCompactDiscPrivate::timerExpired()
201 {
202  KCompactDisc::DiscStatus status;
203  unsigned track, i;
204  Q_Q(KCompactDisc);
205 
206  status = discStatusTranslate(wm_cd_status(m_handle));
207 
208  if(m_status != status) {
209  if(skipStatusChange(status))
210  goto timerExpiredExit;
211 
212  m_status = status;
213 
214  switch(m_status) {
215  case KCompactDisc::Ejected:
216  case KCompactDisc::NoDisc:
217  clearDiscInfo();
218  break;
219  default:
220  if(m_tracks == 0) {
221  m_tracks = wm_cd_getcountoftracks(m_handle);
222  if(m_tracks > 0) {
223  kDebug() << "New disc with " << m_tracks << " tracks";
224  m_discId = wm_cddb_discid(m_handle);
225 
226  for(i = 1; i <= m_tracks; i++) {
227  m_trackStartFrames.append(wm_cd_gettrackstart(m_handle, i));
228  }
229  m_trackStartFrames.append(wm_cd_gettrackstart(m_handle, i));
230 
231  m_discLength = FRAMES2SEC(m_trackStartFrames[m_tracks] -
232  m_trackStartFrames[0]);
233 
234  make_playlist();
235 
236  m_trackArtists.append(i18n("Unknown Artist"));
237  m_trackTitles.append(i18n("Unknown Title"));
238  for(i = 1; i <= m_tracks; i++) {
239  m_trackArtists.append(i18n("Unknown Artist"));
240  m_trackTitles.append(ki18n("Track %1").subs(i, 2).toString());
241  }
242 
243 kDebug() << "m_tracks " << m_tracks;
244 kDebug() << "m_trackStartFrames " << m_trackStartFrames;
245 kDebug() << "m_trackArtists " << m_trackArtists;
246 kDebug() << "m_trackTitles " << m_trackTitles;
247 
248  emit q->discChanged(m_tracks);
249 
250  if(m_autoMetadata)
251  queryMetadata();
252  }
253  }
254  break;
255  }
256  }
257 
258  switch(m_status) {
259  case KCompactDisc::Playing:
260  m_trackPosition = wm_get_cur_pos_rel(m_handle);
261  m_discPosition = wm_get_cur_pos_abs(m_handle) - FRAMES2SEC(m_trackStartFrames[0]);
262  // Update the current playing position.
263  if(m_seek) {
264  kDebug() << "seek: " << m_seek << " trackPosition " << m_trackPosition;
265  if(abs((long)(m_trackExpectedPosition - m_trackPosition)) > m_seek)
266  m_seek = 0;
267  else
268  m_seek = abs((long)(m_trackExpectedPosition - m_trackPosition));
269  }
270 
271  if(!m_seek) {
272  emit q->playoutPositionChanged(m_trackPosition);
273  //emit q->playoutDiscPositionChanged(m_discPosition);
274  }
275 
276  // Per-event processing.
277  track = wm_cd_getcurtrack(m_handle);
278 
279  if(m_track != track) {
280  m_track = track;
281  emit q->playoutTrackChanged(m_track);
282  }
283  break;
284 
285  case KCompactDisc::Stopped:
286  m_seek = 0;
287  m_track = 0;
288  break;
289 
290  default:
291  break;
292  }
293 
294 timerExpiredExit:
295  // Now that we have incurred any delays caused by the signals, we'll start the timer.
296  QTimer::singleShot(1000, this, SLOT(timerExpired()));
297 }
298 
299 void KWMLibCompactDiscPrivate::cdtext()
300 {
301  struct cdtext_info *info;
302  unsigned i;
303  Q_Q(KCompactDisc);
304 
305  info = wm_cd_get_cdtext(m_handle);
306 
307  if(!info || !info->valid || (unsigned)info->count_of_entries != (m_tracks + 1)) {
308  kDebug() << "no or invalid CDTEXT";
309  return;
310  }
311 
312  m_trackArtists[0] = QLatin1String( reinterpret_cast<char*>(info->blocks[0]->performer[0]) );
313  m_trackTitles[0] = QLatin1String( reinterpret_cast<char*>(info->blocks[0]->name[0]) );
314 
315  for(i = 1; i <= m_tracks; i++) {
316  m_trackArtists[i] = QLatin1String( reinterpret_cast<char*>(info->blocks[0]->performer[i]) );
317  m_trackTitles[i] =QLatin1String( reinterpret_cast<char*>(info->blocks[0]->name[i]) );
318  }
319 
320  kDebug() << "CDTEXT";
321  kDebug() << "m_trackArtists " << m_trackArtists;
322  kDebug() << "m_trackTitles " << m_trackTitles;
323 
324  emit q->discInformation(KCompactDisc::Cdtext);
325 }
326 
327 #include "wmlib_interface.moc"
KCompactDiscPrivate::m_tracks
unsigned m_tracks
Definition: kcompactdisc_p.h:51
KWMLibCompactDiscPrivate::playTrackPosition
virtual void playTrackPosition(unsigned, unsigned)
Definition: wmlib_interface.cpp:100
KCompactDiscPrivate
Definition: kcompactdisc_p.h:31
KWMLibCompactDiscPrivate::balance
virtual unsigned balance()
Definition: wmlib_interface.cpp:161
RANGE2PERCENT
#define RANGE2PERCENT(x, min, max)
Definition: wmlib_interface.cpp:136
PERCENT2RANGE
#define PERCENT2RANGE(x, min, max)
Definition: wmlib_interface.cpp:137
KCompactDiscPrivate::m_status
KCompactDisc::DiscStatus m_status
Definition: kcompactdisc_p.h:46
KWMLibCompactDiscPrivate::setVolume
virtual void setVolume(unsigned)
Definition: wmlib_interface.cpp:138
KWMLibCompactDiscPrivate::pause
virtual void pause()
Definition: wmlib_interface.cpp:114
KCompactDiscPrivate::m_interface
QString m_interface
Definition: kcompactdisc_p.h:42
KCompactDisc::Cdtext
Definition: kcompactdisc.h:168
KWMLibCompactDiscPrivate::isTrackAudio
virtual bool isTrackAudio(unsigned)
Definition: wmlib_interface.cpp:95
KCompactDisc::Playing
Definition: kcompactdisc.h:157
KCompactDiscPrivate::m_seek
int m_seek
Definition: kcompactdisc_p.h:55
FRAMES2SEC
#define FRAMES2SEC(frames)
Definition: kcompactdisc_p.h:101
KCompactDiscPrivate::m_discLength
unsigned m_discLength
Definition: kcompactdisc_p.h:49
KCompactDisc::DiscStatus
DiscStatus
Definition: kcompactdisc.h:155
KWMLibCompactDiscPrivate::stop
virtual void stop()
Definition: wmlib_interface.cpp:119
KCompactDiscPrivate::m_trackPosition
unsigned m_trackPosition
Definition: kcompactdisc_p.h:52
KCompactDisc::Ejected
Definition: kcompactdisc.h:160
QList::append
void append(const T &value)
KCompactDiscPrivate::m_deviceModel
QString m_deviceModel
Definition: kcompactdisc_p.h:91
KWMLibCompactDiscPrivate::KWMLibCompactDiscPrivate
KWMLibCompactDiscPrivate(KCompactDisc *, const QString &, const QString &, const QString &)
Definition: wmlib_interface.cpp:37
KCompactDisc::Error
Definition: kcompactdisc.h:163
KWMLibCompactDiscPrivate::closetray
virtual void closetray()
Definition: wmlib_interface.cpp:129
KCompactDiscPrivate::m_discId
unsigned m_discId
Definition: kcompactdisc_p.h:48
QString
KWMLibCompactDiscPrivate::queryMetadata
virtual void queryMetadata()
Definition: wmlib_interface.cpp:169
KCompactDiscPrivate::m_deviceRevision
QString m_deviceRevision
Definition: kcompactdisc_p.h:92
KCompactDiscPrivate::m_trackExpectedPosition
unsigned m_trackExpectedPosition
Definition: kcompactdisc_p.h:54
KCompactDisc::Stopped
Definition: kcompactdisc.h:159
KCompactDisc
KCompactDisc - A CD drive interface for the KDE Project.
Definition: kcompactdisc.h:102
KCompactDisc::NotReady
Definition: kcompactdisc.h:162
KCompactDiscPrivate::m_trackArtists
QStringList m_trackArtists
Definition: kcompactdisc_p.h:58
KCompactDiscPrivate::m_deviceName
QString m_deviceName
Definition: kcompactdisc_p.h:44
KWMLibCompactDiscPrivate::volume
virtual unsigned volume()
Definition: wmlib_interface.cpp:154
KCompactDiscPrivate::skipStatusChange
bool skipStatusChange(KCompactDisc::DiscStatus)
KCompactDiscPrivate::m_trackTitles
QStringList m_trackTitles
Definition: kcompactdisc_p.h:59
KCompactDisc::Asynchronous
Definition: kcompactdisc.h:140
wmlib_interface.h
KCompactDiscPrivate::clearDiscInfo
void clearDiscInfo()
QTest::toString
char * toString(const T &value)
QLatin1String
KWMLibCompactDiscPrivate::trackLength
virtual unsigned trackLength(unsigned)
Definition: wmlib_interface.cpp:90
KCompactDisc::Paused
Definition: kcompactdisc.h:158
QByteArray::data
char * data()
KWMLibCompactDiscPrivate::eject
virtual void eject()
Definition: wmlib_interface.cpp:124
TRACK_VALID
#define TRACK_VALID(track)
Definition: wmlib_interface.cpp:35
KWMLibCompactDiscPrivate::createInterface
virtual bool createInterface()
Definition: wmlib_interface.cpp:54
KWMLibCompactDiscPrivate::~KWMLibCompactDiscPrivate
virtual ~KWMLibCompactDiscPrivate()
Definition: wmlib_interface.cpp:47
KCompactDisc::NoDisc
Definition: kcompactdisc.h:161
KCompactDiscPrivate::m_deviceVendor
QString m_deviceVendor
Definition: kcompactdisc_p.h:90
KCompactDiscPrivate::m_track
unsigned m_track
Definition: kcompactdisc_p.h:50
KCompactDiscPrivate::m_infoMode
KCompactDisc::InformationMode m_infoMode
Definition: kcompactdisc_p.h:43
KWMLibCompactDiscPrivate::setBalance
virtual void setBalance(unsigned)
Definition: wmlib_interface.cpp:146
QString::toAscii
QByteArray toAscii() const
KCompactDisc::cdromDeviceUrl
static const KUrl cdromDeviceUrl(const QString &)
The Url of named CDROM device for this system.
Definition: kcompactdisc.cpp:162
KCompactDiscPrivate::m_trackStartFrames
QList< unsigned > m_trackStartFrames
Definition: kcompactdisc_p.h:57
KCompactDiscPrivate::m_autoMetadata
bool m_autoMetadata
Definition: kcompactdisc_p.h:65
QTimer::singleShot
singleShot
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