Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Side by Side Diff: media/audio/android/audio_manager_android.cc

Issue 2784433002: Ensures that audio tasks cannot run after AudioManager is deleted. (Closed)
Patch Set: fixes content_browsertests and content_unittests Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "media/audio/android/audio_manager_android.h" 5 #include "media/audio/android/audio_manager_android.h"
6 6
7 #include "base/android/build_info.h" 7 #include "base/android/build_info.h"
8 #include "base/android/context_utils.h" 8 #include "base/android/context_utils.h"
9 #include "base/android/jni_array.h" 9 #include "base/android/jni_array.h"
10 #include "base/android/jni_string.h" 10 #include "base/android/jni_string.h"
(...skipping 28 matching lines...) Expand all
39 } 39 }
40 40
41 // Maximum number of output streams that can be open simultaneously. 41 // Maximum number of output streams that can be open simultaneously.
42 const int kMaxOutputStreams = 10; 42 const int kMaxOutputStreams = 10;
43 43
44 const int kDefaultInputBufferSize = 1024; 44 const int kDefaultInputBufferSize = 1024;
45 const int kDefaultOutputBufferSize = 2048; 45 const int kDefaultOutputBufferSize = 2048;
46 46
47 } // namespace 47 } // namespace
48 48
49 ScopedAudioManagerPtr CreateAudioManager( 49 std::unique_ptr<AudioManager> CreateAudioManager(
50 scoped_refptr<base::SingleThreadTaskRunner> task_runner, 50 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
51 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner, 51 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
52 AudioLogFactory* audio_log_factory) { 52 AudioLogFactory* audio_log_factory) {
53 return ScopedAudioManagerPtr(new AudioManagerAndroid( 53 return base::MakeUnique<AudioManagerAndroid>(
54 std::move(task_runner), std::move(worker_task_runner), 54 std::move(task_runner), std::move(worker_task_runner), audio_log_factory);
55 audio_log_factory));
56 } 55 }
57 56
58 AudioManagerAndroid::AudioManagerAndroid( 57 AudioManagerAndroid::AudioManagerAndroid(
59 scoped_refptr<base::SingleThreadTaskRunner> task_runner, 58 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
60 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner, 59 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
61 AudioLogFactory* audio_log_factory) 60 AudioLogFactory* audio_log_factory)
62 : AudioManagerBase(std::move(task_runner), 61 : AudioManagerBase(std::move(task_runner),
63 std::move(worker_task_runner), 62 std::move(worker_task_runner),
64 audio_log_factory), 63 audio_log_factory),
65 communication_mode_is_on_(false), 64 communication_mode_is_on_(false),
66 output_volume_override_set_(false), 65 output_volume_override_set_(false),
67 output_volume_override_(0) { 66 output_volume_override_(0) {
68 SetMaxOutputStreamsAllowed(kMaxOutputStreams); 67 SetMaxOutputStreamsAllowed(kMaxOutputStreams);
69 } 68 }
70 69
71 AudioManagerAndroid::~AudioManagerAndroid() { 70 AudioManagerAndroid::~AudioManagerAndroid() = default;
72 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
73 Shutdown();
74
75 if (j_audio_manager_.is_null())
76 return;
77 DVLOG(2) << "Destroying Java part of the audio manager";
78 Java_AudioManagerAndroid_close(base::android::AttachCurrentThread(),
79 j_audio_manager_);
80 j_audio_manager_.Reset();
81 }
82 71
83 void AudioManagerAndroid::InitializeIfNeeded() { 72 void AudioManagerAndroid::InitializeIfNeeded() {
84 GetTaskRunner()->PostTask( 73 GetTaskRunner()->PostTask(
85 FROM_HERE, 74 FROM_HERE,
86 base::Bind(base::IgnoreResult(&AudioManagerAndroid::GetJavaAudioManager), 75 base::Bind(base::IgnoreResult(&AudioManagerAndroid::GetJavaAudioManager),
87 base::Unretained(this))); 76 base::Unretained(this)));
88 } 77 }
89 78
79 void AudioManagerAndroid::Shutdown() {
80 AudioManagerBase::Shutdown();
81
82 if (!j_audio_manager_.is_null()) {
83 DVLOG(2) << "Destroying Java part of the audio manager";
84 Java_AudioManagerAndroid_close(base::android::AttachCurrentThread(),
85 j_audio_manager_);
86 j_audio_manager_.Reset();
87 }
88 }
89
90 bool AudioManagerAndroid::HasAudioOutputDevices() { 90 bool AudioManagerAndroid::HasAudioOutputDevices() {
91 return true; 91 return true;
92 } 92 }
93 93
94 bool AudioManagerAndroid::HasAudioInputDevices() { 94 bool AudioManagerAndroid::HasAudioInputDevices() {
95 return true; 95 return true;
96 } 96 }
97 97
98 void AudioManagerAndroid::GetAudioInputDeviceNames( 98 void AudioManagerAndroid::GetAudioInputDeviceNames(
99 AudioDeviceNames* device_names) { 99 AudioDeviceNames* device_names) {
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 output_volume_override_ = volume; 424 output_volume_override_ = volume;
425 425
426 DCHECK(GetTaskRunner()->BelongsToCurrentThread()); 426 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
427 for (OutputStreams::iterator it = streams_.begin(); 427 for (OutputStreams::iterator it = streams_.begin();
428 it != streams_.end(); ++it) { 428 it != streams_.end(); ++it) {
429 (*it)->SetVolume(volume); 429 (*it)->SetVolume(volume);
430 } 430 }
431 } 431 }
432 432
433 } // namespace media 433 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698