Skip to content

Commit

Permalink
Enable virtual mic for cast Android devices.
Browse files Browse the repository at this point in the history
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
shiyun-g authored and Commit Bot committed Jun 15, 2020
1 parent 9da62aa commit 55a7c70
Show file tree
Hide file tree
Showing 4 changed files with 185 additions and 1 deletion.
13 changes: 12 additions & 1 deletion chromecast/browser/cast_content_browser_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@
#endif // defined(OS_LINUX)

#if defined(OS_ANDROID)
#include "chromecast/media/audio/cast_audio_manager_android.h" //nogncheck
#include "components/cdm/browser/cdm_message_filter_android.h"
#include "components/crash/core/app/crashpad.h"
#else
Expand Down Expand Up @@ -272,6 +273,16 @@ CastContentBrowserClient::CreateAudioManager(
GetMediaTaskRunner(),
ServiceConnector::MakeRemote(kBrowserProcessClientId),
BUILDFLAG(ENABLE_CAST_AUDIO_MANAGER_MIXER));
#elif defined(OS_ANDROID)
return std::make_unique<media::CastAudioManagerAndroid>(
std::move(audio_thread), audio_log_factory,
base::BindRepeating(&CastContentBrowserClient::GetCmaBackendFactory,
base::Unretained(this)),
base::BindRepeating(&shell::CastSessionIdMap::GetSessionId),
base::CreateSingleThreadTaskRunner({content::BrowserThread::UI}),
GetMediaTaskRunner(),
ServiceConnector::MakeRemote(kBrowserProcessClientId),
BUILDFLAG(ENABLE_CAST_AUDIO_MANAGER_MIXER));
#else
return std::make_unique<media::CastAudioManager>(
std::move(audio_thread), audio_log_factory,
Expand All @@ -282,7 +293,7 @@ CastContentBrowserClient::CreateAudioManager(
GetMediaTaskRunner(),
ServiceConnector::MakeRemote(kBrowserProcessClientId),
BUILDFLAG(ENABLE_CAST_AUDIO_MANAGER_MIXER));
#endif // defined(USE_ALSA)
#endif
}

bool CastContentBrowserClient::OverridesAudioManager() {
Expand Down
7 changes: 7 additions & 0 deletions chromecast/media/audio/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@ cast_source_set("audio") {
]
}

if (is_android) {
sources += [
"cast_audio_manager_android.cc",
"cast_audio_manager_android.h",
]
}

configs += [ "//media/audio:platform_config" ]
}

Expand Down
110 changes: 110 additions & 0 deletions chromecast/media/audio/cast_audio_manager_android.cc
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
56 changes: 56 additions & 0 deletions chromecast/media/audio/cast_audio_manager_android.h
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_

0 comments on commit 55a7c70

Please sign in to comment.