Added C++ connections to the media session.

This commit is contained in:
Swapnil Tripathi 2021-08-14 20:01:58 +05:30 committed by Tobias Fella
parent ed5c83b756
commit 6e3b360978
5 changed files with 167 additions and 34 deletions

View File

@ -7,7 +7,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.kde.kasts" package="org.kde.kasts"
android:versionName="0.0.1" android:versionName="0.0.1"
android:versionCode="1628285196" android:versionCode="1628950419"
android:installLocation="auto"> android:installLocation="auto">
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/> <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>

View File

@ -36,8 +36,11 @@ public class KastsActivity extends QtActivity
class MediaData { class MediaData {
public String title; public String title;
public long length; public String author;
public String album;
public long position; public long position;
public long duration;
public float playbackSpeed;
// add more variables here // add more variables here
} }
@ -62,7 +65,7 @@ public class KastsActivity extends QtActivity
//TODO Image //TODO Image
mSession.setMetadata(metadata.build()); mSession.setMetadata(metadata.build());
mPBuilder.setState(PlaybackStateCompat.STATE_PLAYING, 100000, 1.0f); mPBuilder.setState(PlaybackStateCompat.STATE_PLAYING, 100000, 1.0f); //TODO:Logically we should remove this statement??
Intent iPlay = new Intent(this, MediaSessionCallback.class); Intent iPlay = new Intent(this, MediaSessionCallback.class);
iPlay.setAction("ACTION_PLAY"); iPlay.setAction("ACTION_PLAY");
@ -145,13 +148,6 @@ public class KastsActivity extends QtActivity
mSession.release(); mSession.release();
} }
public static void setSessionState(int state)
{
//TODO: set state in mediadata
activity.updateNotification();
}
private class MediaSessionCallback extends MediaSessionCompat.Callback { private class MediaSessionCallback extends MediaSessionCompat.Callback {
private Context mContext; private Context mContext;
@ -191,4 +187,49 @@ public class KastsActivity extends QtActivity
} }
} }
/*
* JNI METHODS
*/
public static void setSessionState(int state)
{
//TODO: set state in mediadata
switch(state)
{
case 0:
mPBuilder.setState(PlaybackStateCompat.STATE_PLAYING, mediaData.position, mediaData.playbackSpeed);
case 1:
mPBuilder.setState(PlaybackStateCompat.STATE_PAUSED, mediaData.position, mediaData.playbackSpeed);
case 2:
mPBuilder.setState(PlaybackStateCompat.STATE_STOPPED, mediaData.position, mediaData.playbackSpeed);
}
activity.updateNotification();
}
public static void setMetadata(String title, String author, String album, long position, long duration, float rate)
{
mediaData.title = title;
mediaData.author = author;
mediaData.album = album;
mediaData.position = position;
mediaData.duration = duration;
mediaData.playbackSpeed = rate;
activity.updateNotification();
}
public static void setPlaybackSpeed(int rate)
{
mediaData.playbackSpeed = rate;
}
public static void setDuration(int duration)
{
mediaData.duration = duration;
}
public static void setPosition(int position)
{
mediaData.position = position;
}
} }

View File

@ -79,6 +79,7 @@ AudioManager::AudioManager(QObject *parent)
connect(this, &AudioManager::logError, &ErrorLogModel::instance(), &ErrorLogModel::monitorErrorMessages); connect(this, &AudioManager::logError, &ErrorLogModel::instance(), &ErrorLogModel::monitorErrorMessages);
// MediaSessionClient object.
new MediaSessionClient(this); new MediaSessionClient(this);
// Check if an entry was playing when the program was shut down and restore it // Check if an entry was playing when the program was shut down and restore it

View File

@ -7,40 +7,122 @@
#include "mediasessionclient.h" #include "mediasessionclient.h"
#include "audiomanager.h" #include "audiomanager.h"
#include <QtAndroid>
#include <QDebug> #include <QDebug>
MediaSessionClient::MediaSessionClient(AudioManager *audioPlayer, QObject *parent) MediaSessionClient::MediaSessionClient(AudioManager *audioPlayer, QObject *parent)
: QObject(parent) : QObject(parent)
, m_audioPlayer(audioPlayer) , m_audioPlayer(audioPlayer)
{ {
connect(m_audioPlayer, &AudioManager::playbackStateChanged, this, &MediaSessionClient::setState); connect(m_audioPlayer, &AudioManager::playbackStateChanged, this, &MediaSessionClient::setSessionPlaybackState);
// Sets the current playback state.
connect(m_audioPlayer, &AudioManager::entryChanged, this, &MediaSessionClient::setSessionMetadata);
// Updates the android session's metadata.
connect(m_audioPlayer, &AudioManager::playbackRateChanged, this, &MediaSessionClient::setSessionRate);
// Sets the rate of the media playback.
connect(m_audioPlayer, &AudioManager::durationChanged, this, &MediaSessionClient::setSessionDuration);
// Sets the playback duration metadata.
connect(m_audioPlayer, &AudioManager::positionChanged, this, &MediaSessionClient::setSessionPosition);
// Sets the playback position metadata.
connect(m_audioPlayer, &AudioManager::playing, this, &MediaSessionClient::setPlaying);
// Sets the playback to playing.
connect(m_audioPlayer, &AudioManager::paused, this, &MediaSessionClient::setPaused);
// Sets the playback to paused.
connect(m_audioPlayer, &AudioManager::stopped, this, &MediaSessionClient::setStopped);
// Sets the playback to stopped.
} }
void MediaSessionClient::setState() void MediaSessionClient::setSessionPlaybackState()
{ {
qDebug() << m_audioPlayer->playbackState(); qDebug() << "MediaSessionClient::setSessionPlaybackState called with state value = " << m_audioPlayer->playbackState();
int status = -1;
switch(m_audioPlayer->playbackState()) { switch(m_audioPlayer->playbackState()) {
case QMediaPlayer::StoppedState :
QAndroidJniObject::callStaticMethod<void>
("org/kde/kasts/KastsActivity"
, "setSessionState"
, "(I)V"
, 2);
break;
case QMediaPlayer::PausedState :
QAndroidJniObject::callStaticMethod<void>
("org/kde/kasts/KastsActivity"
, "setSessionState"
, "(I)V"
, 1);
break;
case QMediaPlayer::PlayingState : case QMediaPlayer::PlayingState :
QAndroidJniObject::callStaticMethod<void> status = 0;
("org/kde/kasts/KastsActivity" break;
, "setSessionState" case QMediaPlayer::PausedState :
, "(I)V" status = 1;
, 0); break;
case QMediaPlayer::StoppedState :
status = 2;
break; break;
} }
QAndroidJniObject::callStaticMethod<void>("org/kde/kasts/KastsActivity", "setSessionState", "(I)V", status);
}
void MediaSessionClient::setSessionMetadata()
{
/*
* Sets the media session's metadata. This will be triggered every time there is state change ie. next, previous, etc.
*/
Entry *entry = m_audioPlayer->entry();
QString authorString = QStringLiteral("");
if (entry->authors().count() > 0) {
for (auto &author : entry->authors()) {
authorString.append(QStringLiteral(", "));
authorString.append(author->name());
}
}
QAndroidJniObject title = QAndroidJniObject::fromString(entry->title());
// Title string
QAndroidJniObject author = QAndroidJniObject::fromString(authorString);
// Author string
QAndroidJniObject album = QAndroidJniObject::fromString(QStringLiteral("Album"));
// Author string
qint64 duration = qint64(m_audioPlayer->duration()) * 1000;
// Playback duration
qint64 position = qint64(m_audioPlayer->position()) * 1000;
// Playback position
int rate = m_audioPlayer->playbackRate();
// Playback rate
QAndroidJniObject::callStaticMethod<void>("org/kde/kasts/KastsActivity", "setMetadata","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J;J;F)V",title.object<jstring>(), author.object<jstring>(), album.object<jstring>(), position, duration, rate);
}
void MediaSessionClient::setSessionRate()
{
/*
* Sets the media session's rate metadata.
*/
int rate = m_audioPlayer->playbackRate();
QAndroidJniObject::callStaticMethod<void>("org/kde/kasts/KastsActivity", "setPlaybackSpeed", "(I)V", rate);
}
void MediaSessionClient::setSessionDuration()
{
/*
* Sets the media session's playback duration.
*/
qint64 duration = qint64(m_audioPlayer->duration()) * 1000;
QAndroidJniObject::callStaticMethod<void>("org/kde/kasts/KastsActivity", "setDuration", "(I)V", duration);
}
void MediaSessionClient::setSessionPosition()
{
/*
* Sets the media session's current playback position.
*/
qint64 position = qint64(m_audioPlayer->position()) * 1000;
QAndroidJniObject::callStaticMethod<void>("org/kde/kasts/KastsActivity", "setPosition", "(I)V", position);
}
void MediaSessionClient::setPlaying()
{
/*
* Sets the media session's current playback state to playing.
*/
}
void MediaSessionClient::setPaused()
{
/*
* Sets the media session's current playback state to paused.
*/
}
void MediaSessionClient::setStopped()
{
/*
* Sets the media session's current playback state to stopped.
*/
} }

View File

@ -7,8 +7,10 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QtAndroid>
class AudioManager; class AudioManager;
class Entry;
class MediaSessionClient : public QObject class MediaSessionClient : public QObject
{ {
@ -16,7 +18,14 @@ public:
explicit MediaSessionClient(AudioManager *audioPlayer, QObject *parent = nullptr); explicit MediaSessionClient(AudioManager *audioPlayer, QObject *parent = nullptr);
private Q_SLOTS: private Q_SLOTS:
void setState(); void setSessionPlaybackState();
void setSessionMetadata();
void setSessionRate();
void setSessionDuration();
void setSessionPosition();
void setPlaying();
void setPaused();
void setStopped();
private: private:
AudioManager *m_audioPlayer = nullptr; AudioManager *m_audioPlayer = nullptr;