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
6109a0eb
authored
Mar 16, 2023
by
tianyifeng
Committed by
microkatz
Mar 21, 2023
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Intercept audio capabilities change in `DefaultAudioSink`
PiperOrigin-RevId: 517144710
parent
841c5477
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
52 additions
and
9 deletions
RELEASENOTES.md
libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java
libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java
RELEASENOTES.md
View file @
6109a0eb
...
@@ -19,6 +19,11 @@
...
@@ -19,6 +19,11 @@
*
Extrapolate current position during sleep with offload scheduling.
*
Extrapolate current position during sleep with offload scheduling.
*
Add
`Renderer.release()`
and
`AudioSink.release()`
for releasing the
*
Add
`Renderer.release()`
and
`AudioSink.release()`
for releasing the
resources at the end of player's lifecycle.
resources at the end of player's lifecycle.
*
Listen to audio capabilities changes in
`DefaultAudioSink`
. Add a
required parameter
`context`
in the constructor of
`DefaultAudioSink`
,
with which the
`DefaultAudioSink`
will register as the listener to the
`AudioCapabilitiesReceiver`
and update its
`audioCapabilities`
property
when informed with a capabilities change.
*
DRM:
*
DRM:
*
Reduce the visibility of several internal-only methods on
*
Reduce the visibility of several internal-only methods on
`DefaultDrmSession`
that aren't expected to be called from outside the
`DefaultDrmSession`
that aren't expected to be called from outside the
...
...
libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java
View file @
6109a0eb
...
@@ -26,7 +26,6 @@ import androidx.annotation.IntDef;
...
@@ -26,7 +26,6 @@ import androidx.annotation.IntDef;
import
androidx.annotation.Nullable
;
import
androidx.annotation.Nullable
;
import
androidx.media3.common.util.Log
;
import
androidx.media3.common.util.Log
;
import
androidx.media3.common.util.UnstableApi
;
import
androidx.media3.common.util.UnstableApi
;
import
androidx.media3.exoplayer.audio.AudioCapabilities
;
import
androidx.media3.exoplayer.audio.AudioRendererEventListener
;
import
androidx.media3.exoplayer.audio.AudioRendererEventListener
;
import
androidx.media3.exoplayer.audio.AudioSink
;
import
androidx.media3.exoplayer.audio.AudioSink
;
import
androidx.media3.exoplayer.audio.DefaultAudioSink
;
import
androidx.media3.exoplayer.audio.DefaultAudioSink
;
...
@@ -649,8 +648,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
...
@@ -649,8 +648,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
boolean
enableFloatOutput
,
boolean
enableFloatOutput
,
boolean
enableAudioTrackPlaybackParams
,
boolean
enableAudioTrackPlaybackParams
,
boolean
enableOffload
)
{
boolean
enableOffload
)
{
return
new
DefaultAudioSink
.
Builder
()
return
new
DefaultAudioSink
.
Builder
(
context
)
.
setAudioCapabilities
(
AudioCapabilities
.
getCapabilities
(
context
))
.
setEnableFloatOutput
(
enableFloatOutput
)
.
setEnableFloatOutput
(
enableFloatOutput
)
.
setEnableAudioTrackPlaybackParams
(
enableAudioTrackPlaybackParams
)
.
setEnableAudioTrackPlaybackParams
(
enableAudioTrackPlaybackParams
)
.
setOffloadMode
(
.
setOffloadMode
(
...
...
libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java
View file @
6109a0eb
...
@@ -24,6 +24,7 @@ import static java.lang.Math.min;
...
@@ -24,6 +24,7 @@ import static java.lang.Math.min;
import
static
java
.
lang
.
annotation
.
ElementType
.
TYPE_USE
;
import
static
java
.
lang
.
annotation
.
ElementType
.
TYPE_USE
;
import
android.annotation.SuppressLint
;
import
android.annotation.SuppressLint
;
import
android.content.Context
;
import
android.media.AudioDeviceInfo
;
import
android.media.AudioDeviceInfo
;
import
android.media.AudioFormat
;
import
android.media.AudioFormat
;
import
android.media.AudioManager
;
import
android.media.AudioManager
;
...
@@ -227,6 +228,7 @@ public final class DefaultAudioSink implements AudioSink {
...
@@ -227,6 +228,7 @@ public final class DefaultAudioSink implements AudioSink {
/** A builder to create {@link DefaultAudioSink} instances. */
/** A builder to create {@link DefaultAudioSink} instances. */
public
static
final
class
Builder
{
public
static
final
class
Builder
{
@Nullable
private
final
Context
context
;
private
AudioCapabilities
audioCapabilities
;
private
AudioCapabilities
audioCapabilities
;
@Nullable
private
androidx
.
media3
.
common
.
audio
.
AudioProcessorChain
audioProcessorChain
;
@Nullable
private
androidx
.
media3
.
common
.
audio
.
AudioProcessorChain
audioProcessorChain
;
private
boolean
enableFloatOutput
;
private
boolean
enableFloatOutput
;
...
@@ -235,19 +237,34 @@ public final class DefaultAudioSink implements AudioSink {
...
@@ -235,19 +237,34 @@ public final class DefaultAudioSink implements AudioSink {
AudioTrackBufferSizeProvider
audioTrackBufferSizeProvider
;
AudioTrackBufferSizeProvider
audioTrackBufferSizeProvider
;
@Nullable
AudioOffloadListener
audioOffloadListener
;
@Nullable
AudioOffloadListener
audioOffloadListener
;
/** Creates a new builder. */
/**
* @deprecated Use {@link #Builder(Context)} instead.
*/
@Deprecated
public
Builder
()
{
public
Builder
()
{
this
(
/* context= */
null
);
}
/**
* Creates a new builder.
*
* @param context The {@link Context}.
*/
public
Builder
(
@Nullable
Context
context
)
{
this
.
context
=
context
;
audioCapabilities
=
DEFAULT_AUDIO_CAPABILITIES
;
audioCapabilities
=
DEFAULT_AUDIO_CAPABILITIES
;
offloadMode
=
OFFLOAD_MODE_DISABLED
;
offloadMode
=
OFFLOAD_MODE_DISABLED
;
audioTrackBufferSizeProvider
=
AudioTrackBufferSizeProvider
.
DEFAULT
;
audioTrackBufferSizeProvider
=
AudioTrackBufferSizeProvider
.
DEFAULT
;
}
}
/**
/**
* Sets audio capabilities for playback on this device. May be {@code null} if the default
* @deprecated The {@linkplain AudioCapabilities audio capabilities} set to the {@linkplain
* capabilities (no encoded audio passthrough support) should be assumed.
* Builder builder} will be effective for the {@link DefaultAudioSink} only in the absence
*
* of {@linkplain Context context}. If the {@code Context} is {@code null} and the {@code
* <p>Default is {@link AudioCapabilities#DEFAULT_AUDIO_CAPABILITIES}.
* audioCapabilities} is not set to the {@code Builder}, the default capabilities (no
* encoded audio passthrough support) should be assumed.
*/
*/
@Deprecated
@CanIgnoreReturnValue
@CanIgnoreReturnValue
public
Builder
setAudioCapabilities
(
AudioCapabilities
audioCapabilities
)
{
public
Builder
setAudioCapabilities
(
AudioCapabilities
audioCapabilities
)
{
checkNotNull
(
audioCapabilities
);
checkNotNull
(
audioCapabilities
);
...
@@ -483,6 +500,7 @@ public final class DefaultAudioSink implements AudioSink {
...
@@ -483,6 +500,7 @@ public final class DefaultAudioSink implements AudioSink {
private
final
PendingExceptionHolder
<
WriteException
>
writeExceptionPendingExceptionHolder
;
private
final
PendingExceptionHolder
<
WriteException
>
writeExceptionPendingExceptionHolder
;
private
final
AudioTrackBufferSizeProvider
audioTrackBufferSizeProvider
;
private
final
AudioTrackBufferSizeProvider
audioTrackBufferSizeProvider
;
@Nullable
private
final
AudioOffloadListener
audioOffloadListener
;
@Nullable
private
final
AudioOffloadListener
audioOffloadListener
;
@Nullable
private
final
AudioCapabilitiesReceiver
audioCapabilitiesReceiver
;
@Nullable
private
PlayerId
playerId
;
@Nullable
private
PlayerId
playerId
;
@Nullable
private
Listener
listener
;
@Nullable
private
Listener
listener
;
...
@@ -532,7 +550,14 @@ public final class DefaultAudioSink implements AudioSink {
...
@@ -532,7 +550,14 @@ public final class DefaultAudioSink implements AudioSink {
@RequiresNonNull
(
"#1.audioProcessorChain"
)
@RequiresNonNull
(
"#1.audioProcessorChain"
)
private
DefaultAudioSink
(
Builder
builder
)
{
private
DefaultAudioSink
(
Builder
builder
)
{
audioCapabilities
=
builder
.
audioCapabilities
;
audioCapabilitiesReceiver
=
builder
.
context
!=
null
?
new
AudioCapabilitiesReceiver
(
builder
.
context
,
this
::
onAudioCapabilitiesChanged
)
:
null
;
audioCapabilities
=
audioCapabilitiesReceiver
!=
null
?
audioCapabilitiesReceiver
.
register
()
:
builder
.
audioCapabilities
;
audioProcessorChain
=
builder
.
audioProcessorChain
;
audioProcessorChain
=
builder
.
audioProcessorChain
;
enableFloatOutput
=
Util
.
SDK_INT
>=
21
&&
builder
.
enableFloatOutput
;
enableFloatOutput
=
Util
.
SDK_INT
>=
21
&&
builder
.
enableFloatOutput
;
preferAudioTrackPlaybackParams
=
Util
.
SDK_INT
>=
23
&&
builder
.
enableAudioTrackPlaybackParams
;
preferAudioTrackPlaybackParams
=
Util
.
SDK_INT
>=
23
&&
builder
.
enableAudioTrackPlaybackParams
;
...
@@ -1431,6 +1456,21 @@ public final class DefaultAudioSink implements AudioSink {
...
@@ -1431,6 +1456,21 @@ public final class DefaultAudioSink implements AudioSink {
offloadDisabledUntilNextConfiguration
=
false
;
offloadDisabledUntilNextConfiguration
=
false
;
}
}
@Override
public
void
release
()
{
if
(
audioCapabilitiesReceiver
!=
null
)
{
audioCapabilitiesReceiver
.
unregister
();
}
}
// AudioCapabilitiesReceiver.Listener implementation.
public
void
onAudioCapabilitiesChanged
(
AudioCapabilities
audioCapabilities
)
{
if
(!
audioCapabilities
.
equals
(
this
.
audioCapabilities
))
{
this
.
audioCapabilities
=
audioCapabilities
;
}
}
// Internal methods.
// Internal methods.
private
void
resetSinkStateForFlush
()
{
private
void
resetSinkStateForFlush
()
{
...
...
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