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"
package="org.kde.kasts"
android:versionName="0.0.1"
android:versionCode="1628285196"
android:versionCode="1628950419"
android:installLocation="auto">
<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 {
public String title;
public long length;
public String author;
public String album;
public long position;
public long duration;
public float playbackSpeed;
// add more variables here
}
@ -62,7 +65,7 @@ public class KastsActivity extends QtActivity
//TODO Image
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);
iPlay.setAction("ACTION_PLAY");
@ -145,13 +148,6 @@ public class KastsActivity extends QtActivity
mSession.release();
}
public static void setSessionState(int state)
{
//TODO: set state in mediadata
activity.updateNotification();
}
private class MediaSessionCallback extends MediaSessionCompat.Callback {
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);
// MediaSessionClient object.
new MediaSessionClient(this);
// 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 "audiomanager.h"
#include <QtAndroid>
#include <QDebug>
MediaSessionClient::MediaSessionClient(AudioManager *audioPlayer, QObject *parent)
: QObject(parent)
, 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()) {
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 :
QAndroidJniObject::callStaticMethod<void>
("org/kde/kasts/KastsActivity"
, "setSessionState"
, "(I)V"
, 0);
status = 0;
break;
case QMediaPlayer::PausedState :
status = 1;
break;
case QMediaPlayer::StoppedState :
status = 2;
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
#include <QObject>
#include <QtAndroid>
class AudioManager;
class Entry;
class MediaSessionClient : public QObject
{
@ -16,7 +18,14 @@ public:
explicit MediaSessionClient(AudioManager *audioPlayer, QObject *parent = nullptr);
private Q_SLOTS:
void setState();
void setSessionPlaybackState();
void setSessionMetadata();
void setSessionRate();
void setSessionDuration();
void setSessionPosition();
void setPlaying();
void setPaused();
void setStopped();
private:
AudioManager *m_audioPlayer = nullptr;