X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=app%2FMediaPlayer.qml;h=6c4a185282b5b46ff96c58bf48af3f37ff78808e;hb=92e613114ff5212fa7e5c2a226e32b6e252c9a9c;hp=fbb2c1f4da3bd6dec291c28dda6904566b25d2bc;hpb=eef33ace11e938cc0b8e3170ea0bd89292965a6d;p=apps%2Fmediaplayer.git diff --git a/app/MediaPlayer.qml b/app/MediaPlayer.qml index fbb2c1f..6c4a185 100644 --- a/app/MediaPlayer.qml +++ b/app/MediaPlayer.qml @@ -19,47 +19,52 @@ import QtQuick.Layouts 1.1 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 - MediaPlayer { + API.MediaPlayer { id: player - audioRole: MediaPlayer.MusicRole - autoLoad: true - playlist: playlist - function time2str(value) { - return Qt.formatTime(new Date(value), 'mm:ss') - } - onPositionChanged: slider.value = player.position - Component.onCompleted: console.debug('player.supportedAudioRoles()', player.supportedAudioRoles()) + url: bindingAddress } - Playlist { - id: playlist - playbackMode: random.checked ? Playlist.Random : loop.checked ? Playlist.Loop : Playlist.Sequential + API.BluetoothManager { + id: bluetooth + url: bindingAddress + } - Component.onCompleted: { - playlist.addItems(mediaFiles) + Timer { + id: timer + interval: 250 + running: (bluetooth.av_connected && bluetooth.state == "playing") + repeat: true + onTriggered: { + bluetooth.position = bluetooth.position + 250 + slider.value = bluetooth.position } } + ListModel { + id: playlist + } ColumnLayout { anchors.fill: parent 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 : '' + source: player.cover_art ? player.cover_art : '' + visible: bluetooth.av_connected == false } Item { @@ -83,13 +88,17 @@ 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 + checked: player.loop_state offImage: './images/AGL_MediaPlayer_Loop_Inactive.svg' onImage: './images/AGL_MediaPlayer_Loop_Active.svg' + onClicked: { player.loop(checked) } } } ColumnLayout { @@ -97,14 +106,13 @@ ApplicationWindow { Label { id: title Layout.alignment: Layout.Center - text: player.metaData.title ? player.metaData.title : '' + text: bluetooth.av_connected ? bluetooth.title : (player.title ? player.title : '') horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter } Label { - id: artist Layout.alignment: Layout.Center - text: player.metaData.author ? player.metaData.author : '' + text: bluetooth.av_connected ? bluetooth.artist : (player.artist ? player.artist : '') horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter font.pixelSize: title.font.pixelSize * 0.6 @@ -114,20 +122,28 @@ ApplicationWindow { Slider { id: slider Layout.fillWidth: true - to: player.duration + to: bluetooth.av_connected ? bluetooth.duration : player.duration + enabled: bluetooth.av_connected == false + value: bluetooth.av_connected ? bluetooth.position : player.position + function getPosition() { + if (bluetooth.av_connected) { + 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.av_connected ? player.time2str(bluetooth.duration) : player.time2str(player.duration) } onPressedChanged: player.seek(value) } @@ -141,36 +157,75 @@ ApplicationWindow { // } Item { Layout.fillWidth: true } ImageButton { + id: previous offImage: './images/AGL_MediaPlayer_BackArrow.svg' - onClicked: playlist.previous() + onClicked: { + if (bluetooth.av_connected) { + bluetooth.sendMediaCommand("Previous") + bluetooth.position = 0 + } else { + player.previous() + } + } } ImageButton { id: play offImage: './images/AGL_MediaPlayer_Player_Play.svg' - onClicked: player.play() + onClicked: { + if (bluetooth.av_connected) { + bluetooth.sendMediaCommand("Play") + } else { + player.play() + } + } states: [ State { - when: player.playbackState === MediaPlayer.PlayingState + when: player.running === true PropertyChanges { target: play offImage: './images/AGL_MediaPlayer_Player_Pause.svg' onClicked: player.pause() } + }, + State { + when: bluetooth.av_connected && bluetooth.state == "playing" + PropertyChanges { + target: play + offImage: './images/AGL_MediaPlayer_Player_Pause.svg' + onClicked: bluetooth.sendMediaCommand("Pause") + } } + ] } ImageButton { + id: forward offImage: './images/AGL_MediaPlayer_ForwardArrow.svg' - onClicked: playlist.next() + onClicked: { + if (bluetooth.av_connected) { + bluetooth.sendMediaCommand("Next") + } else { + player.next() + } + } } Item { Layout.fillWidth: true } -// Image { -// source: './images/AGL_MediaPlayer_Bluetooth_Inactive.svg' -// } -// Image { -// source: './images/AGL_MediaPlayer_Radio_Inactive.svg' -// } + + ToggleButton { + visible: bluetooth.connected + checked: bluetooth.av_connected + offImage: './images/AGL_MediaPlayer_Bluetooth_Inactive.svg' + onImage: './images/AGL_MediaPlayer_Bluetooth_Active.svg' + + onClicked: { + if (bluetooth.av_connected) { + bluetooth.disconnect_profiles() + } else { + bluetooth.connect_profiles() + } + } + } } } } @@ -178,19 +233,20 @@ ApplicationWindow { Item { Layout.fillWidth: true Layout.fillHeight: true - Layout.preferredHeight: 2 + Layout.preferredHeight: 407 + ListView { anchors.fill: parent + id: playlistview + visible: bluetooth.av_connected == false clip: true header: Label { x: 50 text: 'PLAYLIST' opacity: 0.5 } - model: PlaylistWithMetadata { - source: playlist - } - currentIndex: playlist.currentIndex + model: playlist + currentIndex: -1 delegate: MouseArea { id: delegate @@ -200,12 +256,6 @@ ApplicationWindow { anchors.fill: parent anchors.leftMargin: 50 anchors.rightMargin: 50 - Image { - source: model.coverArt - fillMode: Image.PreserveAspectFit - Layout.preferredWidth: delegate.height - Layout.preferredHeight: delegate.height - } ColumnLayout { Layout.fillWidth: true Label { @@ -219,14 +269,14 @@ ApplicationWindow { font.pixelSize: 32 } } - Label { - text: player.time2str(model.duration) - color: '#66FF99' - font.pixelSize: 32 - } + //Label { + // text: player.time2str(model.duration) + // color: '#66FF99' + // font.pixelSize: 32 + //} } onClicked: { - playlist.currentIndex = model.index + player.pick_track(playlistview.model.get(index).index) player.play() } }