Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
1c6aaac9
authored
Jul 22, 2020
by
ibaker
Committed by
Oliver Woodman
Jul 24, 2020
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Merge playback speed into PlaybackInfo and update EPI and EPII
PiperOrigin-RevId: 322539001
parent
78260e20
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
98 additions
and
91 deletions
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java
library/core/src/main/java/com/google/android/exoplayer2/PlaybackInfo.java
library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java
library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java
View file @
1c6aaac9
...
...
@@ -22,7 +22,6 @@ import static com.google.android.exoplayer2.util.Util.castNonNull;
import
android.annotation.SuppressLint
;
import
android.os.Handler
;
import
android.os.Looper
;
import
android.os.Message
;
import
android.util.Pair
;
import
androidx.annotation.Nullable
;
import
com.google.android.exoplayer2.PlayerMessage.Target
;
...
...
@@ -67,7 +66,8 @@ import java.util.concurrent.TimeoutException;
private
final
Renderer
[]
renderers
;
private
final
TrackSelector
trackSelector
;
private
final
PlaybackUpdateListenerImpl
playbackUpdateListener
;
private
final
Handler
playbackInfoUpdateHandler
;
private
final
ExoPlayerImplInternal
.
PlaybackInfoUpdateListener
playbackInfoUpdateListener
;
private
final
ExoPlayerImplInternal
internalPlayer
;
private
final
Handler
internalPlayerHandler
;
private
final
CopyOnWriteArrayList
<
ListenerHolder
>
listeners
;
...
...
@@ -87,8 +87,6 @@ import java.util.concurrent.TimeoutException;
@DiscontinuityReason
private
int
pendingDiscontinuityReason
;
@PlayWhenReadyChangeReason
private
int
pendingPlayWhenReadyChangeReason
;
private
boolean
foregroundMode
;
private
int
pendingSetPlaybackSpeedAcks
;
private
float
playbackSpeed
;
private
SeekParameters
seekParameters
;
private
ShuffleOrder
shuffleOrder
;
private
boolean
pauseAtEndOfMediaItems
;
...
...
@@ -155,9 +153,11 @@ import java.util.concurrent.TimeoutException;
new
TrackSelection
[
renderers
.
length
],
null
);
period
=
new
Timeline
.
Period
();
playbackSpeed
=
Player
.
DEFAULT_PLAYBACK_SPEED
;
maskingWindowIndex
=
C
.
INDEX_UNSET
;
playbackUpdateListener
=
new
PlaybackUpdateListenerImpl
(
applicationLooper
);
playbackInfoUpdateHandler
=
new
Handler
(
applicationLooper
);
playbackInfoUpdateListener
=
playbackInfoUpdate
->
playbackInfoUpdateHandler
.
post
(()
->
handlePlaybackInfo
(
playbackInfoUpdate
));
playbackInfo
=
PlaybackInfo
.
createDummy
(
emptyTrackSelectorResult
);
pendingListenerNotifications
=
new
ArrayDeque
<>();
if
(
analyticsCollector
!=
null
)
{
...
...
@@ -179,7 +179,7 @@ import java.util.concurrent.TimeoutException;
pauseAtEndOfMediaItems
,
applicationLooper
,
clock
,
playbackUpdateListener
);
playback
Info
UpdateListener
);
internalPlayerHandler
=
new
Handler
(
internalPlayer
.
getPlaybackLooper
());
}
...
...
@@ -595,7 +595,7 @@ import java.util.concurrent.TimeoutException;
// general because the midroll ad preceding the seek destination must be played before the
// content position can be played, if a different ad is playing at the moment.
Log
.
w
(
TAG
,
"seekTo ignored because an ad is playing"
);
playbackUpdateListener
.
onPlaybackInfoUpdate
(
playback
Info
UpdateListener
.
onPlaybackInfoUpdate
(
new
ExoPlayerImplInternal
.
PlaybackInfoUpdate
(
playbackInfo
));
return
;
}
...
...
@@ -632,30 +632,30 @@ import java.util.concurrent.TimeoutException;
@Deprecated
@Override
public
PlaybackParameters
getPlaybackParameters
()
{
return
new
PlaybackParameters
(
playbackSpeed
);
return
new
PlaybackParameters
(
playback
Info
.
playback
Speed
);
}
@SuppressWarnings
(
"deprecation"
)
@Override
public
void
setPlaybackSpeed
(
float
playbackSpeed
)
{
checkState
(
playbackSpeed
>
0
);
if
(
this
.
playbackSpeed
==
playbackSpeed
)
{
if
(
playbackInfo
.
playbackSpeed
==
playbackSpeed
)
{
return
;
}
pendingSetPlaybackSpeedAcks
++;
this
.
playbackSpeed
=
playbackSpeed
;
PlaybackParameters
playbackParameters
=
new
PlaybackParameters
(
playbackSpeed
);
PlaybackInfo
newPlaybackInfo
=
playbackInfo
.
copyWithPlaybackSpeed
(
playbackSpeed
);
pendingOperationAcks
++;
internalPlayer
.
setPlaybackSpeed
(
playbackSpeed
);
notifyListeners
(
listener
->
{
listener
.
onPlaybackParametersChanged
(
playbackParameters
);
listener
.
onPlaybackSpeedChanged
(
playbackSpeed
);
});
updatePlaybackInfo
(
newPlaybackInfo
,
/* positionDiscontinuity= */
false
,
/* ignored */
DISCONTINUITY_REASON_INTERNAL
,
/* ignored */
TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
,
/* ignored */
PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST
,
/* seekProcessed= */
false
);
}
@Override
public
float
getPlaybackSpeed
()
{
return
playbackSpeed
;
return
playback
Info
.
playback
Speed
;
}
@Override
...
...
@@ -726,7 +726,7 @@ import java.util.concurrent.TimeoutException;
ExoPlaybackException
.
createForUnexpected
(
new
RuntimeException
(
new
TimeoutException
(
"Player release timed out."
)))));
}
playback
UpdateListener
.
h
andler
.
removeCallbacksAndMessages
(
null
);
playback
InfoUpdateH
andler
.
removeCallbacksAndMessages
(
null
);
if
(
analyticsCollector
!=
null
)
{
bandwidthMeter
.
removeEventListener
(
analyticsCollector
);
}
...
...
@@ -896,23 +896,6 @@ import java.util.concurrent.TimeoutException;
return
mediaSources
;
}
@SuppressWarnings
(
"deprecation"
)
private
void
handlePlaybackSpeed
(
float
playbackSpeed
,
boolean
operationAck
)
{
if
(
operationAck
)
{
pendingSetPlaybackSpeedAcks
--;
}
if
(
pendingSetPlaybackSpeedAcks
==
0
)
{
if
(
this
.
playbackSpeed
!=
playbackSpeed
)
{
this
.
playbackSpeed
=
playbackSpeed
;
notifyListeners
(
listener
->
{
listener
.
onPlaybackParametersChanged
(
new
PlaybackParameters
(
playbackSpeed
));
listener
.
onPlaybackSpeedChanged
(
playbackSpeed
);
});
}
}
}
private
void
handlePlaybackInfo
(
ExoPlayerImplInternal
.
PlaybackInfoUpdate
playbackInfoUpdate
)
{
pendingOperationAcks
-=
playbackInfoUpdate
.
operationAcks
;
if
(
playbackInfoUpdate
.
positionDiscontinuity
)
{
...
...
@@ -996,7 +979,7 @@ import java.util.concurrent.TimeoutException;
PlaybackInfo
playbackInfo
,
PlaybackInfo
oldPlaybackInfo
,
boolean
positionDiscontinuity
,
int
positionDiscontinuityReason
,
@DiscontinuityReason
int
positionDiscontinuityReason
,
boolean
timelineChanged
)
{
Timeline
oldTimeline
=
oldPlaybackInfo
.
timeline
;
...
...
@@ -1360,49 +1343,6 @@ import java.util.concurrent.TimeoutException;
return
positionMs
;
}
private
final
class
PlaybackUpdateListenerImpl
implements
ExoPlayerImplInternal
.
PlaybackUpdateListener
,
Handler
.
Callback
{
private
static
final
int
MSG_PLAYBACK_INFO_CHANGED
=
0
;
private
static
final
int
MSG_PLAYBACK_SPEED_CHANGED
=
1
;
private
final
Handler
handler
;
private
PlaybackUpdateListenerImpl
(
Looper
applicationLooper
)
{
handler
=
Util
.
createHandler
(
applicationLooper
,
/* callback= */
this
);
}
@Override
public
void
onPlaybackInfoUpdate
(
ExoPlayerImplInternal
.
PlaybackInfoUpdate
playbackInfo
)
{
handler
.
obtainMessage
(
MSG_PLAYBACK_INFO_CHANGED
,
playbackInfo
).
sendToTarget
();
}
@Override
public
void
onPlaybackSpeedChange
(
float
playbackSpeed
,
boolean
acknowledgeCommand
)
{
handler
.
obtainMessage
(
MSG_PLAYBACK_SPEED_CHANGED
,
/* arg1= */
acknowledgeCommand
?
1
:
0
,
/* arg2= */
0
,
/* obj= */
playbackSpeed
)
.
sendToTarget
();
}
@Override
public
boolean
handleMessage
(
Message
msg
)
{
switch
(
msg
.
what
)
{
case
MSG_PLAYBACK_INFO_CHANGED:
handlePlaybackInfo
((
ExoPlayerImplInternal
.
PlaybackInfoUpdate
)
msg
.
obj
);
break
;
case
MSG_PLAYBACK_SPEED_CHANGED:
handlePlaybackSpeed
((
Float
)
msg
.
obj
,
/* operationAck= */
msg
.
arg1
!=
0
);
break
;
default
:
throw
new
IllegalStateException
();
}
return
true
;
}
}
private
static
final
class
PlaybackInfoUpdate
implements
Runnable
{
private
final
PlaybackInfo
playbackInfo
;
...
...
@@ -1424,6 +1364,7 @@ import java.util.concurrent.TimeoutException;
private
final
boolean
playWhenReadyChanged
;
private
final
boolean
playbackSuppressionReasonChanged
;
private
final
boolean
isPlayingChanged
;
private
final
boolean
playbackSpeedChanged
;
public
PlaybackInfoUpdate
(
PlaybackInfo
playbackInfo
,
...
...
@@ -1461,6 +1402,7 @@ import java.util.concurrent.TimeoutException;
playbackSuppressionReasonChanged
=
previousPlaybackInfo
.
playbackSuppressionReason
!=
playbackInfo
.
playbackSuppressionReason
;
isPlayingChanged
=
isPlaying
(
previousPlaybackInfo
)
!=
isPlaying
(
playbackInfo
);
playbackSpeedChanged
=
previousPlaybackInfo
.
playbackSpeed
!=
playbackInfo
.
playbackSpeed
;
}
@SuppressWarnings
(
"deprecation"
)
...
...
@@ -1526,6 +1468,15 @@ import java.util.concurrent.TimeoutException;
invokeAll
(
listenerSnapshot
,
listener
->
listener
.
onIsPlayingChanged
(
isPlaying
(
playbackInfo
)));
}
if
(
playbackSpeedChanged
)
{
PlaybackParameters
playbackParameters
=
new
PlaybackParameters
(
playbackInfo
.
playbackSpeed
);
invokeAll
(
listenerSnapshot
,
listener
->
{
listener
.
onPlaybackSpeedChanged
(
playbackInfo
.
playbackSpeed
);
listener
.
onPlaybackParametersChanged
(
playbackParameters
);
});
}
if
(
seekProcessed
)
{
invokeAll
(
listenerSnapshot
,
EventListener:
:
onSeekProcessed
);
}
...
...
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java
View file @
1c6aaac9
...
...
@@ -109,10 +109,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
}
}
public
interface
PlaybackUpdateListener
{
public
interface
Playback
Info
UpdateListener
{
void
onPlaybackInfoUpdate
(
ExoPlayerImplInternal
.
PlaybackInfoUpdate
playbackInfo
);
void
onPlaybackSpeedChange
(
float
playbackSpeed
,
boolean
acknowledgeCommand
);
}
// Internal messages
...
...
@@ -168,7 +166,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
private
final
DefaultMediaClock
mediaClock
;
private
final
ArrayList
<
PendingMessageInfo
>
pendingMessages
;
private
final
Clock
clock
;
private
final
Playback
UpdateListener
playback
UpdateListener
;
private
final
Playback
InfoUpdateListener
playbackInfo
UpdateListener
;
private
final
MediaPeriodQueue
queue
;
private
final
MediaSourceList
mediaSourceList
;
...
...
@@ -210,8 +208,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
boolean
pauseAtEndOfWindow
,
Looper
applicationLooper
,
Clock
clock
,
Playback
UpdateListener
playback
UpdateListener
)
{
this
.
playback
UpdateListener
=
playback
UpdateListener
;
Playback
InfoUpdateListener
playbackInfo
UpdateListener
)
{
this
.
playback
InfoUpdateListener
=
playbackInfo
UpdateListener
;
this
.
renderers
=
renderers
;
this
.
trackSelector
=
trackSelector
;
this
.
emptyTrackSelectorResult
=
emptyTrackSelectorResult
;
...
...
@@ -624,7 +622,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
private
void
maybeNotifyPlaybackInfoChanged
()
{
playbackInfoUpdate
.
setPlaybackInfo
(
playbackInfo
);
if
(
playbackInfoUpdate
.
hasPendingChange
)
{
playbackUpdateListener
.
onPlaybackInfoUpdate
(
playbackInfoUpdate
);
playback
Info
UpdateListener
.
onPlaybackInfoUpdate
(
playbackInfoUpdate
);
playbackInfoUpdate
=
new
PlaybackInfoUpdate
(
playbackInfo
);
}
}
...
...
@@ -1279,6 +1277,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
mediaPeriodId
,
playbackInfo
.
playWhenReady
,
playbackInfo
.
playbackSuppressionReason
,
playbackInfo
.
playbackSpeed
,
startPositionUs
,
/* totalBufferedDurationUs= */
0
,
startPositionUs
);
...
...
@@ -1964,7 +1963,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
private
void
handlePlaybackSpeed
(
float
playbackSpeed
,
boolean
acknowledgeCommand
)
throws
ExoPlaybackException
{
playbackUpdateListener
.
onPlaybackSpeedChange
(
playbackSpeed
,
acknowledgeCommand
);
playbackInfoUpdate
.
incrementPendingOperationAcks
(
acknowledgeCommand
?
1
:
0
);
playbackInfo
=
playbackInfo
.
copyWithPlaybackSpeed
(
playbackSpeed
);
updateTrackSelectionPlaybackSpeed
(
playbackSpeed
);
for
(
Renderer
renderer
:
renderers
)
{
if
(
renderer
!=
null
)
{
...
...
library/core/src/main/java/com/google/android/exoplayer2/PlaybackInfo.java
View file @
1c6aaac9
...
...
@@ -63,6 +63,8 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
public
final
boolean
playWhenReady
;
/** Reason why playback is suppressed even though {@link #playWhenReady} is {@code true}. */
@PlaybackSuppressionReason
public
final
int
playbackSuppressionReason
;
/** The playback speed. */
public
final
float
playbackSpeed
;
/**
* Position up to which media is buffered in {@link #loadingMediaPeriodId) relative to the start
...
...
@@ -101,6 +103,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
PLACEHOLDER_MEDIA_PERIOD_ID
,
/* playWhenReady= */
false
,
Player
.
PLAYBACK_SUPPRESSION_REASON_NONE
,
Player
.
DEFAULT_PLAYBACK_SPEED
,
/* bufferedPositionUs= */
0
,
/* totalBufferedDurationUs= */
0
,
/* positionUs= */
0
);
...
...
@@ -133,6 +136,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
MediaPeriodId
loadingMediaPeriodId
,
boolean
playWhenReady
,
@PlaybackSuppressionReason
int
playbackSuppressionReason
,
float
playbackSpeed
,
long
bufferedPositionUs
,
long
totalBufferedDurationUs
,
long
positionUs
)
{
...
...
@@ -147,6 +151,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
this
.
loadingMediaPeriodId
=
loadingMediaPeriodId
;
this
.
playWhenReady
=
playWhenReady
;
this
.
playbackSuppressionReason
=
playbackSuppressionReason
;
this
.
playbackSpeed
=
playbackSpeed
;
this
.
bufferedPositionUs
=
bufferedPositionUs
;
this
.
totalBufferedDurationUs
=
totalBufferedDurationUs
;
this
.
positionUs
=
positionUs
;
...
...
@@ -190,6 +195,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
loadingMediaPeriodId
,
playWhenReady
,
playbackSuppressionReason
,
playbackSpeed
,
bufferedPositionUs
,
totalBufferedDurationUs
,
positionUs
);
...
...
@@ -215,6 +221,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
loadingMediaPeriodId
,
playWhenReady
,
playbackSuppressionReason
,
playbackSpeed
,
bufferedPositionUs
,
totalBufferedDurationUs
,
positionUs
);
...
...
@@ -240,6 +247,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
loadingMediaPeriodId
,
playWhenReady
,
playbackSuppressionReason
,
playbackSpeed
,
bufferedPositionUs
,
totalBufferedDurationUs
,
positionUs
);
...
...
@@ -265,6 +273,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
loadingMediaPeriodId
,
playWhenReady
,
playbackSuppressionReason
,
playbackSpeed
,
bufferedPositionUs
,
totalBufferedDurationUs
,
positionUs
);
...
...
@@ -290,6 +299,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
loadingMediaPeriodId
,
playWhenReady
,
playbackSuppressionReason
,
playbackSpeed
,
bufferedPositionUs
,
totalBufferedDurationUs
,
positionUs
);
...
...
@@ -315,6 +325,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
loadingMediaPeriodId
,
playWhenReady
,
playbackSuppressionReason
,
playbackSpeed
,
bufferedPositionUs
,
totalBufferedDurationUs
,
positionUs
);
...
...
@@ -344,6 +355,33 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
loadingMediaPeriodId
,
playWhenReady
,
playbackSuppressionReason
,
playbackSpeed
,
bufferedPositionUs
,
totalBufferedDurationUs
,
positionUs
);
}
/**
* Copies playback info with new playback speed.
*
* @param playbackSpeed New playback speed. See {@link #playbackSpeed}.
* @return Copied playback info with new playback speed.
*/
@CheckResult
public
PlaybackInfo
copyWithPlaybackSpeed
(
float
playbackSpeed
)
{
return
new
PlaybackInfo
(
timeline
,
periodId
,
requestedContentPositionUs
,
playbackState
,
playbackError
,
isLoading
,
trackGroups
,
trackSelectorResult
,
loadingMediaPeriodId
,
playWhenReady
,
playbackSuppressionReason
,
playbackSpeed
,
bufferedPositionUs
,
totalBufferedDurationUs
,
positionUs
);
...
...
library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java
View file @
1c6aaac9
...
...
@@ -62,6 +62,7 @@ import com.google.android.exoplayer2.source.TrackGroupArray;
import
com.google.android.exoplayer2.source.ads.AdPlaybackState
;
import
com.google.android.exoplayer2.source.ads.AdsLoader
;
import
com.google.android.exoplayer2.source.ads.AdsMediaSource
;
import
com.google.android.exoplayer2.testutil.Action
;
import
com.google.android.exoplayer2.testutil.ActionSchedule
;
import
com.google.android.exoplayer2.testutil.ActionSchedule.PlayerRunnable
;
import
com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget
;
...
...
@@ -82,6 +83,7 @@ import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinit
import
com.google.android.exoplayer2.testutil.FakeTrackSelection
;
import
com.google.android.exoplayer2.testutil.FakeTrackSelector
;
import
com.google.android.exoplayer2.testutil.TestExoPlayer
;
import
com.google.android.exoplayer2.trackselection.DefaultTrackSelector
;
import
com.google.android.exoplayer2.trackselection.TrackSelection
;
import
com.google.android.exoplayer2.trackselection.TrackSelectionArray
;
import
com.google.android.exoplayer2.upstream.Allocation
;
...
...
@@ -3333,15 +3335,29 @@ public final class ExoPlayerTest {
}
@Test
public
void
setPlaybackParametersConsecutivelyNotifiesListenerForEveryChangeOnce
()
public
void
setPlaybackParametersConsecutivelyNotifiesListenerForEveryChangeOnce
AndIsMasked
()
throws
Exception
{
List
<
Float
>
maskedPlaybackSpeeds
=
new
ArrayList
<>();
Action
getPlaybackSpeedAction
=
new
Action
(
"getPlaybackSpeed"
,
/* description= */
null
)
{
@Override
protected
void
doActionImpl
(
SimpleExoPlayer
player
,
DefaultTrackSelector
trackSelector
,
@Nullable
Surface
surface
)
{
maskedPlaybackSpeeds
.
add
(
player
.
getPlaybackSpeed
());
}
};
ActionSchedule
actionSchedule
=
new
ActionSchedule
.
Builder
(
TAG
)
.
pause
()
.
waitForPlaybackState
(
Player
.
STATE_READY
)
.
setPlaybackSpeed
(
1.1f
)
.
apply
(
getPlaybackSpeedAction
)
.
setPlaybackSpeed
(
1.2f
)
.
apply
(
getPlaybackSpeedAction
)
.
setPlaybackSpeed
(
1.3f
)
.
apply
(
getPlaybackSpeedAction
)
.
play
()
.
build
();
List
<
Float
>
reportedPlaybackSpeeds
=
new
ArrayList
<>();
...
...
@@ -3360,6 +3376,7 @@ public final class ExoPlayerTest {
.
blockUntilEnded
(
TIMEOUT_MS
);
assertThat
(
reportedPlaybackSpeeds
).
containsExactly
(
1.1f
,
1.2f
,
1.3f
).
inOrder
();
assertThat
(
maskedPlaybackSpeeds
).
isEqualTo
(
reportedPlaybackSpeeds
);
}
@Test
...
...
library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java
View file @
1c6aaac9
...
...
@@ -437,6 +437,7 @@ public final class MediaPeriodQueueTest {
/* loadingMediaPeriodId= */
null
,
/* playWhenReady= */
false
,
Player
.
PLAYBACK_SUPPRESSION_REASON_NONE
,
/* playbackSpeed= */
Player
.
DEFAULT_PLAYBACK_SPEED
,
/* bufferedPositionUs= */
0
,
/* totalBufferedDurationUs= */
0
,
/* positionUs= */
0
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment