| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/media/session/media_session_delegate_android.h" | 5 #include "content/browser/media/session/audio_focus_delegate_android.h" |
| 6 | 6 |
| 7 #include "base/android/context_utils.h" | 7 #include "base/android/context_utils.h" |
| 8 #include "base/android/jni_android.h" | 8 #include "base/android/jni_android.h" |
| 9 #include "jni/MediaSessionDelegate_jni.h" | 9 #include "jni/AudioFocusDelegate_jni.h" |
| 10 | 10 |
| 11 using base::android::JavaParamRef; | 11 using base::android::JavaParamRef; |
| 12 | 12 |
| 13 namespace content { | 13 namespace content { |
| 14 | 14 |
| 15 // static | 15 // static |
| 16 bool MediaSessionDelegateAndroid::Register(JNIEnv* env) { | 16 bool AudioFocusDelegateAndroid::Register(JNIEnv* env) { |
| 17 return RegisterNativesImpl(env); | 17 return RegisterNativesImpl(env); |
| 18 } | 18 } |
| 19 | 19 |
| 20 MediaSessionDelegateAndroid::MediaSessionDelegateAndroid( | 20 AudioFocusDelegateAndroid::AudioFocusDelegateAndroid( |
| 21 MediaSession* media_session) | 21 MediaSession* media_session) |
| 22 : media_session_(media_session) { | 22 : media_session_(media_session) {} |
| 23 |
| 24 AudioFocusDelegateAndroid::~AudioFocusDelegateAndroid() { |
| 25 JNIEnv* env = base::android::AttachCurrentThread(); |
| 26 DCHECK(env); |
| 27 Java_AudioFocusDelegate_tearDown(env, j_media_session_delegate_); |
| 23 } | 28 } |
| 24 | 29 |
| 25 MediaSessionDelegateAndroid::~MediaSessionDelegateAndroid() { | 30 void AudioFocusDelegateAndroid::Initialize() { |
| 26 JNIEnv* env = base::android::AttachCurrentThread(); | 31 JNIEnv* env = base::android::AttachCurrentThread(); |
| 27 DCHECK(env); | 32 DCHECK(env); |
| 28 Java_MediaSessionDelegate_tearDown(env, j_media_session_delegate_); | 33 j_media_session_delegate_.Reset(Java_AudioFocusDelegate_create( |
| 29 } | 34 env, base::android::GetApplicationContext(), |
| 30 | |
| 31 void MediaSessionDelegateAndroid::Initialize() { | |
| 32 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 33 DCHECK(env); | |
| 34 j_media_session_delegate_.Reset(Java_MediaSessionDelegate_create( | |
| 35 env, | |
| 36 base::android::GetApplicationContext(), | |
| 37 reinterpret_cast<intptr_t>(this))); | 35 reinterpret_cast<intptr_t>(this))); |
| 38 } | 36 } |
| 39 | 37 |
| 40 bool MediaSessionDelegateAndroid::RequestAudioFocus( | 38 bool AudioFocusDelegateAndroid::RequestAudioFocus( |
| 41 AudioFocusManager::AudioFocusType audio_focus_type) { | 39 AudioFocusManager::AudioFocusType audio_focus_type) { |
| 42 JNIEnv* env = base::android::AttachCurrentThread(); | 40 JNIEnv* env = base::android::AttachCurrentThread(); |
| 43 DCHECK(env); | 41 DCHECK(env); |
| 44 return Java_MediaSessionDelegate_requestAudioFocus( | 42 return Java_AudioFocusDelegate_requestAudioFocus( |
| 45 env, j_media_session_delegate_, | 43 env, j_media_session_delegate_, |
| 46 audio_focus_type == | 44 audio_focus_type == |
| 47 AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 45 AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| 48 } | 46 } |
| 49 | 47 |
| 50 void MediaSessionDelegateAndroid::AbandonAudioFocus() { | 48 void AudioFocusDelegateAndroid::AbandonAudioFocus() { |
| 51 JNIEnv* env = base::android::AttachCurrentThread(); | 49 JNIEnv* env = base::android::AttachCurrentThread(); |
| 52 DCHECK(env); | 50 DCHECK(env); |
| 53 Java_MediaSessionDelegate_abandonAudioFocus(env, j_media_session_delegate_); | 51 Java_AudioFocusDelegate_abandonAudioFocus(env, j_media_session_delegate_); |
| 54 } | 52 } |
| 55 | 53 |
| 56 void MediaSessionDelegateAndroid::OnSuspend( | 54 void AudioFocusDelegateAndroid::OnSuspend(JNIEnv*, |
| 57 JNIEnv*, const JavaParamRef<jobject>&, jboolean temporary) { | 55 const JavaParamRef<jobject>&, |
| 56 jboolean temporary) { |
| 58 // TODO(mlamouri): this check makes it so that if a MediaSession is paused and | 57 // TODO(mlamouri): this check makes it so that if a MediaSession is paused and |
| 59 // then loses audio focus, it will still stay in the Suspended state. | 58 // then loses audio focus, it will still stay in the Suspended state. |
| 60 // See https://crbug.com/539998 | 59 // See https://crbug.com/539998 |
| 61 if (!media_session_->IsActive()) | 60 if (!media_session_->IsActive()) |
| 62 return; | 61 return; |
| 63 | 62 |
| 64 if (temporary) { | 63 if (temporary) { |
| 65 media_session_->Suspend(MediaSession::SuspendType::SYSTEM); | 64 media_session_->Suspend(MediaSession::SuspendType::SYSTEM); |
| 66 } else { | 65 } else { |
| 67 media_session_->Stop(MediaSession::SuspendType::SYSTEM); | 66 media_session_->Stop(MediaSession::SuspendType::SYSTEM); |
| 68 } | 67 } |
| 69 } | 68 } |
| 70 | 69 |
| 71 void MediaSessionDelegateAndroid::OnResume( | 70 void AudioFocusDelegateAndroid::OnResume(JNIEnv*, |
| 72 JNIEnv*, const JavaParamRef<jobject>&) { | 71 const JavaParamRef<jobject>&) { |
| 73 if (!media_session_->IsReallySuspended()) | 72 if (!media_session_->IsReallySuspended()) |
| 74 return; | 73 return; |
| 75 | 74 |
| 76 media_session_->Resume(MediaSession::SuspendType::SYSTEM); | 75 media_session_->Resume(MediaSession::SuspendType::SYSTEM); |
| 77 } | 76 } |
| 78 | 77 |
| 79 void MediaSessionDelegateAndroid::OnStartDucking(JNIEnv*, jobject) { | 78 void AudioFocusDelegateAndroid::OnStartDucking(JNIEnv*, jobject) { |
| 80 media_session_->StartDucking(); | 79 media_session_->StartDucking(); |
| 81 } | 80 } |
| 82 | 81 |
| 83 void MediaSessionDelegateAndroid::OnStopDucking(JNIEnv*, jobject) { | 82 void AudioFocusDelegateAndroid::OnStopDucking(JNIEnv*, jobject) { |
| 84 media_session_->StopDucking(); | 83 media_session_->StopDucking(); |
| 85 } | 84 } |
| 86 | 85 |
| 87 void MediaSessionDelegateAndroid::RecordSessionDuck( | 86 void AudioFocusDelegateAndroid::RecordSessionDuck( |
| 88 JNIEnv*, const JavaParamRef<jobject>&) { | 87 JNIEnv*, |
| 88 const JavaParamRef<jobject>&) { |
| 89 media_session_->RecordSessionDuck(); | 89 media_session_->RecordSessionDuck(); |
| 90 } | 90 } |
| 91 | 91 |
| 92 // static | 92 // static |
| 93 std::unique_ptr<MediaSessionDelegate> MediaSessionDelegate::Create( | 93 std::unique_ptr<AudioFocusDelegate> AudioFocusDelegate::Create( |
| 94 MediaSession* media_session) { | 94 MediaSession* media_session) { |
| 95 MediaSessionDelegateAndroid* delegate = | 95 AudioFocusDelegateAndroid* delegate = |
| 96 new MediaSessionDelegateAndroid(media_session); | 96 new AudioFocusDelegateAndroid(media_session); |
| 97 delegate->Initialize(); | 97 delegate->Initialize(); |
| 98 return std::unique_ptr<MediaSessionDelegate>(delegate); | 98 return std::unique_ptr<AudioFocusDelegate>(delegate); |
| 99 } | 99 } |
| 100 | 100 |
| 101 } // namespace content | 101 } // namespace content |
| OLD | NEW |