blob: cae844424a347f53810bb94bbe04c9814b0b5d72 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_AUDIO_ANDROID_AUDIO_MANAGER_ANDROID_H_
#define MEDIA_AUDIO_ANDROID_AUDIO_MANAGER_ANDROID_H_
#include <set>
#include "base/android/jni_android.h"
#include "base/macros.h"
#include "base/synchronization/lock.h"
#include "base/synchronization/waitable_event.h"
#include "media/audio/audio_manager_base.h"
namespace media {
class MuteableAudioOutputStream;
// Android implemention of AudioManager.
class MEDIA_EXPORT AudioManagerAndroid : public AudioManagerBase {
public:
AudioManagerAndroid(std::unique_ptr<AudioThread> audio_thread,
AudioLogFactory* audio_log_factory);
~AudioManagerAndroid() override;
void InitializeIfNeeded();
// Implementation of AudioManager.
bool HasAudioOutputDevices() override;
bool HasAudioInputDevices() override;
void GetAudioInputDeviceNames(AudioDeviceNames* device_names) override;
void GetAudioOutputDeviceNames(AudioDeviceNames* device_names) override;
AudioParameters GetInputStreamParameters(
const std::string& device_id) override;
AudioOutputStream* MakeAudioOutputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) override;
AudioInputStream* MakeAudioInputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) override;
void ReleaseOutputStream(AudioOutputStream* stream) override;
void ReleaseInputStream(AudioInputStream* stream) override;
const char* GetName() override;
// Implementation of AudioManagerBase.
AudioOutputStream* MakeLinearOutputStream(
const AudioParameters& params,
const LogCallback& log_callback) override;
AudioOutputStream* MakeLowLatencyOutputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) override;
AudioOutputStream* MakeBitstreamOutputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) override;
AudioInputStream* MakeLinearInputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) override;
AudioInputStream* MakeLowLatencyInputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) override;
// Indicates if there's support for the OpenSLES performance mode keys. See
// OpenSLESOutputStream for specific details. Essentially this allows for low
// power audio when large buffer sizes can be used.
static bool SupportsPerformanceModeForOutput();
void SetMute(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean muted);
// Sets a volume that applies to all this manager's output audio streams.
// This overrides other SetVolume calls (e.g. through AudioHostMsg_SetVolume).
void SetOutputVolumeOverride(double volume);
bool HasOutputVolumeOverride(double* out_volume) const;
// Get the latency introduced by the hardware. It relies on
// AudioManager.getOutputLatency, which is both (a) hidden and (b) not
// guaranteed to be meaningful. Do not use this, except in the context of
// b/80326798 to adjust (hackily) for hardware latency that OpenSLES isn't
// otherwise accounting for.
base::TimeDelta GetOutputLatency();
protected:
void ShutdownOnAudioThread() override;
AudioParameters GetPreferredOutputStreamParameters(
const std::string& output_device_id,
const AudioParameters& input_params) override;
private:
const base::android::JavaRef<jobject>& GetJavaAudioManager();
bool HasNoAudioInputStreams();
void SetCommunicationAudioModeOn(bool on);
bool SetAudioDevice(const std::string& device_id);
int GetNativeOutputSampleRate();
bool IsAudioLowLatencySupported();
int GetAudioLowLatencyOutputFrameSize();
int GetOptimalOutputFrameSize(int sample_rate, int channels);
void DoSetMuteOnAudioThread(bool muted);
void DoSetVolumeOnAudioThread(double volume);
// Returns whether or not we can and should use AAudio.
bool UseAAudio();
// Java AudioManager instance.
base::android::ScopedJavaGlobalRef<jobject> j_audio_manager_;
typedef std::set<MuteableAudioOutputStream*> OutputStreams;
OutputStreams streams_;
// Enabled when first input stream is created and set to false when last
// input stream is destroyed. Also affects the stream type of output streams.
bool communication_mode_is_on_;
base::Optional<bool> is_aaudio_available_;
// If set, overrides volume level on output streams
bool output_volume_override_set_;
double output_volume_override_;
DISALLOW_COPY_AND_ASSIGN(AudioManagerAndroid);
};
} // namespace media
#endif // MEDIA_AUDIO_ANDROID_AUDIO_MANAGER_ANDROID_H_