mirror of https://github.com/KDE/kasts.git
Implement the framework for custom audio starting position
What's still needed is the backend for saving the current position and making the audio player aware of that position when the entry is changed.
This commit is contained in:
parent
527ed67d4a
commit
129707009c
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include <QTimer>
|
||||
#include <QAudio>
|
||||
#include <QEventLoop>
|
||||
|
||||
class AudioManagerPrivate
|
||||
{
|
||||
|
@ -120,6 +121,30 @@ void AudioManager::setEntry(Entry* entry)
|
|||
{
|
||||
if (entry != nullptr) {
|
||||
d->m_entry = entry;
|
||||
d->m_player.setMedia(QUrl(QStringLiteral("file://")+d->m_entry->enclosure()->path()));
|
||||
|
||||
qint64 startingPosition = 0;
|
||||
// What follows is a dirty hack to get the player positioned at the
|
||||
// correct spot. The audio only becomes seekable when the player is
|
||||
// actually playing. So we start the playback and then set a timer to
|
||||
// wait until the stream becomes seekable; then switch position and
|
||||
// immediately pause the playback.
|
||||
// Unfortunately, this will produce an audible glitch with the current
|
||||
// QMediaPlayer backend.
|
||||
d->m_player.play();
|
||||
if(!d->m_player.isSeekable()) {
|
||||
QEventLoop loop;
|
||||
QTimer timer;
|
||||
timer.setSingleShot(true);
|
||||
timer.setInterval(2000);
|
||||
loop.connect(&timer, SIGNAL (timeout()), &loop, SLOT (quit()) );
|
||||
loop.connect(&d->m_player, SIGNAL (seekableChanged(bool)), &loop, SLOT (quit()));
|
||||
qDebug() << "Starting waiting loop";
|
||||
loop.exec();
|
||||
}
|
||||
qDebug() << "Changing position";
|
||||
if (startingPosition > 1000) d->m_player.setPosition(startingPosition);
|
||||
d->m_player.pause();
|
||||
Q_EMIT entryChanged(entry);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,12 +60,6 @@ Kirigami.ApplicationWindow {
|
|||
]
|
||||
}
|
||||
|
||||
AudioManager {
|
||||
id: audio
|
||||
playerOpen: false
|
||||
source: entry ? (entry.enclosure ? "file://" + entry.enclosure.path : "") : ""
|
||||
}
|
||||
|
||||
Component {
|
||||
id: aboutPage
|
||||
Kirigami.AboutPage {
|
||||
|
@ -85,34 +79,12 @@ Kirigami.ApplicationWindow {
|
|||
id: queueList
|
||||
}
|
||||
|
||||
/*
|
||||
Audio {
|
||||
AudioManager {
|
||||
id: audio
|
||||
|
||||
property var entry: SettingsManager.lastPlayingEntry !== "none" ? DataManager.getEntry(SettingsManager.lastPlayingEntry) : undefined
|
||||
property bool playerOpen: false
|
||||
|
||||
onSourceChanged: {
|
||||
if (entry !== undefined) {
|
||||
console.log("Changed track")
|
||||
SettingsManager.lastPlayingEntry = entry.id
|
||||
console.log("Between pause and seek", entry.title)
|
||||
seek(entry.enclosure.playPosition)
|
||||
}
|
||||
}
|
||||
onPositionChanged: {
|
||||
if (playbackState == Audio.PlayingState) {
|
||||
entry.enclosure.playPosition = position
|
||||
}
|
||||
console.log(entry.title, position, playbackState)
|
||||
}
|
||||
|
||||
//source: entry ? (entry.enclosure ? "file://" + entry.enclosure.path : "") : ""
|
||||
//source: entry.enclosure.url
|
||||
onError: console.debug(errorString)
|
||||
source: "gst-pipeline: playbin uri=file://" + entry.enclosure.path + " audio_sink=\"scaletempo ! audioconvert ! audioresample ! autoaudiosink\" video_sink=\"fakevideosink\""
|
||||
playerOpen: false
|
||||
//onPositionChanged: console.log("position changed to", position)
|
||||
//onSeekableChanged: console.log("seekable changed to", seekable)
|
||||
}
|
||||
*/
|
||||
|
||||
footer: Loader {
|
||||
active: (audio.entry != undefined) && !audio.playerOpen
|
||||
|
|
Loading…
Reference in New Issue