X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=app%2FMediaPlayer.qml;h=71bda776b9d1d296e9ed068633783bc6c615b9bc;hb=refs%2Fchanges%2F51%2F9551%2F2;hp=fbb2c1f4da3bd6dec291c28dda6904566b25d2bc;hpb=9daba1c3bc1cb1ae68486a7aa34f734e54748403;p=apps%2Fmediaplayer.git diff --git a/app/MediaPlayer.qml b/app/MediaPlayer.qml index fbb2c1f..71bda77 100644 --- a/app/MediaPlayer.qml +++ b/app/MediaPlayer.qml @@ -20,29 +20,97 @@ import QtQuick.Controls 2.0 import QtMultimedia 5.6 import AGL.Demo.Controls 1.0 import MediaPlayer 1.0 +import 'api' as API ApplicationWindow { id: root + Item { + id: bluetooth + property bool connected: false + property string state + + property string artist + property string title + property int duration: 0 + property int position: 0 + property int pos_offset: 0 + + function disableBluetooth() { + bluetooth.artist = '' + bluetooth.title = '' + bluetooth.duration = 0 + bluetooth.position = 0 + bluetooth.pos_offset = 0 + bluetooth.connected = false + } + } + + API.LightMediaScanner { + id: binding + url: bindingAddress + } + + Connections { + target: dbus + + onProcessPlaylistHide: { + playlistview.visible = false + player.stop() + } + + onProcessPlaylistShow: { + playlistview.visible = true + bluetooth.disableBluetooth() + } + + onDisplayBluetoothMetadata: { + if (avrcp_artist) + bluetooth.artist = avrcp_artist + if (avrcp_title) + bluetooth.title = avrcp_title + bluetooth.duration = avrcp_duration + bluetooth.pos_offset = 0 + } + + onUpdatePlayerStatus: { + bluetooth.connected = true + bluetooth.state = status + } + + onUpdatePosition: { + slider.value = current_position + bluetooth.position = current_position + } + } + MediaPlayer { id: player audioRole: MediaPlayer.MusicRole autoLoad: true playlist: playlist + + property bool is_bluetooth: false function time2str(value) { return Qt.formatTime(new Date(value), 'mm:ss') } onPositionChanged: slider.value = player.position - Component.onCompleted: console.debug('player.supportedAudioRoles()', player.supportedAudioRoles()) + } + + Timer { + id: timer + interval: 250 + running: (bluetooth.connected && bluetooth.state == "playing") + repeat: true + onTriggered: { + bluetooth.position = dbus.getCurrentPosition() - bluetooth.pos_offset + slider.value = bluetooth.position + } } Playlist { id: playlist playbackMode: random.checked ? Playlist.Random : loop.checked ? Playlist.Loop : Playlist.Sequential - - Component.onCompleted: { - playlist.addItems(mediaFiles) - } } @@ -51,15 +119,17 @@ ApplicationWindow { Item { Layout.fillWidth: true Layout.fillHeight: true - Layout.preferredHeight: 3 + Layout.preferredHeight: 1080 clip: true Image { + id: albumart anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom height: sourceSize.height * width / sourceSize.width fillMode: Image.PreserveAspectCrop source: player.metaData.coverArtImage ? player.metaData.coverArtImage : '' + visible: bluetooth.connected == false } Item { @@ -83,11 +153,13 @@ ApplicationWindow { spacing: 20 ToggleButton { id: random + visible: bluetooth.connected == false offImage: './images/AGL_MediaPlayer_Shuffle_Inactive.svg' onImage: './images/AGL_MediaPlayer_Shuffle_Active.svg' } ToggleButton { id: loop + visible: bluetooth.connected == false offImage: './images/AGL_MediaPlayer_Loop_Inactive.svg' onImage: './images/AGL_MediaPlayer_Loop_Active.svg' } @@ -97,14 +169,13 @@ ApplicationWindow { Label { id: title Layout.alignment: Layout.Center - text: player.metaData.title ? player.metaData.title : '' + text: bluetooth.title ? bluetooth.title : (player.metaData.title ? player.metaData.title : '') horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter } Label { - id: artist Layout.alignment: Layout.Center - text: player.metaData.author ? player.metaData.author : '' + text: bluetooth.artist ? bluetooth.artist : (player.metaData.contributingArtist ? player.metaData.contributingArtist : '') horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter font.pixelSize: title.font.pixelSize * 0.6 @@ -114,20 +185,27 @@ ApplicationWindow { Slider { id: slider Layout.fillWidth: true - to: player.duration + to: bluetooth.connected ? bluetooth.duration : player.duration + enabled: bluetooth.connected == false + function getPosition() { + if (bluetooth.connected && bluetooth.position) { + return player.time2str(bluetooth.position) + } + return player.time2str(player.position) + } Label { id: position anchors.left: parent.left anchors.bottom: parent.top font.pixelSize: 32 - text: player.time2str(player.position) + text: slider.getPosition() } Label { id: duration anchors.right: parent.right anchors.bottom: parent.top font.pixelSize: 32 - text: player.time2str(player.duration) + text: bluetooth.connected ? player.time2str(bluetooth.duration) : player.time2str(player.duration) } onPressedChanged: player.seek(value) } @@ -141,13 +219,27 @@ ApplicationWindow { // } Item { Layout.fillWidth: true } ImageButton { + id: previous offImage: './images/AGL_MediaPlayer_BackArrow.svg' - onClicked: playlist.previous() + onClicked: { + if (bluetooth.connected) { + bluetooth.pos_offset = dbus.getCurrentPosition() + dbus.processQMLEvent("Previous") + } else { + playlist.previous() + } + } } ImageButton { id: play offImage: './images/AGL_MediaPlayer_Player_Play.svg' - onClicked: player.play() + onClicked: { + if (bluetooth.connected) { + dbus.processQMLEvent("Play") + } else { + player.play() + } + } states: [ State { when: player.playbackState === MediaPlayer.PlayingState @@ -156,12 +248,28 @@ ApplicationWindow { offImage: './images/AGL_MediaPlayer_Player_Pause.svg' onClicked: player.pause() } + }, + State { + when: bluetooth.connected && bluetooth.state == "playing" + PropertyChanges { + target: play + offImage: './images/AGL_MediaPlayer_Player_Pause.svg' + onClicked: dbus.processQMLEvent("Pause") + } } + ] } ImageButton { + id: forward offImage: './images/AGL_MediaPlayer_ForwardArrow.svg' - onClicked: playlist.next() + onClicked: { + if (bluetooth.connected) { + dbus.processQMLEvent("Next") + } else { + playlist.next() + } + } } Item { Layout.fillWidth: true } @@ -178,18 +286,23 @@ ApplicationWindow { Item { Layout.fillWidth: true Layout.fillHeight: true - Layout.preferredHeight: 2 + Layout.preferredHeight: 407 + + PlaylistWithMetadata { + id: playlistmodel + source: playlist + } + ListView { anchors.fill: parent + id: playlistview clip: true header: Label { x: 50 text: 'PLAYLIST' opacity: 0.5 } - model: PlaylistWithMetadata { - source: playlist - } + model: playlistmodel currentIndex: playlist.currentIndex delegate: MouseArea {