mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Add dedicated EPII method to set volume
This means the volume is available in the internal player, which is a preparation step to moving the audio focus handling to the internal player too. PiperOrigin-RevId: 726880098 (cherry picked from commit ef9b6d212e74c304730161434200244183ae23e6)
This commit is contained in:
parent
8bd1db5f2c
commit
be76766f95
@ -37,7 +37,6 @@ import static androidx.media3.exoplayer.Renderer.MSG_SET_SKIP_SILENCE_ENABLED;
|
|||||||
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_EFFECTS;
|
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_EFFECTS;
|
||||||
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER;
|
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER;
|
||||||
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_OUTPUT_RESOLUTION;
|
import static androidx.media3.exoplayer.Renderer.MSG_SET_VIDEO_OUTPUT_RESOLUTION;
|
||||||
import static androidx.media3.exoplayer.Renderer.MSG_SET_VOLUME;
|
|
||||||
import static java.lang.Math.max;
|
import static java.lang.Math.max;
|
||||||
import static java.lang.Math.min;
|
import static java.lang.Math.min;
|
||||||
|
|
||||||
@ -1538,7 +1537,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.volume = volume;
|
this.volume = volume;
|
||||||
sendVolumeToRenderers();
|
sendVolumeToInternalPlayer();
|
||||||
float finalVolume = volume;
|
float finalVolume = volume;
|
||||||
listeners.sendEvent(EVENT_VOLUME_CHANGED, listener -> listener.onVolumeChanged(finalVolume));
|
listeners.sendEvent(EVENT_VOLUME_CHANGED, listener -> listener.onVolumeChanged(finalVolume));
|
||||||
}
|
}
|
||||||
@ -2737,9 +2736,9 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendVolumeToRenderers() {
|
private void sendVolumeToInternalPlayer() {
|
||||||
float scaledVolume = volume * audioFocusManager.getVolumeMultiplier();
|
float scaledVolume = volume * audioFocusManager.getVolumeMultiplier();
|
||||||
sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_VOLUME, scaledVolume);
|
internalPlayer.setVolume(scaledVolume);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updatePlayWhenReady(
|
private void updatePlayWhenReady(
|
||||||
@ -3224,7 +3223,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setVolumeMultiplier(float volumeMultiplier) {
|
public void setVolumeMultiplier(float volumeMultiplier) {
|
||||||
sendVolumeToRenderers();
|
sendVolumeToInternalPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -162,6 +162,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
private static final int MSG_PREPARE = 29;
|
private static final int MSG_PREPARE = 29;
|
||||||
private static final int MSG_SET_VIDEO_OUTPUT = 30;
|
private static final int MSG_SET_VIDEO_OUTPUT = 30;
|
||||||
private static final int MSG_SET_AUDIO_ATTRIBUTES = 31;
|
private static final int MSG_SET_AUDIO_ATTRIBUTES = 31;
|
||||||
|
private static final int MSG_SET_VOLUME = 32;
|
||||||
|
|
||||||
private static final long BUFFERING_MAXIMUM_INTERVAL_MS =
|
private static final long BUFFERING_MAXIMUM_INTERVAL_MS =
|
||||||
Util.usToMs(Renderer.DEFAULT_DURATION_TO_PROGRESS_US);
|
Util.usToMs(Renderer.DEFAULT_DURATION_TO_PROGRESS_US);
|
||||||
@ -455,6 +456,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
handler.obtainMessage(MSG_SET_AUDIO_ATTRIBUTES, audioAttributes).sendToTarget();
|
handler.obtainMessage(MSG_SET_AUDIO_ATTRIBUTES, audioAttributes).sendToTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setVolume(float volume) {
|
||||||
|
handler.obtainMessage(MSG_SET_VOLUME, volume).sendToTarget();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void sendMessage(PlayerMessage message) {
|
public synchronized void sendMessage(PlayerMessage message) {
|
||||||
if (released || !playbackLooper.getThread().isAlive()) {
|
if (released || !playbackLooper.getThread().isAlive()) {
|
||||||
@ -675,6 +680,9 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
case MSG_SET_AUDIO_ATTRIBUTES:
|
case MSG_SET_AUDIO_ATTRIBUTES:
|
||||||
setAudioAttributesInternal((AudioAttributes) msg.obj);
|
setAudioAttributesInternal((AudioAttributes) msg.obj);
|
||||||
break;
|
break;
|
||||||
|
case MSG_SET_VOLUME:
|
||||||
|
setVolumeInternal((Float) msg.obj);
|
||||||
|
break;
|
||||||
case MSG_RELEASE:
|
case MSG_RELEASE:
|
||||||
releaseInternal();
|
releaseInternal();
|
||||||
// Return immediately to not send playback info updates after release.
|
// Return immediately to not send playback info updates after release.
|
||||||
@ -948,6 +956,12 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
trackSelector.setAudioAttributes(audioAttributes);
|
trackSelector.setAudioAttributes(audioAttributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setVolumeInternal(float volume) throws ExoPlaybackException {
|
||||||
|
for (RendererHolder renderer : renderers) {
|
||||||
|
renderer.setVolume(volume);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void notifyTrackSelectionPlayWhenReadyChanged(boolean playWhenReady) {
|
private void notifyTrackSelectionPlayWhenReadyChanged(boolean playWhenReady) {
|
||||||
MediaPeriodHolder periodHolder = queue.getPlayingPeriod();
|
MediaPeriodHolder periodHolder = queue.getPlayingPeriod();
|
||||||
while (periodHolder != null) {
|
while (periodHolder != null) {
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package androidx.media3.exoplayer;
|
package androidx.media3.exoplayer;
|
||||||
|
|
||||||
|
import static androidx.media3.common.C.TRACK_TYPE_AUDIO;
|
||||||
import static androidx.media3.common.C.TRACK_TYPE_VIDEO;
|
import static androidx.media3.common.C.TRACK_TYPE_VIDEO;
|
||||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||||
import static androidx.media3.common.util.Assertions.checkState;
|
import static androidx.media3.common.util.Assertions.checkState;
|
||||||
@ -774,6 +775,17 @@ import java.util.Objects;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Sets the volume on the renderer. */
|
||||||
|
public void setVolume(float volume) throws ExoPlaybackException {
|
||||||
|
if (getTrackType() != TRACK_TYPE_AUDIO) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
primaryRenderer.handleMessage(Renderer.MSG_SET_VOLUME, volume);
|
||||||
|
if (secondaryRenderer != null) {
|
||||||
|
secondaryRenderer.handleMessage(Renderer.MSG_SET_VOLUME, volume);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isRendererEnabled() {
|
public boolean isRendererEnabled() {
|
||||||
boolean checkPrimary =
|
boolean checkPrimary =
|
||||||
prewarmingState == RENDERER_PREWARMING_STATE_NOT_PREWARMING_USING_PRIMARY
|
prewarmingState == RENDERER_PREWARMING_STATE_NOT_PREWARMING_USING_PRIMARY
|
||||||
|
Loading…
x
Reference in New Issue
Block a user