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
- API.MediaPlayer {
+ Item {
id: player
- url: bindingAddress
+
+ property string title: ""
+ property string album: ""
+ property string artist: ""
+
+ property int duration: 0
+ property int position: 0
+
+ property string cover_art: ""
+ property string status: "stopped"
+
+ function time2str(value) {
+ return Qt.formatTime(new Date(value), 'mm:ss')
+ }
}
- API.BluetoothManager {
+ Item {
id: bluetooth
- url: bindingAddress
+
+ 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_model.clear();
+
+ for (var i = 0; i < playlist.list.length; i++) {
+ var item = playlist.list[i]
+
+ playlist_model.append({ "index": item.index, "artist": item.artist ? item.artist : '', "title": item.title ? item.title : '' })
+
+ if (item.selected) {
+ playlistview.currentIndex = i
+ }
+ }
+ }
+
+ onMetadataChanged: {
+ player.title = metadata.title
+ player.album = metadata.album
+ player.artist = metadata.artist
+
+ if (metadata.duration) {
+ player.duration = metadata.duration
+ }
+
+ if (metadata.position) {
+ player.position = metadata.position
+ }
+
+ if (metadata.status) {
+ player.status = metadata.status
+ }
+
+ if (metadata.image) {
+ player.cover_art = metadata.image
+ }
+
+ playlistview.currentIndex = metadata.index
+ }
}
Timer {
repeat: true
onTriggered: {
bluetooth.position = bluetooth.position + 250
- slider.value = bluetooth.position
}
}
ListModel {
- id: playlist
+ id: playlist_model
}
ColumnLayout {
Layout.fillHeight: true
Row {
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: 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
+ //checked: player.loop_state
offImage: './images/AGL_MediaPlayer_Loop_Inactive.svg'
onImage: './images/AGL_MediaPlayer_Loop_Active.svg'
- onClicked: { player.loop(checked) }
+ onClicked: { mediaplayer.loop(checked) }
}
}
ColumnLayout {
font.pixelSize: 32
text: bluetooth.av_connected ? player.time2str(bluetooth.duration) : player.time2str(player.duration)
}
- onPressedChanged: player.seek(value)
+ onPressedChanged: mediaplayer.seek(value)
}
RowLayout {
Layout.fillHeight: true
offImage: './images/AGL_MediaPlayer_BackArrow.svg'
onClicked: {
if (bluetooth.av_connected) {
- bluetooth.sendMediaCommand("Previous")
+ bluetooth.set_avrcp_controls("Previous")
bluetooth.position = 0
} else {
- player.previous()
+ mediaplayer.previous()
}
}
}
ImageButton {
id: play
- offImage: './images/AGL_MediaPlayer_Player_Play.svg'
- onClicked: {
- if (bluetooth.av_connected) {
- bluetooth.sendMediaCommand("Play")
- } else {
- player.play()
- }
- }
states: [
State {
- when: player.running === true
+ when: !bluetooth.av_connected && player.status == "playing"
PropertyChanges {
target: play
offImage: './images/AGL_MediaPlayer_Player_Pause.svg'
- onClicked: player.pause()
+ onClicked: {
+ player.status = "stopped"
+ mediaplayer.pause()
+ }
}
},
State {
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 {
- player.next()
+ mediaplayer.next()
}
}
}
text: 'PLAYLIST'
opacity: 0.5
}
- model: playlist
+ model: playlist_model
currentIndex: -1
delegate: MouseArea {
Label {
Layout.fillWidth: true
text: model.artist
- color: '#66FF99'
+ color: '#00ADDC'
font.pixelSize: 32
}
}
//Label {
// text: player.time2str(model.duration)
- // color: '#66FF99'
+ // color: '#00ADDC'
// font.pixelSize: 32
//}
}
onClicked: {
- player.pick_track(playlistview.model.get(index).index)
- player.play()
+ mediaplayer.picktrack(playlistview.model.get(index).index)
}
}