X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=app%2FMediaPlayer.qml;h=f9644ad5ba509d3792691f1ae486384aa3aaf308;hb=refs%2Fheads%2Fsandbox%2Fknimitz%2Fhmi-framework-test-dab;hp=9019a3fd9004eb16ebc00d82bb4ec1dfcb9bbf1f;hpb=ba7c74937dfbe12ab2ef2419c934a3fc6b51c711;p=apps%2Fmediaplayer.git diff --git a/app/MediaPlayer.qml b/app/MediaPlayer.qml index 9019a3f..f9644ad 100644 --- a/app/MediaPlayer.qml +++ b/app/MediaPlayer.qml @@ -1,5 +1,6 @@ /* * Copyright (C) 2016 The Qt Company Ltd. + * Copyright (C) 2017 Toyota Motor Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,89 +21,203 @@ import QtQuick.Controls 2.0 import QtMultimedia 5.6 import AGL.Demo.Controls 1.0 import MediaPlayer 1.0 +import QtQml.StateMachine 1.0 as MPSM +import 'api' as API ApplicationWindow { id: root + + property int sourceID: 0 + property int connectionID + property int sourceIndex - Item { - id: bluetooth - property bool connected: false - property string state - - property string artist - property string title - property int duration: 0 - property int position: 0 + signal playMediaplayer + signal stopMediaplayer + signal disconnected + signal paused + signal connected - function disableBluetooth() { - bluetooth.artist = '' - bluetooth.title = '' - bluetooth.duration = 0 - bluetooth.position = 0 - bluetooth.connected = false - } + API.LightMediaScanner { + id: binding + url: bindingAddress } - Connections { - target: dbus + API.BluetoothManager { + id: bluetooth + url: bindingAddress + } - onProcessPlaylistUpdate: { - playlist.clear() - playlist.addItems(mediaFiles) + MediaPlayer { + id: player + audioRole: MediaPlayer.MusicRole + autoLoad: true + playlist: playlist - playlistmodel.setSource(playlist) - playlistview.visible = bluetooth.connected == false + function time2str(value) { + return Qt.formatTime(new Date(value), 'mm:ss') } + } - onProcessPlaylistHide: { - playlistview.visible = false - player.stop() + MPSM.StateMachine{ + id: mediaplayerState + initialState: stop + running: true + MPSM.State{ + id: haveSoundRight + MPSM.SignalTransition{ + targetState: stop + signal: disconnected + } + MPSM.SignalTransition{ + targetState: pause + signal: paused + } + MPSM.SignalTransition{ + targetState: playing + signal: playMediaplayer + } + onEntered: { + console.log("enter haveSoundRight") + } + onExited : { + // Nothing to do + } } - - onProcessPlaylistShow: { - playlistview.visible = true - bluetooth.disableBluetooth() + MPSM.State{ + id: stop + MPSM.SignalTransition{ + targetState: haveSoundRight + signal: connected + } + onEntered: { + console.log("enter stop state") + } + onExited : { + // Nothing to do + } } - - onDisplayBluetoothMetadata: { - if (avrcp_artist) - bluetooth.artist = avrcp_artist - if (avrcp_title) - bluetooth.title = avrcp_title - bluetooth.duration = avrcp_duration + MPSM.State{ + id: pause + MPSM.SignalTransition{ + targetState: haveSoundRight + signal: connected + } + MPSM.SignalTransition{ + targetState: stop + signal: disconnected + } + onEntered: { + console.log("enter pause state") + } + onExited : { + // Nothing to do + } } - - onUpdatePlayerStatus: { - bluetooth.connected = true - bluetooth.state = status + MPSM.State{ + id: playing + MPSM.SignalTransition{ + targetState: haveSoundRight + signal: stopMediaplayer + } + MPSM.SignalTransition{ + targetState: lostSoundRight + signal: disconnected + } + onEntered: { + console.log("enter playing state") + player.play() + } + onExited : { + player.pause() + } } - - onUpdatePosition: { - slider.value = current_position - bluetooth.position = current_position + MPSM.State{ + id: lostSoundRight + MPSM.SignalTransition{ + targetState: playing + signal: connected + } + onEntered: { + console.log("enter lostSoundRight") + } + onExited : { + } + } + MPSM.State{ + id: temporaryLostSoundRight + MPSM.SignalTransition{ + targetState: playing + signal: connected + } + MPSM.SignalTransition{ + targetState: lostSoundRight + signal: disconnected + } + onEntered: { + console.log("enter lostSoundRight") + } + onExited : { + } } } - MediaPlayer { - id: player - audioRole: MediaPlayer.MusicRole - autoLoad: true - playlist: playlist + function slotReply(msg){ + var jstr = JSON.stringify(msg) + var content = JSON.parse(jstr); + var verb = content.response.verb + var err = content.response.error + switch(verb) + { + case "connect": + if(err == 0){ + connectionID = content.response.mainConnectionID + } + break; + case "registerSource": + if(err == 0){ + sourceID = content.response.sourceID + } + } + } - property bool is_bluetooth: false - function time2str(value) { - return Qt.formatTime(new Date(value), 'mm:ss') + function slotEvent(event,msg){ + var jstr = JSON.stringify(msg) + var content = JSON.parse(jstr); + var eventName = content.event + switch(eventName) + { + case "soundmanager\/asyncSetSourceState": + // This event doesn't come for now + if(sourceID == content.data.sourceID){ + console.log("mediaplayer: call ackSetSourceState") + smw.ackSetSourceState(content.data.handle, 0) + switch(content.data.sourceState){ + case "on": + connected() + break; + case "off": + disconnected() + break; + case "paused": + paused() + break; + default: + break; + } + } + break; + default: + break; } - onPositionChanged: slider.value = player.position } Timer { id: timer interval: 250 - running: (bluetooth.connected && bluetooth.state == "playing") + running: (bluetooth.av_connected && bluetooth.state == "playing") repeat: true onTriggered: { - bluetooth.position = dbus.getCurrentPosition() + bluetooth.position = bluetooth.position + 250 slider.value = bluetooth.position } } @@ -110,10 +225,6 @@ ApplicationWindow { Playlist { id: playlist playbackMode: random.checked ? Playlist.Random : loop.checked ? Playlist.Loop : Playlist.Sequential - - Component.onCompleted: { - playlist.addItems(mediaFiles) - } } @@ -132,7 +243,7 @@ ApplicationWindow { height: sourceSize.height * width / sourceSize.width fillMode: Image.PreserveAspectCrop source: player.metaData.coverArtImage ? player.metaData.coverArtImage : '' - visible: bluetooth.connected == false + visible: bluetooth.av_connected == false } Item { @@ -172,13 +283,13 @@ ApplicationWindow { Label { id: title Layout.alignment: Layout.Center - text: bluetooth.title ? bluetooth.title : (player.metaData.title ? player.metaData.title : '') + text: bluetooth.av_connected ? bluetooth.title : (player.metaData.title ? player.metaData.title : '') horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter } Label { Layout.alignment: Layout.Center - text: bluetooth.artist ? bluetooth.artist : (player.metaData.contributingArtist ? player.metaData.contributingArtist : '') + text: bluetooth.av_connected ? bluetooth.artist : (player.metaData.contributingArtist ? player.metaData.contributingArtist : '') horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter font.pixelSize: title.font.pixelSize * 0.6 @@ -188,10 +299,11 @@ ApplicationWindow { Slider { id: slider Layout.fillWidth: true - to: bluetooth.connected ? bluetooth.duration : player.duration - enabled: bluetooth.connected == false + 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.connected && bluetooth.position) { + if (bluetooth.av_connected) { return player.time2str(bluetooth.position) } return player.time2str(player.position) @@ -208,7 +320,7 @@ ApplicationWindow { anchors.right: parent.right anchors.bottom: parent.top font.pixelSize: 32 - text: bluetooth.connected ? player.time2str(bluetooth.duration) : player.time2str(player.duration) + text: bluetooth.av_connected ? player.time2str(bluetooth.duration) : player.time2str(player.duration) } onPressedChanged: player.seek(value) } @@ -225,8 +337,9 @@ ApplicationWindow { id: previous offImage: './images/AGL_MediaPlayer_BackArrow.svg' onClicked: { - if (bluetooth.connected) { - dbus.processQMLEvent("Previous") + if (bluetooth.av_connected) { + bluetooth.sendMediaCommand("Previous") + bluetooth.position = 0 } else { playlist.previous() } @@ -236,10 +349,10 @@ ApplicationWindow { id: play offImage: './images/AGL_MediaPlayer_Player_Play.svg' onClicked: { - if (bluetooth.connected) { - dbus.processQMLEvent("Play") + if (bluetooth.av_connected) { + bluetooth.sendMediaCommand("Play") } else { - player.play() + playMediaplayer() } } states: [ @@ -248,15 +361,17 @@ ApplicationWindow { PropertyChanges { target: play offImage: './images/AGL_MediaPlayer_Player_Pause.svg' - onClicked: player.pause() + onClicked: { + stopMediaplayer() + } } }, State { - when: bluetooth.connected && bluetooth.state == "playing" + when: bluetooth.av_connected && bluetooth.state == "playing" PropertyChanges { target: play offImage: './images/AGL_MediaPlayer_Player_Pause.svg' - onClicked: dbus.processQMLEvent("Pause") + onClicked: bluetooth.sendMediaCommand("Pause") } } @@ -266,8 +381,8 @@ ApplicationWindow { id: forward offImage: './images/AGL_MediaPlayer_ForwardArrow.svg' onClicked: { - if (bluetooth.connected) { - dbus.processQMLEvent("Next") + if (bluetooth.av_connected) { + bluetooth.sendMediaCommand("Next") } else { playlist.next() } @@ -275,12 +390,21 @@ ApplicationWindow { } 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() + } + } + } } } } @@ -290,14 +414,15 @@ ApplicationWindow { Layout.fillHeight: true Layout.preferredHeight: 407 - PlaylistWithMetadata { - id: playlistmodel + PlaylistWithMetadata { + id: playlistmodel source: playlist } ListView { anchors.fill: parent id: playlistview + visible: bluetooth.av_connected == false clip: true header: Label { x: 50 @@ -342,7 +467,9 @@ ApplicationWindow { } onClicked: { playlist.currentIndex = model.index - player.play() + sourceIndex = model.index; + console.log("mediaplayer: call connect") + playMediaplayer() } } @@ -352,5 +479,8 @@ ApplicationWindow { } } } + Component.onCompleted: { + smw.registerSource("mediaplayer") + } } }