X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=app%2FMediaPlayer.qml;h=983087c348065074de265823792a6fc22baadb37;hb=3b6450c3d10df2c0e9ac4ab5cf92373cd1d8ec5e;hp=438ff20e8774e5e7a11d9371e2c2f3a3dcc2a639;hpb=74c70d0ac87d4674646e53d2af781d9084a7ea06;p=apps%2Fmediaplayer.git diff --git a/app/MediaPlayer.qml b/app/MediaPlayer.qml index 438ff20..983087c 100644 --- a/app/MediaPlayer.qml +++ b/app/MediaPlayer.qml @@ -17,13 +17,14 @@ import QtQuick 2.6 import QtQuick.Layouts 1.1 import QtQuick.Controls 2.0 -import QtMultimedia 5.6 import AGL.Demo.Controls 1.0 -import 'api' as API ApplicationWindow { id: root + width: container.width * container.scale + height: container.height * container.scale + Item { id: player @@ -35,29 +36,105 @@ ApplicationWindow { property int position: 0 property string cover_art: "" - property string status: "" + property string status: "stopped" function time2str(value) { return Qt.formatTime(new Date(value), 'mm:ss') } } - Connections { - target: mediaplayer + Item { + id: bluetooth - onPlaylistChanged: { - playlist.clear() + property string deviceAddress: "" + property bool connected: false + property bool av_connected: false - for (var i = 0; i < playlist.list.length; i++) { - var item = playlist.list[i] + property int position: 0 + property int duration: 0 - playlist_model.append({ "index": item.index, "artist": item.artist ? item.artist : '', "title": item.title ? item.title : '' }) + property string artist: "" + property string title: "" + property string state: "stopped" + + // AVRCP Target UUID + property string avrcp_uuid: "0000110e-0000-1000-8000-00805f9b34fb" + + function connect_profiles() { + var address = bluetooth.deviceAddress; + bluetooth_connection.connect(address, "a2dp") + bluetooth_connection.connect(address, "avrcp") + } - if (item.selected) { - playlistview.currentIndex = i + function disconnect_profiles() { + var address = bluetooth.deviceAddress; + bluetooth_connection.disconnect(address, "a2dp") + bluetooth_connection.disconnect(address, "avrcp") + } + + function set_avrcp_controls(cmd) { + bluetooth_connection.set_avrcp_controls(bluetooth.deviceAddress, cmd) + } + } + + Connections { + target: bluetooth_connection + + onDeviceListEvent: { + var address = "" + for (var i = 0; i < data.list.length; i++) { + var item = data.list[i] + if (item.Connected == "True" && item.UUIDs.indexOf(bluetooth.avrcp_uuid) >= 0) { + address = item.Address + + bluetooth.connected = true + mediaplayer.pause() + + //NOTE: This hack is here for when MediaPlayer is started + // with an existing connection. + bluetooth.av_connected = item.AVPConnected == "True" } } + if (!address) + bluetooth.connected = false + else + bluetooth.deviceAddress = address + } + + onDeviceUpdatedEvent: { + var metadata = data.Metadata + + if (data.Connected == "False") + return + + if (!bluetooth.av_connected && data.AVPConnected == "True") { + mediaplayer.pause() + player.status = "stopped" + } + + bluetooth.connected = data.Connected == "True" + bluetooth.av_connected = data.AVPConnected == "True" + bluetooth.deviceAddress = data.Address + + if ('Position' in metadata) + bluetooth.position = metadata.Position + + if ('Duration' in metadata) + bluetooth.duration = metadata.Duration + + if ('Status' in metadata) + bluetooth.state = metadata.Status + + if ('Artist' in metadata) + bluetooth.artist = metadata.Artist + + if ('Title' in metadata) + bluetooth.title = metadata.Title } + } + + Connections { + target: mediaplayer onMetadataChanged: { player.title = metadata.title @@ -84,11 +161,6 @@ ApplicationWindow { } } - API.BluetoothManager { - id: bluetooth - url: bindingAddress - } - Timer { id: timer interval: 250 @@ -99,9 +171,12 @@ ApplicationWindow { } } - ListModel { - id: playlist_model - } + Item { + id: container + anchors.centerIn: parent + width: 1080 + height: 1487 + scale: screenInfo.scale_factor() ColumnLayout { anchors.fill: parent @@ -215,7 +290,7 @@ ApplicationWindow { offImage: './images/AGL_MediaPlayer_BackArrow.svg' onClicked: { if (bluetooth.av_connected) { - bluetooth.sendMediaCommand("Previous") + bluetooth.set_avrcp_controls("Previous") bluetooth.position = 0 } else { mediaplayer.previous() @@ -224,22 +299,14 @@ ApplicationWindow { } ImageButton { id: play - offImage: './images/AGL_MediaPlayer_Player_Play.svg' - onClicked: { - if (bluetooth.av_connected) { - bluetooth.sendMediaCommand("Play") - } else { - mediaplayer.play() - } - } states: [ State { - when: player.status == "playing" + when: !bluetooth.av_connected && player.status == "playing" PropertyChanges { target: play offImage: './images/AGL_MediaPlayer_Player_Pause.svg' onClicked: { - player.status = "" + player.status = "stopped" mediaplayer.pause() } } @@ -249,10 +316,25 @@ ApplicationWindow { PropertyChanges { target: play offImage: './images/AGL_MediaPlayer_Player_Pause.svg' - onClicked: bluetooth.sendMediaCommand("Pause") + onClicked: bluetooth.set_avrcp_controls("Pause") + } + }, + State { + when: !bluetooth.av_connected && player.status != "playing" + PropertyChanges { + target: play + offImage: './images/AGL_MediaPlayer_Player_Play.svg' + onClicked: mediaplayer.play() + } + }, + State { + when: bluetooth.av_connected && bluetooth.state != "playing" + PropertyChanges { + target: play + offImage: './images/AGL_MediaPlayer_Player_Play.svg' + onClicked: bluetooth.set_avrcp_controls("Play") } } - ] } ImageButton { @@ -260,7 +342,7 @@ ApplicationWindow { offImage: './images/AGL_MediaPlayer_ForwardArrow.svg' onClicked: { if (bluetooth.av_connected) { - bluetooth.sendMediaCommand("Next") + bluetooth.set_avrcp_controls("Next") } else { mediaplayer.next() } @@ -302,7 +384,7 @@ ApplicationWindow { text: 'PLAYLIST' opacity: 0.5 } - model: playlist_model + model: MediaplayerModel currentIndex: -1 delegate: MouseArea { @@ -333,7 +415,7 @@ ApplicationWindow { //} } onClicked: { - mediaplayer.picktrack(playlistview.model.get(index).index) + mediaplayer.picktrack(playlistview.model[index].index) } } @@ -345,3 +427,4 @@ ApplicationWindow { } } } +}