forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Enable virtual mic for cast Android devices.
Bug:b/154533894 Change-Id: I557b57df59c0646de8d03094cb4888f7a7ffe4e5 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2241637 Auto-Submit: Cicy Tan <shiyun@google.com> Reviewed-by: Luke Halliwell (slow) <halliwell@chromium.org> Commit-Queue: Cicy Tan <shiyun@google.com> Cr-Commit-Position: refs/heads/master@{#778467}
- Loading branch information
Showing
4 changed files
with
185 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
// Copyright 2020 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. | ||
|
||
#include "chromecast/media/audio/cast_audio_manager_android.h" | ||
|
||
#include <utility> | ||
|
||
#include "base/logging.h" | ||
#include "chromecast/media/audio/audio_buildflags.h" | ||
#include "chromecast/media/audio/cast_audio_input_stream.h" | ||
#include "media/audio/audio_device_name.h" | ||
#include "media/base/audio_parameters.h" | ||
#include "media/base/channel_layout.h" | ||
|
||
namespace chromecast { | ||
namespace media { | ||
|
||
const int kDefaultSampleRate = 48000; | ||
const int kDefaultInputBufferSize = 1024; | ||
|
||
#if BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
const int kCommunicationsSampleRate = 16000; | ||
const int kCommunicationsInputBufferSize = 160; // 10 ms. | ||
#endif // BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
|
||
CastAudioManagerAndroid::CastAudioManagerAndroid( | ||
std::unique_ptr<::media::AudioThread> audio_thread, | ||
::media::AudioLogFactory* audio_log_factory, | ||
base::RepeatingCallback<CmaBackendFactory*()> backend_factory_getter, | ||
GetSessionIdCallback get_session_id_callback, | ||
scoped_refptr<base::SingleThreadTaskRunner> browser_task_runner, | ||
scoped_refptr<base::SingleThreadTaskRunner> media_task_runner, | ||
mojo::PendingRemote<chromecast::mojom::ServiceConnector> connector, | ||
bool use_mixer) | ||
: CastAudioManager(std::move(audio_thread), | ||
audio_log_factory, | ||
std::move(backend_factory_getter), | ||
std::move(get_session_id_callback), | ||
browser_task_runner, | ||
media_task_runner, | ||
std::move(connector), | ||
use_mixer) {} | ||
|
||
CastAudioManagerAndroid::~CastAudioManagerAndroid() = default; | ||
|
||
bool CastAudioManagerAndroid::HasAudioInputDevices() { | ||
#if BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
return true; | ||
#else | ||
return false; | ||
#endif // BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
} | ||
|
||
void CastAudioManagerAndroid::GetAudioInputDeviceNames( | ||
::media::AudioDeviceNames* device_names) { | ||
DCHECK(device_names->empty()); | ||
#if BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
device_names->push_back(::media::AudioDeviceName::CreateCommunications()); | ||
#else | ||
LOG(WARNING) << "No support for input audio devices"; | ||
#endif // BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
} | ||
|
||
::media::AudioParameters CastAudioManagerAndroid::GetInputStreamParameters( | ||
const std::string& device_id) { | ||
#if BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
if (device_id == ::media::AudioDeviceDescription::kCommunicationsDeviceId) { | ||
return ::media::AudioParameters(::media::AudioParameters::AUDIO_PCM_LINEAR, | ||
::media::CHANNEL_LAYOUT_MONO, | ||
kCommunicationsSampleRate, | ||
kCommunicationsInputBufferSize); | ||
} | ||
#endif // BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
LOG(WARNING) << "No support for input audio devices"; | ||
// Need to send a valid AudioParameters object even when it will be unused. | ||
return ::media::AudioParameters( | ||
::media::AudioParameters::AUDIO_PCM_LOW_LATENCY, | ||
::media::CHANNEL_LAYOUT_STEREO, kDefaultSampleRate, | ||
kDefaultInputBufferSize); | ||
} | ||
|
||
::media::AudioInputStream* CastAudioManagerAndroid::MakeLinearInputStream( | ||
const ::media::AudioParameters& params, | ||
const std::string& device_id, | ||
const ::media::AudioManager::LogCallback& log_callback) { | ||
#if BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
if (device_id == ::media::AudioDeviceDescription::kCommunicationsDeviceId) { | ||
return new CastAudioInputStream(this, params, device_id); | ||
} | ||
#endif // BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
LOG(WARNING) << "No support for input audio devices"; | ||
return nullptr; | ||
} | ||
|
||
::media::AudioInputStream* CastAudioManagerAndroid::MakeLowLatencyInputStream( | ||
const ::media::AudioParameters& params, | ||
const std::string& device_id, | ||
const ::media::AudioManager::LogCallback& log_callback) { | ||
#if BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
if (device_id == ::media::AudioDeviceDescription::kCommunicationsDeviceId) { | ||
return new CastAudioInputStream(this, params, device_id); | ||
} | ||
#endif // BUILDFLAG(ENABLE_AUDIO_CAPTURE_SERVICE) | ||
LOG(WARNING) << "No support for input audio devices"; | ||
return nullptr; | ||
} | ||
|
||
} // namespace media | ||
} // namespace chromecast |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// Copyright 2020 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 CHROMECAST_MEDIA_AUDIO_CAST_AUDIO_MANAGER_ANDROID_H_ | ||
#define CHROMECAST_MEDIA_AUDIO_CAST_AUDIO_MANAGER_ANDROID_H_ | ||
|
||
#include <memory> | ||
#include <string> | ||
|
||
#include "base/single_thread_task_runner.h" | ||
#include "chromecast/media/audio/cast_audio_manager.h" | ||
#include "services/service_manager/public/cpp/connector.h" | ||
|
||
namespace chromecast { | ||
namespace media { | ||
|
||
class CastAudioManagerAndroid : public CastAudioManager { | ||
public: | ||
CastAudioManagerAndroid( | ||
std::unique_ptr<::media::AudioThread> audio_thread, | ||
::media::AudioLogFactory* audio_log_factory, | ||
base::RepeatingCallback<CmaBackendFactory*()> backend_factory_getter, | ||
GetSessionIdCallback get_session_id_callback, | ||
scoped_refptr<base::SingleThreadTaskRunner> browser_task_runner, | ||
scoped_refptr<base::SingleThreadTaskRunner> media_task_runner, | ||
mojo::PendingRemote<chromecast::mojom::ServiceConnector> connector, | ||
bool use_mixer); | ||
~CastAudioManagerAndroid() override; | ||
|
||
// CastAudioManager implementation. | ||
bool HasAudioInputDevices() override; | ||
void GetAudioInputDeviceNames( | ||
::media::AudioDeviceNames* device_names) override; | ||
::media::AudioParameters GetInputStreamParameters( | ||
const std::string& device_id) override; | ||
|
||
private: | ||
// CastAudioManager implementation. | ||
::media::AudioInputStream* MakeLinearInputStream( | ||
const ::media::AudioParameters& params, | ||
const std::string& device_id, | ||
const ::media::AudioManager::LogCallback& log_callback) override; | ||
::media::AudioInputStream* MakeLowLatencyInputStream( | ||
const ::media::AudioParameters& params, | ||
const std::string& device_id, | ||
const ::media::AudioManager::LogCallback& log_callback) override; | ||
|
||
CastAudioManagerAndroid(const CastAudioManagerAndroid&) = delete; | ||
CastAudioManagerAndroid& operator=(const CastAudioManagerAndroid&) = delete; | ||
}; | ||
|
||
} // namespace media | ||
} // namespace chromecast | ||
|
||
#endif // CHROMECAST_MEDIA_AUDIO_CAST_AUDIO_MANAGER_ANDROID_H_ |