blob: f52bb9cdcc2cf51ab9492c379fb14e2b8f2e01a5 [file] [log] [blame]
// Copyright 2019 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_input_stream.h"
#include "base/logging.h"
#include "chromecast/media/audio/capture_service/capture_service_receiver.h"
#include "chromecast/media/audio/capture_service/constants.h"
#include "media/audio/audio_manager_base.h"
namespace chromecast {
namespace media {
CastAudioInputStream::CastAudioInputStream(
::media::AudioManagerBase* audio_manager,
const ::media::AudioParameters& audio_params,
const std::string& device_id)
: audio_manager_(audio_manager), audio_params_(audio_params) {
DETACH_FROM_THREAD(audio_thread_checker_);
LOG(INFO) << __func__ << " " << this
<< " created from device_id = " << device_id
<< " with audio_params = {" << audio_params_.AsHumanReadableString()
<< "}.";
}
CastAudioInputStream::~CastAudioInputStream() {
DCHECK_CALLED_ON_VALID_THREAD(audio_thread_checker_);
}
bool CastAudioInputStream::Open() {
DCHECK_CALLED_ON_VALID_THREAD(audio_thread_checker_);
DCHECK(!capture_service_receiver_);
LOG(INFO) << __func__ << " " << this << ".";
// Sanity check the audio parameters.
::media::AudioParameters::Format format = audio_params_.format();
DCHECK((format == ::media::AudioParameters::AUDIO_PCM_LINEAR) ||
(format == ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY));
::media::ChannelLayout channel_layout = audio_params_.channel_layout();
if ((channel_layout != ::media::CHANNEL_LAYOUT_MONO) &&
(channel_layout != ::media::CHANNEL_LAYOUT_STEREO)) {
LOG(WARNING) << "Unsupported channel layout: " << channel_layout;
return false;
}
DCHECK_GE(audio_params_.channels(), 1);
DCHECK_LE(audio_params_.channels(), 2);
capture_service_receiver_ = std::make_unique<CaptureServiceReceiver>(
capture_service::StreamType::kSoftwareEchoCancelled,
audio_params_.sample_rate(), audio_params_.channels(),
audio_params_.frames_per_buffer());
return true;
}
void CastAudioInputStream::Start(AudioInputCallback* input_callback) {
DCHECK_CALLED_ON_VALID_THREAD(audio_thread_checker_);
DCHECK(capture_service_receiver_);
DCHECK(input_callback);
LOG(INFO) << __func__ << " " << this << ".";
capture_service_receiver_->Start(input_callback);
}
void CastAudioInputStream::Stop() {
DCHECK_CALLED_ON_VALID_THREAD(audio_thread_checker_);
DCHECK(capture_service_receiver_);
LOG(INFO) << __func__ << " " << this << ".";
capture_service_receiver_->Stop();
}
void CastAudioInputStream::Close() {
DCHECK_CALLED_ON_VALID_THREAD(audio_thread_checker_);
LOG(INFO) << __func__ << " " << this << ".";
capture_service_receiver_.reset();
if (audio_manager_) {
audio_manager_->ReleaseInputStream(this);
}
}
double CastAudioInputStream::GetMaxVolume() {
return 1.0;
}
void CastAudioInputStream::SetVolume(double volume) {}
double CastAudioInputStream::GetVolume() {
return 1.0;
}
bool CastAudioInputStream::SetAutomaticGainControl(bool enabled) {
return false;
}
bool CastAudioInputStream::GetAutomaticGainControl() {
return false;
}
bool CastAudioInputStream::IsMuted() {
return false;
}
void CastAudioInputStream::SetOutputDeviceForAec(
const std::string& output_device_id) {
// Not supported. Do nothing.
}
} // namespace media
} // namespace chromecast