/** * Sets the stream type for audio playback, used by the underlying audio track. * <p> * Setting the stream type during playback may introduce a short gap in audio output as the audio * track is recreated. A new audio session id will also be generated. * <p> * Calling this method overwrites any attributes set previously by calling * {@link #setAudioAttributes(AudioAttributes)}. * * @deprecated Use {@link #setAudioAttributes(AudioAttributes)}. * @param streamType The stream type for audio playback. */ @Deprecated public void setAudioStreamType(@C.StreamType int streamType) { @C.AudioUsage int usage = Util.getAudioUsageForStreamType(streamType); @C.AudioContentType int contentType = Util.getAudioContentTypeForStreamType(streamType); AudioAttributes audioAttributes = new AudioAttributes.Builder().setUsage(usage).setContentType(contentType).build(); setAudioAttributes(audioAttributes); }
@Test public void handleSetPlayWhenReady_afterSetAudioAttributes_setsPlayerCommandPlayWhenReady() { // Ensure that audio focus is not requested until playWhenReady is true. AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat(audioFocusManager.handlePrepare(/* playWhenReady= */ false)) .isEqualTo(PLAYER_COMMAND_DO_NOT_PLAY); assertThat(Shadows.shadowOf(audioManager).getLastAudioFocusRequest()).isNull(); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ false, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_DO_NOT_PLAY); assertThat(Shadows.shadowOf(audioManager).getLastAudioFocusRequest()).isNull(); assertThat( audioFocusManager.handleSetPlayWhenReady(/* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); }
@Test public void handlePrepare_afterSetAudioAttributes_setsPlayerCommandPlayWhenReady() { // Ensure that when playWhenReady is true while the player is IDLE, audio focus is only // requested after calling handlePrepare. AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ true, Player.STATE_IDLE)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); assertThat(Shadows.shadowOf(audioManager).getLastAudioFocusRequest()).isNull(); assertThat(audioFocusManager.handlePrepare(/* playWhenReady= */ true)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); }
.setUsage(C.USAGE_MEDIA) .setContentType(C.CONTENT_TYPE_MOVIE) .build(); player.setAudioAttributes(audioAttributes, true);
/** * Plays the sound. This will pass the SoundData instance to the provided * [Alarmio](../Alarmio) class, which will store the currently playing sound * until it is stopped or cancelled. * * @param alarmio The active Application instance. */ public void play(Alarmio alarmio) { if (url.startsWith("content://")) { if (ringtone == null) { ringtone = RingtoneManager.getRingtone(alarmio, Uri.parse(url)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ringtone.setAudioAttributes(new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_ALARM) .build()); } } alarmio.playRingtone(ringtone); } else { alarmio.playStream(url, new com.google.android.exoplayer2.audio.AudioAttributes.Builder() .setUsage(C.USAGE_ALARM) .build()); } }
/** * Preview the sound on the "media" volume channel. * * @param alarmio The active Application instance. */ public void preview(Alarmio alarmio) { if (url.startsWith("content://")) { if (ringtone == null) { ringtone = RingtoneManager.getRingtone(alarmio, Uri.parse(url)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ringtone.setAudioAttributes(new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .build()); } } alarmio.playRingtone(ringtone); } else { alarmio.playStream(url, new com.google.android.exoplayer2.audio.AudioAttributes.Builder() .setUsage(C.USAGE_MEDIA) .build()); } }
@Override protected void onPostExecute(Integer connectionType) { if (connectionType == CONNECTION_TYPE_ERROR) { Toast.makeText(PlayerService.this, getString(R.string.toastalert_unable_to_connect), Toast.LENGTH_LONG).show(); stopPlayback(false); } else if (mStation.getPlaybackState() != PLAYBACK_STATE_STOPPED) { // prepare player preparePlayer(connectionType); // add listener mPlayer.addListener(PlayerService.this); // set content type mPlayer.setAudioAttributes(new AudioAttributes.Builder() .setUsage(C.USAGE_MEDIA) .setContentType(C.CONTENT_TYPE_MUSIC) .build() ); } // release init lock mPlayerInitLock = false; }
@Test public void givenLollipopDevice_whenLoadingVideo_thenSetsMovieAudioAttributesOnExoPlayer() { given(androidDeviceVersion.isLollipopTwentyOneOrAbove()).willReturn(true); facade.loadVideo(surfaceViewHolder, drmSessionCreator, uri, OPTIONS, exoPlayerForwarder, mediaCodecSelector); AudioAttributes expectedMovieAudioAttributes = new AudioAttributes.Builder() .setContentType(C.CONTENT_TYPE_MOVIE) .build(); verify(exoPlayer).setAudioAttributes(expectedMovieAudioAttributes); }
private void setMovieAudioAttributes(SimpleExoPlayer exoPlayer) { if (androidDeviceVersion.isLollipopTwentyOneOrAbove()) { AudioAttributes audioAttributes = new AudioAttributes.Builder() .setContentType(C.CONTENT_TYPE_MOVIE) .build(); exoPlayer.setAudioAttributes(audioAttributes); } }
public void setAudioStreamType(int streamType) { @C.AudioUsage int usage = Util.getAudioUsageForStreamType(streamType); @C.AudioContentType int contentType = Util.getAudioContentTypeForStreamType(streamType); AudioAttributes audioAttributes = new AudioAttributes.Builder() .setUsage(usage) .setContentType(contentType) .build(); sendMessage(C.TRACK_TYPE_AUDIO, C.MSG_SET_AUDIO_ATTRIBUTES, audioAttributes); }
@Test public void onAudioFocusChange_withAudioFocusLost_sendsDoNotPlayAndAbandondsFocus() { // Ensure that AUDIOFOCUS_LOSS causes AudioFocusManager to pause playback and abandon audio // focus. AudioAttributes media = new AudioAttributes.Builder() .setUsage(C.USAGE_MEDIA) .setContentType(C.CONTENT_TYPE_SPEECH) .build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNull(); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS); assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_DO_NOT_PLAY); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()) .isEqualTo(request.listener); }
@Test public void handleStop_withAudioFocus_abandonsAudioFocus() { // Ensure that handleStop causes AudioFocusManager to abandon audio focus. AudioAttributes media = new AudioAttributes.Builder() .setUsage(C.USAGE_MEDIA) .setContentType(C.CONTENT_TYPE_SPEECH) .build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNull(); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); audioFocusManager.handleStop(); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()) .isEqualTo(request.listener); }
@Test public void onAudioFocusChange_withDuckEnabled_volumeReducedAndRestored() { // Ensure that the volume multiplier is adjusted when audio focus is lost to // AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK, and returns to the default value after focus is // regained. AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK); assertThat(testPlayerControl.lastVolumeMultiplier).isLessThan(1.0f); assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(NO_COMMAND_RECEIVED); request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); assertThat(testPlayerControl.lastVolumeMultiplier).isEqualTo(1.0f); }
@Test public void onAudioFocusChange_withPausedWhenDucked_sendsCommandWaitForCallback() { // Ensure that the player is commanded to pause when audio focus is lost with // AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK and the content type is CONTENT_TYPE_SPEECH. AudioAttributes media = new AudioAttributes.Builder() .setUsage(C.USAGE_MEDIA) .setContentType(C.CONTENT_TYPE_SPEECH) .build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK); assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_WAIT_FOR_CALLBACK); assertThat(testPlayerControl.lastVolumeMultiplier).isEqualTo(1.0f); request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); }
@Test public void handleStop_withoutAudioFocus_stillAbandonsFocus() { // Ensure that handleStop causes AudioFocusManager to call through to abandon audio focus // even if focus wasn't requested. AudioAttributes media = new AudioAttributes.Builder() .setUsage(C.USAGE_MEDIA) .setContentType(C.CONTENT_TYPE_SPEECH) .build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ false, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_DO_NOT_PLAY); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNull(); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); assertThat(request).isNull(); audioFocusManager.handleStop(); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNotNull(); }
@Test public void setAudioAttributes_withNullUsage_releasesAudioFocus() { // Create attributes and request audio focus. AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); assertThat(request.durationHint).isEqualTo(AudioManager.AUDIOFOCUS_GAIN); // Ensure that setting null audio attributes with audio focus releases audio focus. assertThat( audioFocusManager.setAudioAttributes( /* audioAttributes= */ null, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); AudioManager.OnAudioFocusChangeListener lastRequest = Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener(); assertThat(lastRequest).isNotNull(); }
@Test public void onAudioFocusChange_withTransientLost_sendsCommandWaitForCallback() { // Ensure that the player is commanded to pause when audio focus is lost with // AUDIOFOCUS_LOSS_TRANSIENT. AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT); assertThat(testPlayerControl.lastVolumeMultiplier).isEqualTo(1.0f); assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_WAIT_FOR_CALLBACK); }
@Test public void setAudioAttributes_inStateEnded_requestsAudioFocus() { // Ensure setting audio attributes when player is in STATE_ENDED requests audio focus. AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ true, Player.STATE_ENDED)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); assertThat(request.durationHint).isEqualTo(AudioManager.AUDIOFOCUS_GAIN); }
@Test public void setAudioAttributes_withUsageMedia_usesAudioFocusGain() { // Ensure setting media type audio attributes requests AUDIOFOCUS_GAIN. AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); assertThat(request.durationHint).isEqualTo(AudioManager.AUDIOFOCUS_GAIN); }
@Test public void setAudioAttributes_withUsageAlarm_throwsIllegalArgumentException() { // Ensure that audio attributes that map to AUDIOFOCUS_GAIN_TRANSIENT* throw AudioAttributes alarm = new AudioAttributes.Builder().setUsage(C.USAGE_ALARM).build(); try { audioFocusManager.setAudioAttributes(alarm, /* playWhenReady= */ false, Player.STATE_IDLE); fail(); } catch (IllegalArgumentException e) { // Expected } }