X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=app%2FMediaPlayer.qml;h=7dfaf06a09b2f57ddbdab08b91b242372dbb982e;hb=728929eb2db2a4e6c616120a9b45ced3be5dc1dc;hp=438ff20e8774e5e7a11d9371e2c2f3a3dcc2a639;hpb=74c70d0ac87d4674646e53d2af781d9084a7ea06;p=apps%2Fmediaplayer.git diff --git a/app/MediaPlayer.qml b/app/MediaPlayer.qml index 438ff20..7dfaf06 100644 --- a/app/MediaPlayer.qml +++ b/app/MediaPlayer.qml @@ -17,9 +17,7 @@ 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 @@ -35,18 +33,108 @@ 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') } } + Item { + id: bluetooth + + property string deviceAddress: "" + property bool connected: false + property bool av_connected: false + + property int position: 0 + property int duration: 0 + + 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") + } + + 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 onPlaylistChanged: { - playlist.clear() + playlist_model.clear(); for (var i = 0; i < playlist.list.length; i++) { var item = playlist.list[i] @@ -84,11 +172,6 @@ ApplicationWindow { } } - API.BluetoothManager { - id: bluetooth - url: bindingAddress - } - Timer { id: timer interval: 250 @@ -215,7 +298,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 +307,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 +324,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 +350,7 @@ ApplicationWindow { offImage: './images/AGL_MediaPlayer_ForwardArrow.svg' onClicked: { if (bluetooth.av_connected) { - bluetooth.sendMediaCommand("Next") + bluetooth.set_avrcp_controls("Next") } else { mediaplayer.next() }