4package org.qtproject.qt.android.multimedia;
6import java.io.IOException;
7import java.lang.String;
8import java.util.HashMap;
9import java.io.FileInputStream;
12import android.content.Context;
13import android.media.MediaPlayer;
14import android.media.MediaFormat;
15import android.media.PlaybackParams;
16import android.media.AudioAttributes;
17import android.media.TimedText;
18import android.net.Uri;
19import android.util.Log;
20import java.io.FileDescriptor;
21import android.content.res.AssetFileDescriptor;
22import android.content.res.AssetManager;
23import android.view.SurfaceHolder;
25import java.util.concurrent.Executors;
26import java.util.concurrent.ScheduledExecutorService;
27import java.util.concurrent.ScheduledFuture;
28import java.util.concurrent.TimeUnit;
44 private MediaPlayer mMediaPlayer =
null;
45 private AudioAttributes mAudioAttributes =
null;
46 private HashMap<String, String> mHeaders =
null;
47 private Uri mUri =
null;
48 private final long mID;
49 private final Context mContext;
50 private boolean mMuted =
false;
51 private int mVolume = 100;
52 private static final String TAG =
"Qt MediaPlayer";
53 private SurfaceHolder mSurfaceHolder =
null;
54 private ScheduledExecutorService mProgressScheduler =
null;
55 private ScheduledFuture mProgressWatcherHandle =
null;
58 final static int Uninitialized = 0x1 ;
59 final static int Idle = 0x2;
60 final static int Preparing = 0x4;
61 final static int Prepared = 0x8;
62 final static int Initialized = 0x10;
63 final static int Started = 0x20;
64 final static int Stopped = 0x40;
65 final static int Paused = 0x80;
66 final static int PlaybackCompleted = 0x100;
67 final static int Error = 0x200;
82 int getType() {
return this.type; }
83 String getMime() {
return this.mime; }
84 String getLanguage() {
return this.language; }
87 private volatile int mState =
State.Uninitialized;
92 private class MediaPlayerErrorListener
93 implements MediaPlayer.OnErrorListener
96 public boolean onError(
final MediaPlayer mp,
100 setState(
State.Error);
109 private class MediaPlayerBufferingListener
110 implements MediaPlayer.OnBufferingUpdateListener
112 private int mBufferPercent = -1;
114 public void onBufferingUpdate(
final android.media.MediaPlayer mp,
119 if (mBufferPercent == percent)
130 private class MediaPlayerCompletionListener
131 implements MediaPlayer.OnCompletionListener
134 public void onCompletion(
final MediaPlayer mp)
136 setState(
State.PlaybackCompleted);
144 private class MediaPlayerInfoListener
145 implements MediaPlayer.OnInfoListener
148 public boolean onInfo(
final MediaPlayer mp,
161 private class MediaPlayerPreparedListener
162 implements MediaPlayer.OnPreparedListener
166 public void onPrepared(
final MediaPlayer mp)
168 setState(
State.Prepared);
178 private class MediaPlayerSeekCompleteListener
179 implements MediaPlayer.OnSeekCompleteListener
183 public void onSeekComplete(
final MediaPlayer mp)
193 private class MediaPlayerVideoSizeChangedListener
194 implements MediaPlayer.OnVideoSizeChangedListener
198 public void onVideoSizeChanged(
final MediaPlayer mp,
207 private class MediaPlayerTimedTextListener
implements MediaPlayer.OnTimedTextListener
209 @Override
public void onTimedText(MediaPlayer mp, TimedText
text)
226 private void setState(
int state)
238 if (mMediaPlayer !=
null)
241 mMediaPlayer =
new MediaPlayer();
242 setState(
State.Idle);
244 setVolumeHelper(mMuted ? 0 : mVolume);
247 mMediaPlayer.setOnBufferingUpdateListener(
new MediaPlayerBufferingListener());
248 mMediaPlayer.setOnCompletionListener(
new MediaPlayerCompletionListener());
249 mMediaPlayer.setOnInfoListener(
new MediaPlayerInfoListener());
250 mMediaPlayer.setOnSeekCompleteListener(
new MediaPlayerSeekCompleteListener());
251 mMediaPlayer.setOnVideoSizeChangedListener(
new MediaPlayerVideoSizeChangedListener());
252 mMediaPlayer.setOnErrorListener(
new MediaPlayerErrorListener());
253 mMediaPlayer.setOnPreparedListener(
new MediaPlayerPreparedListener());
254 mMediaPlayer.setOnTimedTextListener(
new MediaPlayerTimedTextListener());
256 mProgressScheduler = Executors.newScheduledThreadPool(1);
262 if (mProgressScheduler.isTerminated() || mProgressScheduler ==
null)
263 mProgressScheduler = Executors.newScheduledThreadPool(1);
265 mProgressWatcherHandle = mProgressScheduler.scheduleAtFixedRate(
new Runnable() {
271 }, 10, 100, TimeUnit.MILLISECONDS);
276 if (mProgressScheduler !=
null)
277 mProgressScheduler.shutdown();
282 if ((mState & (
State.Prepared
285 |
State.PlaybackCompleted)) == 0) {
290 mMediaPlayer.start();
291 setState(
State.Started);
293 }
catch (
final IllegalStateException exception) {
300 if ((mState & (
State.Started |
State.Paused |
State.PlaybackCompleted)) == 0)
304 mMediaPlayer.pause();
305 setState(
State.Paused);
306 }
catch (
final IllegalStateException exception) {
314 if ((mState & (
State.Prepared
318 |
State.PlaybackCompleted)) == 0) {
324 setState(
State.Stopped);
326 }
catch (
final IllegalStateException exception) {
334 if ((mState & (
State.Prepared
337 |
State.PlaybackCompleted)) == 0) {
342 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
345 mMediaPlayer.seekTo(msec, MediaPlayer.SEEK_CLOSEST);
347 mMediaPlayer.seekTo(msec);
349 }
catch (
final IllegalStateException exception) {
356 boolean playing =
false;
357 if ((mState & (
State.Idle
363 |
State.PlaybackCompleted)) == 0) {
368 playing = mMediaPlayer.isPlaying();
369 }
catch (
final IllegalStateException exception) {
378 if ((mState & (
State.Initialized |
State.Stopped)) == 0)
382 mMediaPlayer.prepareAsync();
383 setState(
State.Preparing);
384 }
catch (
final IllegalStateException exception) {
391 mHeaders =
new HashMap<String, String>();
401 if (mState ==
State.Uninitialized)
404 if (mState !=
State.Idle)
408 if (mState !=
State.Idle) {
409 Log.w(
TAG,
"Trying to set data source of a media player that is not idle!");
413 if (mSurfaceHolder !=
null)
414 mMediaPlayer.setDisplay(mSurfaceHolder);
416 AssetFileDescriptor afd =
null;
417 FileInputStream fis =
null;
419 mUri = Uri.parse(
path);
420 if (mUri.getScheme().compareTo(
"assets") == 0) {
421 final String asset = mUri.getPath().substring(1 );
422 final AssetManager am = mContext.getAssets();
423 afd = am.openFd(asset);
424 final long offset = afd.getStartOffset();
425 final long length = afd.getLength();
426 FileDescriptor
fd = afd.getFileDescriptor();
428 }
else if (mUri.getScheme().compareTo(
"file") == 0) {
429 fis =
new FileInputStream(mUri.getPath());
430 FileDescriptor
fd = fis.getFD();
431 mMediaPlayer.setDataSource(
fd);
432 }
else if (mUri.getScheme().compareTo(
"content") == 0) {
433 mMediaPlayer.setDataSource(mContext, mUri, mHeaders);
435 mMediaPlayer.setDataSource(
path);
437 setState(
State.Initialized);
438 }
catch (
final Exception exception) {
446 }
catch (
final IOException ioe) { }
448 if ((mState &
State.Initialized) == 0) {
449 setState(
State.Error);
458 private boolean isMediaPlayerPrepared()
460 int preparedState = (State.Prepared | State.Started | State.Paused | State.Stopped
461 |
State.PlaybackCompleted);
462 return ((mState & preparedState) != 0);
467 if (!isMediaPlayerPrepared()) {
468 Log.w(
TAG,
"Trying to get track info of a media player that is not prepared!");
472 MediaPlayer.TrackInfo[] tracks =
new MediaPlayer.TrackInfo[0];
476 tracks = mMediaPlayer.getTrackInfo();
477 }
catch (
final IllegalStateException exception) {
481 int numberOfTracks = tracks.length;
486 MediaPlayer.TrackInfo track = tracks[
index];
488 int type = track.getTrackType();
489 String
mimeType = getMimeType(track);
490 String
language = track.getLanguage();
498 private String getMimeType(MediaPlayer.TrackInfo trackInfo)
502 String defaultMimeType =
"application/octet-stream";
506 MediaFormat mediaFormat = trackInfo.getFormat();
507 if (mediaFormat !=
null) {
508 mimeType = mediaFormat.getString(MediaFormat.KEY_MIME, defaultMimeType);
516 if (!isMediaPlayerPrepared()) {
517 Log.d(
TAG,
"Trying to select a track of a media player that is not prepared!");
522 mMediaPlayer.selectTrack(
index);
523 }
catch (
final IllegalStateException exception) {
530 if (!isMediaPlayerPrepared()) {
531 Log.d(
TAG,
"Trying to deselect track of a media player that is not prepared!");
537 mMediaPlayer.deselectTrack(
index);
538 }
catch (
final IllegalStateException exception) {
546 int InvalidTrack = -1;
547 if (!isMediaPlayerPrepared()) {
548 Log.d(
TAG,
"Trying to get the selected track of a media player that is not prepared!");
552 boolean isVideoTrackType = (
type == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_VIDEO);
553 boolean isAudioTrackType = (
type == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_AUDIO);
554 boolean isTimedTextTrackType = (
type == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT);
555 boolean isSubtitleTrackType = (
type == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE);
557 if (!(isVideoTrackType || isAudioTrackType || isSubtitleTrackType
558 || isTimedTextTrackType)) {
560 "Trying to get a selected track of a invalid type"
561 +
" Only Video,Audio, TimedText and Subtitle tracks are selectable.");
566 return mMediaPlayer.getSelectedTrack(
type);
567 }
catch (
final IllegalStateException exception) {
576 int currentPosition = 0;
577 if ((mState & (
State.Idle
583 |
State.PlaybackCompleted)) == 0) {
584 return currentPosition;
588 currentPosition = mMediaPlayer.getCurrentPosition();
589 }
catch (
final IllegalStateException exception) {
593 return currentPosition;
600 if ((mState & (
State.Prepared
604 |
State.PlaybackCompleted)) == 0) {
609 duration = mMediaPlayer.getDuration();
610 }
catch (
final IllegalStateException exception) {
628 setVolumeHelper(mVolume);
631 private void setVolumeHelper(
int volume)
633 if ((mState & (
State.Idle
639 |
State.PlaybackCompleted)) == 0) {
644 float newVolume = (float)volume / 100;
645 mMediaPlayer.setVolume(newVolume, newVolume);
646 }
catch (
final IllegalStateException exception) {
647 Log.w(TAG, exception);
653 return mSurfaceHolder;
660 if ((mState &
State.Uninitialized) != 0)
663 mMediaPlayer.setDisplay(mSurfaceHolder);
675 setVolumeHelper(
mute ? 0 : mVolume);
685 if (mState ==
State.Uninitialized) {
689 mMediaPlayer.reset();
690 setState(
State.Idle);
696 if (mMediaPlayer !=
null) {
697 mMediaPlayer.reset();
698 mMediaPlayer.release();
702 setState(
State.Uninitialized);
708 mAudioAttributes =
new AudioAttributes.Builder()
710 .setContentType(
type)
718 if (
player ==
null || attr ==
null)
722 player.setAudioAttributes(attr);
723 }
catch (
final IllegalArgumentException exception) {
724 Log.w(TAG, exception);
730 PlaybackParams playbackParams = mMediaPlayer.getPlaybackParams();
731 playbackParams.setSpeed(
rate);
735 playbackParams.setPitch(Math.abs(
rate));
738 mMediaPlayer.setPlaybackParams(playbackParams);
739 }
catch (IllegalStateException | IllegalArgumentException
e) {
740 Log.e(
TAG,
"Cannot set playback rate " +
rate +
" :" +
e.toString());
744 if ((mState &
State.Started) == 0 && mMediaPlayer.isPlaying()) {
745 setState(
State.Started);
static QString header(const QString &name)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLint GLsizei GLsizei height
GLenum GLuint GLenum GLsizei length
GLenum GLuint GLintptr offset
GLsizei const GLchar *const * path
GLsizeiptr const void GLenum usage
application x qt windows mime
[2]