8#include <QReadWriteLock>
10#include <QtCore/qcoreapplication.h>
26 auto context = QNativeInterface::QAndroidApplication::context();
27 const jlong
id =
reinterpret_cast<jlong
>(
this);
29 "(Landroid/content/Context;J)V",
32 mediaPlayers->append(
this);
38 const int i = mediaPlayers->indexOf(
this);
40 mediaPlayers->remove(
i);
45 mMediaPlayer.callMethod<
void>(
"release");
50 mMediaPlayer.callMethod<
void>(
"reset");
55 return mMediaPlayer.callMethod<jint>(
"getCurrentPosition");
60 return mMediaPlayer.callMethod<jint>(
"getDuration");
65 return mMediaPlayer.callMethod<jboolean>(
"isPlaying");
70 return mMediaPlayer.callMethod<jint>(
"getVolume");
75 return mMediaPlayer.callMethod<jboolean>(
"isMuted");
82 if (QNativeInterface::QAndroidApplication::sdkVersion() < 23)
86 "()Landroid/media/MediaPlayer;");
89 "()Landroid/media/PlaybackParams;");
90 if (playbackParams.isValid()) {
92 auto methodId = env->GetMethodID(playbackParams.objectClass(),
"getSpeed",
"()F");
93 const qreal speed = env->CallFloatMethod(playbackParams.object(), methodId);
94 if (!env.checkAndClearExceptions())
104 return mMediaPlayer.callObjectMethod(
"display",
"()Landroid/view/SurfaceHolder;").object();
109 const QLatin1String unknownMimeType(
"application/octet-stream");
112 if (!androidTrackInfo.isValid())
117 auto methodId = env->GetMethodID(androidTrackInfo.objectClass(),
"getType",
"()I");
118 const jint
type = env->CallIntMethod(androidTrackInfo.object(), methodId);
119 if (env.checkAndClearExceptions())
123 if (type < 0 || type > 5) {
130 auto languageObject = androidTrackInfo.callObjectMethod(
"getLanguage",
"()Ljava/lang/String;");
131 QString language = languageObject.isValid() ? languageObject.toString() : undefinedLanguage;
133 auto mimeTypeObject = androidTrackInfo.callObjectMethod(
"getMime",
"()Ljava/lang/String;");
134 QString mimeType = mimeTypeObject.isValid() ? mimeTypeObject.toString() : unknownMimeType;
141 auto androidTracksInfoObject = mMediaPlayer.callObjectMethod(
143 "()[Lorg/qtproject/qt/android/multimedia/QtAndroidMediaPlayer$TrackInfo;");
145 if (!androidTracksInfoObject.isValid())
148 auto androidTracksInfo = androidTracksInfoObject.object<jobjectArray>();
149 if (!androidTracksInfo)
153 auto numberofTracks = environment->GetArrayLength(androidTracksInfo);
158 auto androidTrackInformation = environment->GetObjectArrayElement(androidTracksInfo,
index);
160 if (environment.checkAndClearExceptions()) {
167 environment->DeleteLocalRef(androidTrackInformation);
170 return tracksInformation;
175 int type =
static_cast<int>(androidTrackType);
176 return mMediaPlayer.callMethod<jint>(
"getSelectedTrack",
"(I)I",
type);
181 mMediaPlayer.callMethod<
void>(
"deselectTrack",
"(I)V", trackNumber);
186 mMediaPlayer.callMethod<
void>(
"selectTrack",
"(I)V", trackNumber);
191 mMediaPlayer.callMethod<
void>(
"start");
196 mMediaPlayer.callMethod<
void>(
"pause");
201 mMediaPlayer.callMethod<
void>(
"stop");
206 mMediaPlayer.callMethod<
void>(
"seekTo",
"(I)V", jint(msec));
214 mMediaPlayer.callMethod<
void>(
"mute",
"(Z)V", jboolean(mute));
221 mMediaPlayer.callMethod<
void>(
"initHeaders",
"()V");
224 mMediaPlayer.callMethod<
void>(
"setHeader",
"(Ljava/lang/String;Ljava/lang/String;)V",
229 mMediaPlayer.callMethod<
void>(
"setDataSource",
"(Ljava/lang/String;)V",
string.object());
234 mMediaPlayer.callMethod<
void>(
"prepareAsync");
242 mMediaPlayer.callMethod<
void>(
"setVolume",
"(I)V", jint(
volume));
247 mAudioBlocked =
true;
252 mAudioBlocked =
false;
257 QJniObject::callStaticMethod<void>(
"org/qtproject/qt/android/multimedia/QtAudioDeviceManager",
258 "startSoundStreaming",
265 QJniObject::callStaticMethod<void>(
266 "org/qtproject/qt/android/multimedia/QtAudioDeviceManager",
"stopSoundStreaming");
271 if (QNativeInterface::QAndroidApplication::sdkVersion() < 23) {
272 qWarning() <<
"Setting the playback rate on a media player requires"
273 <<
"Android 6.0 (API level 23) or later";
277 return mMediaPlayer.callMethod<jboolean>(
"setPlaybackRate", jfloat(
rate));
282 mMediaPlayer.callMethod<
void>(
"setDisplay",
283 "(Landroid/view/SurfaceHolder;)V",
289 const bool ret = QJniObject::callStaticMethod<jboolean>(
290 "org/qtproject/qt/android/multimedia/QtAudioDeviceManager",
296 qCWarning(lcAudio) <<
"Output device not set";
302void AndroidMediaPlayer::setAudioRole(QAudio::Role role)
306 case QAudio::MusicRole:
309 case QAudio::VideoRole:
312 case QAudio::VoiceCommunicationRole:
315 case QAudio::AlarmRole:
318 case QAudio::NotificationRole:
321 case QAudio::RingtoneRole:
324 case QAudio::AccessibilityRole:
327 case QAudio::SonificationRole:
330 case QAudio::GameRole:
352 else if (
r ==
QLatin1String(
"USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"))
364 else if (
r ==
QLatin1String(
"USAGE_NOTIFICATION_COMMUNICATION_DELAYED"))
366 else if (
r ==
QLatin1String(
"USAGE_NOTIFICATION_COMMUNICATION_INSTANT"))
368 else if (
r ==
QLatin1String(
"USAGE_NOTIFICATION_COMMUNICATION_REQUEST"))
376 else if (
r ==
QLatin1String(
"USAGE_VOICE_COMMUNICATION_SIGNALLING"))
379 mMediaPlayer.callMethod<
void>(
"setAudioAttributes",
"(II)V", jint(
type), jint(
usage));
383static void onErrorNative(JNIEnv *env, jobject thiz, jint what, jint extra, jlong
id)
392 Q_EMIT (*mediaPlayers)[
i]->error(what, extra);
404 Q_EMIT (*mediaPlayers)[
i]->bufferingChanged(percent);
416 Q_EMIT (*mediaPlayers)[
i]->progressChanged(progress);
428 Q_EMIT (*mediaPlayers)[
i]->durationChanged(duration);
431static void onInfoNative(JNIEnv *env, jobject thiz, jint what, jint extra, jlong
id)
440 Q_EMIT (*mediaPlayers)[
i]->info(what, extra);
474 if (!mediaplayer || !mediaPlayers->contains(mediaplayer))
490 emit mediaplayer->tracksInfoChanged();
507 if (timedText !=
nullptr)
510 emit mediaplayer->timedTextChanged(subtitleText);
515 static const JNINativeMethod
methods[] = {
516 {
"onErrorNative",
"(IIJ)V",
reinterpret_cast<void *
>(
onErrorNative) },
520 {
"onInfoNative",
"(IIJ)V",
reinterpret_cast<void *
>(
onInfoNative) },
521 {
"onVideoSizeChangedNative",
"(IIJ)V",
525 {
"onTimedTextChangedNative",
"(Ljava/lang/String;IJ)V",
535#include "moc_androidmediaplayer_p.cpp"
static JNINativeMethod methods[]
int toInt(bool *ok=nullptr, int base=10) const
Returns the byte array converted to an int using base base, which is ten by default.
iterator insert(qsizetype i, parameter_type t)
The QNetworkRequest class holds a request to be sent with QNetworkAccessManager.
QList< QByteArray > rawHeaderList() const
Returns a list of all raw headers that are set in this network request.
QUrl url() const
Returns the URL this network request is referring to.
QByteArray rawHeader(const QByteArray &headerName) const
Returns the raw form of header headerName.
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString toString(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
Combined button and popup list for selecting options.
static QString header(const QString &name)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
static ControlElement< T > * ptr(QWidget *widget)
GLint GLsizei GLsizei height
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLsizeiptr const void GLenum usage
QLatin1StringView QLatin1String
QNetworkRequest request(url)