| // Copyright 2017 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "content/browser/renderer_host/media/audio_input_stream_handle.h" | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "base/functional/bind.h" | 
 | #include "base/functional/callback_helpers.h" | 
 |  | 
 | namespace content { | 
 |  | 
 | namespace { | 
 |  | 
 | mojo::PendingRemote<media::mojom::AudioInputStreamClient> | 
 | CreateRemoteAndStoreReceiver( | 
 |     mojo::PendingReceiver<media::mojom::AudioInputStreamClient>* receiver_out) { | 
 |   mojo::PendingRemote<media::mojom::AudioInputStreamClient> remote; | 
 |   *receiver_out = remote.InitWithNewPipeAndPassReceiver(); | 
 |   return remote; | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | AudioInputStreamHandle::AudioInputStreamHandle( | 
 |     mojo::PendingRemote<blink::mojom::RendererAudioInputStreamFactoryClient> | 
 |         client_pending_remote, | 
 |     media::MojoAudioInputStream::CreateDelegateCallback | 
 |         create_delegate_callback, | 
 |     DeleterCallback deleter_callback) | 
 |     : stream_id_(base::UnguessableToken::Create()), | 
 |       deleter_callback_(std::move(deleter_callback)), | 
 |       client_remote_(std::move(client_pending_remote)), | 
 |       stream_(pending_stream_.InitWithNewPipeAndPassReceiver(), | 
 |               CreateRemoteAndStoreReceiver(&pending_stream_client_), | 
 |               std::move(create_delegate_callback), | 
 |               base::BindOnce(&AudioInputStreamHandle::OnCreated, | 
 |                              base::Unretained(this)), | 
 |               base::BindOnce(&AudioInputStreamHandle::CallDeleter, | 
 |                              base::Unretained(this))) { | 
 |   // Unretained is safe since |this| owns |stream_| and |client_remote_|. | 
 |   DCHECK(client_remote_); | 
 |   DCHECK(deleter_callback_); | 
 |   client_remote_.set_disconnect_handler(base::BindOnce( | 
 |       &AudioInputStreamHandle::CallDeleter, base::Unretained(this))); | 
 | } | 
 |  | 
 | AudioInputStreamHandle::~AudioInputStreamHandle() { | 
 |   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); | 
 | } | 
 |  | 
 | void AudioInputStreamHandle::SetOutputDeviceForAec( | 
 |     const std::string& raw_output_device_id) { | 
 |   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); | 
 |   stream_.SetOutputDeviceForAec(raw_output_device_id); | 
 | } | 
 |  | 
 | void AudioInputStreamHandle::OnCreated( | 
 |     media::mojom::ReadWriteAudioDataPipePtr data_pipe, | 
 |     bool initially_muted) { | 
 |   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); | 
 |   DCHECK(client_remote_); | 
 |   DCHECK(deleter_callback_) | 
 |       << "|deleter_callback_| was called, but |this| hasn't been destructed!"; | 
 |   client_remote_->StreamCreated( | 
 |       std::move(pending_stream_), std::move(pending_stream_client_), | 
 |       std::move(data_pipe), initially_muted, stream_id_); | 
 | } | 
 |  | 
 | void AudioInputStreamHandle::CallDeleter() { | 
 |   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); | 
 |   DCHECK(deleter_callback_); | 
 |   std::move(deleter_callback_).Run(this); | 
 | } | 
 |  | 
 | }  // namespace content |