From 3f384d30d099f6eea5eb946c3cb0380f0453e2bc Mon Sep 17 00:00:00 2001 From: Scott Murray Date: Mon, 14 Feb 2022 18:00:05 -0500 Subject: Rework mediaplayer support to use mpd Rework the mediaplayer support to replace the stubbed out app framework agl-service-mediaplayer binding use with driving mpd (Media Player Daemon) via the libmpdclient library. Local file playback behavior should be equivalent to before in an image with mpd present and suitably configured. Bluetooth AVRCP support is still stubbed out, and will be re-implemented with followup changes. Bug-AGL: SPEC-4182 Signed-off-by: Scott Murray Change-Id: Ifdf092b472c271460d0f5e9a8c7d2353904411b2 --- mediaplayer/mediaplayer.cpp | 243 +++++++++++++++----------------------------- 1 file changed, 81 insertions(+), 162 deletions(-) (limited to 'mediaplayer/mediaplayer.cpp') diff --git a/mediaplayer/mediaplayer.cpp b/mediaplayer/mediaplayer.cpp index c578145..f6a9cbd 100644 --- a/mediaplayer/mediaplayer.cpp +++ b/mediaplayer/mediaplayer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Konsulko Group + * Copyright (C) 2018-2020,2022 Konsulko Group * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,37 +15,34 @@ */ #include +#include -#include "callmessage.h" -#include "eventmessage.h" -#include "messageengine.h" -#include "messagefactory.h" -#include "messageenginefactory.h" #include "mediaplayer.h" +#include "MediaplayerMpdBackend.h" Playlist::Playlist(QVariantMap &item) { - m_index = item["index"].toInt(); - m_duration = item["duration"].toInt(); - m_genre = item["genre"].toString(); - m_path = item["path"].toString(); - m_title = item["title"].toString(); - m_album = item["album"].toString(); - m_artist = item["artist"].toString(); + m_index = item["index"].toInt(); + m_duration = item["duration"].toInt(); + m_genre = item["genre"].toString(); + m_path = item["path"].toString(); + m_title = item["title"].toString(); + m_album = item["album"].toString(); + m_artist = item["artist"].toString(); } Playlist::~Playlist() {} -Mediaplayer::Mediaplayer (QUrl &url, QQmlContext *context, QObject * parent) : - QObject(parent) +Mediaplayer::Mediaplayer (QQmlContext *context, QObject * parent) : + QObject(parent) { - m_mloop = MessageEngineFactory::getInstance().getMessageEngine(url); - m_context = context; - m_context->setContextProperty("MediaplayerModel", QVariant::fromValue(m_playlist)); - QObject::connect(m_mloop.get(), &MessageEngine::connected, this, &Mediaplayer::onConnected); - QObject::connect(m_mloop.get(), &MessageEngine::disconnected, this, &Mediaplayer::onDisconnected); - QObject::connect(m_mloop.get(), &MessageEngine::messageReceived, this, &Mediaplayer::onMessageReceived); + m_context = context; + m_context->setContextProperty("MediaplayerModel", QVariant::fromValue(m_playlist)); + + m_backend = new MediaplayerMpdBackend(this, context); + if (!m_backend) + qFatal("Could not create MediaPlayerBackend"); } Mediaplayer::~Mediaplayer() @@ -56,207 +53,129 @@ Mediaplayer::~Mediaplayer() void Mediaplayer::updatePlaylist(QVariantMap playlist) { - QVariantList list = playlist["list"].toList(); + QVariantList list = playlist["list"].toList(); - m_playlist.clear(); + m_playlist.clear(); - for (auto i : list) { - QVariantMap item = qvariant_cast(i); - m_playlist.append(new Playlist(item)); - } + for (auto i : list) { + QVariantMap item = qvariant_cast(i); + m_playlist.append(new Playlist(item)); + } - if (m_playlist.count() == 0) { - QVariantMap tmp, track; + if (m_playlist.count() == 0) { + QVariantMap tmp, track; - track.insert("title", ""); - track.insert("artist", ""); - track.insert("album", ""); - track.insert("duration", 0); + track.insert("title", ""); + track.insert("artist", ""); + track.insert("album", ""); + track.insert("duration", 0); - tmp.insert("position", 0); - tmp.insert("track", track); + tmp.insert("position", 0); + tmp.insert("track", track); - // clear metadata in UI - m_context->setContextProperty("AlbumArt", ""); - emit metadataChanged(tmp); - } + // clear metadata in UI + m_context->setContextProperty("AlbumArt", ""); + emit metadataChanged(tmp); + } - // Refresh model - m_context->setContextProperty("MediaplayerModel", QVariant::fromValue(m_playlist)); + // Refresh model + m_context->setContextProperty("MediaplayerModel", QVariant::fromValue(m_playlist)); } -// Control Verb methods - -void Mediaplayer::control(QString control, QJsonObject parameter) +void Mediaplayer::updateMetadata(QVariantMap metadata) { - std::unique_ptr msg = MessageFactory::getInstance().createOutboundMessage(MessageId::Call); - if (!msg) - return; + if (metadata.contains("track")) { + QVariantMap track = metadata.value("track").toMap(); - CallMessage* mpmsg = static_cast(msg.get()); - parameter.insert("value", control); + if (track.contains("image")) { + m_context->setContextProperty("AlbumArt", + QVariant::fromValue(track.value("image"))); + } + + if (!track.contains("artist")) { + track.insert("artist", ""); + metadata["track"] = track; + } + + if (!track.contains("album")) { + track.insert("album", ""); + metadata["track"] = track; + } + } - mpmsg->createRequest("mediaplayer", "controls", parameter); - m_mloop->sendMessage(std::move(msg)); + emit metadataChanged(metadata); } +// Control methods -void Mediaplayer::control(QString control) +// For backwards compatibility +void Mediaplayer::disconnect() { - QJsonObject parameter; + disconnectBluetooth(); +} - Mediaplayer::control(control, parameter); +// For backwards compatibility +void Mediaplayer::connect() +{ + connectBluetooth(); } -void Mediaplayer::disconnect() +void Mediaplayer::disconnectBluetooth() { - control("disconnect"); + // Disconnect from Bluetooth media } -void Mediaplayer::connect() +void Mediaplayer::connectBluetooth() { - control("connect"); + // Connect to Bluetooth media } + void Mediaplayer::play() { - control("play"); + m_backend->play(); } void Mediaplayer::pause() { - control("pause"); + m_backend->pause(); } void Mediaplayer::previous() { - control("previous"); + m_backend->previous(); } void Mediaplayer::next() { - control("next"); + m_backend->next(); } void Mediaplayer::seek(int milliseconds) { - QJsonObject parameter; - parameter.insert("position", QString::number(milliseconds)); - - control("seek", parameter); + m_backend->seek(milliseconds); } void Mediaplayer::fastforward(int milliseconds) { - QJsonObject parameter; - parameter.insert("position", QString::number(milliseconds)); - - control("fast-forward", parameter); + m_backend->fastforward(milliseconds); } void Mediaplayer::rewind(int milliseconds) { - QJsonObject parameter; - parameter.insert("position", QString::number(milliseconds)); - - control("rewind", parameter); + m_backend->rewind(milliseconds); } void Mediaplayer::picktrack(int track) { - QJsonObject parameter; - parameter.insert("index", QString::number(track)); - - control("pick-track", parameter); + m_backend->picktrack(track); } void Mediaplayer::volume(int volume) { - QJsonObject parameter; - parameter.insert("volume", QString(volume)); - - control("volume", parameter); + m_backend->volume(volume); } void Mediaplayer::loop(QString state) { - QJsonObject parameter; - parameter.insert("state", state); - - control("loop", parameter); -} - -void Mediaplayer::onConnected() -{ - QStringListIterator eventIterator(events); - - while (eventIterator.hasNext()) { - std::unique_ptr msg = MessageFactory::getInstance().createOutboundMessage(MessageId::Call); - if (!msg) - return; - - CallMessage* mpmsg = static_cast(msg.get()); - QJsonObject parameter; - parameter.insert("value", eventIterator.next()); - mpmsg->createRequest("mediaplayer", "subscribe", parameter); - m_mloop->sendMessage(std::move(msg)); - } -} - -void Mediaplayer::onDisconnected() -{ - QStringListIterator eventIterator(events); - - while (eventIterator.hasNext()) { - std::unique_ptr msg = MessageFactory::getInstance().createOutboundMessage(MessageId::Call); - if (!msg) - return; - - CallMessage* mpmsg = static_cast(msg.get()); - QJsonObject parameter; - parameter.insert("value", eventIterator.next()); - mpmsg->createRequest("mediaplayer", "unsubscribe", parameter); - m_mloop->sendMessage(std::move(msg)); - } -} - -void Mediaplayer::onMessageReceived(std::shared_ptr msg) -{ - if (!msg) - return; - - if (msg->isEvent()){ - std::shared_ptr emsg = std::static_pointer_cast(msg); - QString ename = emsg->eventName(); - QString eapi = emsg->eventApi(); - QJsonObject data = emsg->eventData(); - if (eapi != "mediaplayer") - return; - - if (ename == "playlist") { - updatePlaylist(data.toVariantMap()); - } else if (ename == "metadata") { - QVariantMap map = data.toVariantMap(); - - if (map.contains("track")) { - QVariantMap track = map.value("track").toMap(); - - if (track.contains("image")) { - m_context->setContextProperty("AlbumArt", - QVariant::fromValue(track.value("image"))); - } - - if (!track.contains("artist")) { - track.insert("artist", ""); - map["track"] = track; - } - - if (!track.contains("album")) { - track.insert("album", ""); - map["track"] = track; - } - } - - emit metadataChanged(map); - } - } + m_backend->loop(state); } -- cgit 1.2.3-korg