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

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: rebase Created 3 years, 7 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"
11 #include "base/android/scoped_java_ref.h" 11 #include "base/android/scoped_java_ref.h"
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/memory/ptr_util.h"
14 #include "base/message_loop/message_loop.h" 15 #include "base/message_loop/message_loop.h"
15 #include "base/strings/string_number_conversions.h" 16 #include "base/strings/string_number_conversions.h"
16 #include "jni/AudioManagerAndroid_jni.h" 17 #include "jni/AudioManagerAndroid_jni.h"
17 #include "media/audio/android/audio_record_input.h" 18 #include "media/audio/android/audio_record_input.h"
18 #include "media/audio/android/opensles_input.h" 19 #include "media/audio/android/opensles_input.h"
19 #include "media/audio/android/opensles_output.h" 20 #include "media/audio/android/opensles_output.h"
20 #include "media/audio/audio_device_description.h" 21 #include "media/audio/audio_device_description.h"
21 #include "media/audio/audio_manager.h" 22 #include "media/audio/audio_manager.h"
22 #include "media/audio/fake_audio_input_stream.h" 23 #include "media/audio/fake_audio_input_stream.h"
23 #include "media/base/audio_parameters.h" 24 #include "media/base/audio_parameters.h"
(...skipping 15 matching lines...) Expand all
39 } 40 }
40 41
41 // Maximum number of output streams that can be open simultaneously. 42 // Maximum number of output streams that can be open simultaneously.
42 const int kMaxOutputStreams = 10; 43 const int kMaxOutputStreams = 10;
43 44
44 const int kDefaultInputBufferSize = 1024; 45 const int kDefaultInputBufferSize = 1024;
45 const int kDefaultOutputBufferSize = 2048; 46 const int kDefaultOutputBufferSize = 2048;
46 47
47 } // namespace 48 } // namespace
48 49
49 ScopedAudioManagerPtr CreateAudioManager( 50 std::unique_ptr<AudioManager> CreateAudioManager(
50 scoped_refptr<base::SingleThreadTaskRunner> task_runner, 51 std::unique_ptr<AudioThread> audio_thread,
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>(std::move(audio_thread),
54 std::move(task_runner), std::move(worker_task_runner), 54 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 std::unique_ptr<AudioThread> audio_thread,
60 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
61 AudioLogFactory* audio_log_factory) 59 AudioLogFactory* audio_log_factory)
62 : AudioManagerBase(std::move(task_runner), 60 : AudioManagerBase(std::move(audio_thread), audio_log_factory),
63 std::move(worker_task_runner),
64 audio_log_factory),
65 communication_mode_is_on_(false), 61 communication_mode_is_on_(false),
66 output_volume_override_set_(false), 62 output_volume_override_set_(false),
67 output_volume_override_(0) { 63 output_volume_override_(0) {
68 SetMaxOutputStreamsAllowed(kMaxOutputStreams); 64 SetMaxOutputStreamsAllowed(kMaxOutputStreams);
69 } 65 }
70 66
71 AudioManagerAndroid::~AudioManagerAndroid() { 67 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 68
83 void AudioManagerAndroid::InitializeIfNeeded() { 69 void AudioManagerAndroid::InitializeIfNeeded() {
84 GetTaskRunner()->PostTask( 70 GetTaskRunner()->PostTask(
85 FROM_HERE, 71 FROM_HERE,
86 base::Bind(base::IgnoreResult(&AudioManagerAndroid::GetJavaAudioManager), 72 base::Bind(base::IgnoreResult(&AudioManagerAndroid::GetJavaAudioManager),
87 base::Unretained(this))); 73 base::Unretained(this)));
88 } 74 }
89 75
76 void AudioManagerAndroid::ShutdownOnAudioThread() {
77 AudioManagerBase::ShutdownOnAudioThread();
78
79 // Destory java android manager here because it can only be accessed on the
80 // audio thread.
81 if (!j_audio_manager_.is_null()) {
82 DVLOG(2) << "Destroying Java part of the audio manager";
83 Java_AudioManagerAndroid_close(base::android::AttachCurrentThread(),
84 j_audio_manager_);
85 j_audio_manager_.Reset();
86 }
87 }
88
90 bool AudioManagerAndroid::HasAudioOutputDevices() { 89 bool AudioManagerAndroid::HasAudioOutputDevices() {
91 return true; 90 return true;
92 } 91 }
93 92
94 bool AudioManagerAndroid::HasAudioInputDevices() { 93 bool AudioManagerAndroid::HasAudioInputDevices() {
95 return true; 94 return true;
96 } 95 }
97 96
98 void AudioManagerAndroid::GetAudioInputDeviceNames( 97 void AudioManagerAndroid::GetAudioInputDeviceNames(
99 AudioDeviceNames* device_names) { 98 AudioDeviceNames* device_names) {
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 output_volume_override_ = volume; 423 output_volume_override_ = volume;
425 424
426 DCHECK(GetTaskRunner()->BelongsToCurrentThread()); 425 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
427 for (OutputStreams::iterator it = streams_.begin(); 426 for (OutputStreams::iterator it = streams_.begin();
428 it != streams_.end(); ++it) { 427 it != streams_.end(); ++it) {
429 (*it)->SetVolume(volume); 428 (*it)->SetVolume(volume);
430 } 429 }
431 } 430 }
432 431
433 } // namespace media 432 } // namespace media
OLDNEW
« no previous file with comments | « media/audio/android/audio_manager_android.h ('k') | media/audio/audio_input_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698