1 |
commit 425d684b7df0e8b50faa0cbe86eecb2d4d5022cd |
2 |
Author: Ralf Engels <ralf-engels@gmx.de> |
3 |
Date: Wed May 18 20:34:42 2011 +0200 |
4 |
|
5 |
Fix some audio cd related issue: not playing, skipping tracks with gstreamer, no length shown |
6 |
|
7 |
Don't start a new track in the EngineController if the new title is the one we just started. (fixes bug 222405) |
8 |
Handle a device specifier (?device=<deviceName>) in EngineController::playUrl, the old code would not play if the deviceName had a slash (/) in it. (fixes bug 261175). |
9 |
Use KIO:NetAccess::stat to compute track lengths, previously shown as 0:00, fixes bug 207806. |
10 |
src/core-impl/meta/cdda/AudioCdTrackProvider_p.cpp (AudioCdTrackProvider::Private::Private,AudioCdTrackProvider::Private::deviceAdded): Fix some typos, that may have caused crashes. |
11 |
|
12 |
Courtesy: Arnold Metselaar |
13 |
|
14 |
diff --git a/src/EngineController.cpp b/src/EngineController.cpp |
15 |
index 2f666fd..a1c4c76 100644 |
16 |
--- a/src/EngineController.cpp |
17 |
+++ b/src/EngineController.cpp |
18 |
@@ -83,6 +83,7 @@ EngineController::EngineController() |
19 |
, m_playWhenFetched( true ) |
20 |
, m_volume( 0 ) |
21 |
, m_currentIsAudioCd( false ) |
22 |
+ , m_currentAudioCdTrack( 0 ) |
23 |
, m_ignoreVolumeChangeAction ( false ) |
24 |
, m_ignoreVolumeChangeObserve ( false ) |
25 |
, m_tickInterval( 0 ) |
26 |
@@ -460,6 +461,15 @@ EngineController::playUrl( const KUrl &url, uint offset ) |
27 |
QString trackNumberString = url.url(); |
28 |
trackNumberString = trackNumberString.remove( "audiocd:/" ); |
29 |
|
30 |
+ const QString devicePrefix( "?device=" ); |
31 |
+ QString device(""); |
32 |
+ if (trackNumberString.contains(devicePrefix)) |
33 |
+ { |
34 |
+ int pos = trackNumberString.indexOf( devicePrefix ); |
35 |
+ device = trackNumberString.mid( pos + devicePrefix.size() ); |
36 |
+ trackNumberString = trackNumberString.left( pos ); |
37 |
+ } |
38 |
+ |
39 |
QStringList parts = trackNumberString.split( '/' ); |
40 |
|
41 |
if ( parts.count() != 2 ) |
42 |
@@ -479,25 +489,27 @@ EngineController::playUrl( const KUrl &url, uint offset ) |
43 |
|
44 |
int trackNumber = parts.at( 1 ).toInt(); |
45 |
|
46 |
- debug() << "3.2.1..."; |
47 |
+ debug() << "Old device: " << m_media.data()->currentSource().deviceName(); |
48 |
|
49 |
Phonon::MediaSource::Type type = m_media.data()->currentSource().type(); |
50 |
- if( type != Phonon::MediaSource::Disc ) |
51 |
+ if( type != Phonon::MediaSource::Disc || m_media.data()->currentSource().deviceName() != device ) |
52 |
{ |
53 |
m_media.data()->clear(); |
54 |
- m_media.data()->setCurrentSource( Phonon::Cd ); |
55 |
+ debug() << "New device: " << device; |
56 |
+ m_media.data()->setCurrentSource( Phonon::MediaSource( Phonon::Cd, device ) ); |
57 |
} |
58 |
|
59 |
- debug() << "boom?"; |
60 |
+ debug() << "Track: " << trackNumber; |
61 |
+ m_currentAudioCdTrack = trackNumber; |
62 |
m_controller.data()->setCurrentTitle( trackNumber ); |
63 |
debug() << "no boom?"; |
64 |
|
65 |
if( type == Phonon::MediaSource::Disc ) |
66 |
{ |
67 |
- // The track has changed but the slot will not be called, |
68 |
- // because it's still the same media source, which means |
69 |
+ // The track has changed but the slot may not be called, |
70 |
+ // because it may be still the same media source, which means |
71 |
// we need to do it explicitly. |
72 |
- slotNewTrackPlaying( Phonon::Cd ); |
73 |
+ slotNewTrackPlaying( m_media.data()->currentSource() ); |
74 |
} |
75 |
|
76 |
//reconnect it |
77 |
@@ -1306,9 +1318,10 @@ EngineController::slotSeekableChanged( bool seekable ) |
78 |
void EngineController::slotTitleChanged( int titleNumber ) |
79 |
{ |
80 |
DEBUG_BLOCK |
81 |
- Q_UNUSED( titleNumber ); |
82 |
- |
83 |
- slotAboutToFinish(); |
84 |
+ if ( titleNumber != m_currentAudioCdTrack ) |
85 |
+ { |
86 |
+ slotAboutToFinish(); |
87 |
+ } |
88 |
} |
89 |
|
90 |
void EngineController::slotVolumeChanged( qreal newVolume ) |
91 |
diff --git a/src/EngineController.h b/src/EngineController.h |
92 |
index 4117a89..7874a79 100644 |
93 |
--- a/src/EngineController.h |
94 |
+++ b/src/EngineController.h |
95 |
@@ -553,6 +553,7 @@ private: |
96 |
bool m_playWhenFetched; |
97 |
int m_volume; |
98 |
bool m_currentIsAudioCd; |
99 |
+ int m_currentAudioCdTrack; |
100 |
|
101 |
QList<QVariantMap> m_metaDataHistory; // against metadata spam |
102 |
|
103 |
diff --git a/src/core-impl/collections/audiocd/AudioCdCollection.cpp b/src/core-impl/collections/audiocd/AudioCdCollection.cpp |
104 |
index 13a04ae..3e73dde 100644 |
105 |
--- a/src/core-impl/collections/audiocd/AudioCdCollection.cpp |
106 |
+++ b/src/core-impl/collections/audiocd/AudioCdCollection.cpp |
107 |
@@ -37,6 +37,7 @@ |
108 |
|
109 |
#include <kio/job.h> |
110 |
#include <kio/netaccess.h> |
111 |
+#include <kio/udsentry.h> |
112 |
|
113 |
#include <solid/device.h> |
114 |
#include <solid/opticaldrive.h> |
115 |
@@ -254,7 +255,7 @@ AudioCdCollection::infoFetchComplete( KJob *job ) |
116 |
|
117 |
debug() << "Track name: " << trackName; |
118 |
|
119 |
- QString padding = i < 10 ? "0" : QString(); |
120 |
+ QString padding = (i + 1) < 10 ? "0" : QString(); |
121 |
|
122 |
QString baseFileName = m_fileNamePattern; |
123 |
debug() << "Track Base File Name (before): " << baseFileName; |
124 |
@@ -277,6 +278,7 @@ AudioCdCollection::infoFetchComplete( KJob *job ) |
125 |
|
126 |
trackPtr->setTrackNumber( i + 1 ); |
127 |
trackPtr->setFileNameBase( baseFileName ); |
128 |
+ trackPtr->setLength( trackLength( i + 1 ) ); |
129 |
|
130 |
memoryCollection()->addTrack( Meta::TrackPtr::staticCast( trackPtr ) ); |
131 |
|
132 |
@@ -324,6 +326,19 @@ AudioCdCollection::infoFetchComplete( KJob *job ) |
133 |
} |
134 |
} |
135 |
|
136 |
+qint64 |
137 |
+AudioCdCollection::trackLength(int i) const |
138 |
+{ |
139 |
+ KUrl kioUrl = audiocdUrl( QString("Track%1.wav").arg(i, 2, 10, QChar('0') ) ); |
140 |
+ KIO::UDSEntry uds; |
141 |
+ if ( KIO::NetAccess::stat(kioUrl, uds, NULL) ) |
142 |
+ { |
143 |
+ qint64 samples = (uds.numberValue(KIO::UDSEntry::UDS_SIZE, 44) - 44) / 4; |
144 |
+ return (samples - 44) * 10 / 441; |
145 |
+ } |
146 |
+ return 0; |
147 |
+} |
148 |
+ |
149 |
QString |
150 |
AudioCdCollection::collectionId() const |
151 |
{ |
152 |
@@ -456,6 +471,7 @@ AudioCdCollection::noInfoAvailable() |
153 |
|
154 |
trackPtr->setTrackNumber( i ); |
155 |
trackPtr->setFileNameBase( trackName ); |
156 |
+ trackPtr->setLength( trackLength( i ) ); |
157 |
|
158 |
memoryCollection()->addTrack( Meta::TrackPtr::staticCast( trackPtr ) ); |
159 |
|
160 |
diff --git a/src/core-impl/collections/audiocd/AudioCdCollection.h b/src/core-impl/collections/audiocd/AudioCdCollection.h |
161 |
index a3baf61..6196b4a 100644 |
162 |
--- a/src/core-impl/collections/audiocd/AudioCdCollection.h |
163 |
+++ b/src/core-impl/collections/audiocd/AudioCdCollection.h |
164 |
@@ -103,6 +103,7 @@ private: |
165 |
|
166 |
// Helper function to build the audiocd url. |
167 |
KUrl audiocdUrl( const QString &path = "" ) const; |
168 |
+ qint64 trackLength( int i ) const; |
169 |
|
170 |
/** |
171 |
* Clear collection and read the CD currently in the drive, adding Artist, Album, |
172 |
diff --git a/src/core-impl/meta/cdda/AudioCdTrackProvider_p.cpp b/src/core-impl/meta/cdda/AudioCdTrackProvider_p.cpp |
173 |
index 048e6b6..e697367 100644 |
174 |
--- a/src/core-impl/meta/cdda/AudioCdTrackProvider_p.cpp |
175 |
+++ b/src/core-impl/meta/cdda/AudioCdTrackProvider_p.cpp |
176 |
@@ -52,7 +52,7 @@ AudioCdTrackProvider::Private::Private() |
177 |
if( device.is<Solid::Block>() ) |
178 |
{ |
179 |
//does this actually work on windows??? |
180 |
- Solid::Block *sb = devie.as>Solid::Block>(); |
181 |
+ Solid::Block *sb = device.as<Solid::Block>(); |
182 |
m_cddaDevices.insert( device.udi(), sb->device() ); |
183 |
} |
184 |
} |
185 |
@@ -81,7 +81,7 @@ AudioCdTrackProvider::Private::deviceAdded( const QString &udi ) |
186 |
if( device.is<Solid::Block>() ) |
187 |
{ |
188 |
//does this actually work on windows??? |
189 |
- Solid::Block *sb = devie.as>Solid::Block>(); |
190 |
+ Solid::Block *sb = device.as<Solid::Block>(); |
191 |
m_cddaDevices.insert( device.udi(), sb->device() ); |
192 |
KCompactDisc cd; |
193 |
cd.setDevice( sb->device() ); |