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
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
}
}
- API.BluetoothManager {
- id: bluetooth
- url: bindingAddress
- }
-
Timer {
id: timer
interval: 250
}
}
- ListModel {
- id: playlist_model
- }
+ Item {
+ id: container
+ anchors.centerIn: parent
+ width: 1080
+ height: 1487
+ scale: screenInfo.scale_factor()
ColumnLayout {
anchors.fill: parent
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()
}
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()
}
}
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 {
offImage: './images/AGL_MediaPlayer_ForwardArrow.svg'
onClicked: {
if (bluetooth.av_connected) {
- bluetooth.sendMediaCommand("Next")
+ bluetooth.set_avrcp_controls("Next")
} else {
mediaplayer.next()
}
text: 'PLAYLIST'
opacity: 0.5
}
- model: playlist_model
+ model: MediaplayerModel
currentIndex: -1
delegate: MouseArea {
//}
}
onClicked: {
- mediaplayer.picktrack(playlistview.model.get(index).index)
+ mediaplayer.picktrack(playlistview.model[index].index)
}
}
}
}
}
+}