Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(413)

Unified Diff: chromecast/renderer/media/audio_pipeline_proxy.cc

Issue 2300993003: CmaRenderer is dead. Long live MojoRenderer. (Closed)
Patch Set: update OWNERS file Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromecast/renderer/media/audio_pipeline_proxy.cc
diff --git a/chromecast/renderer/media/audio_pipeline_proxy.cc b/chromecast/renderer/media/audio_pipeline_proxy.cc
deleted file mode 100644
index 85f67ad4c1b196b938a2df93411947c0f8b35e5a..0000000000000000000000000000000000000000
--- a/chromecast/renderer/media/audio_pipeline_proxy.cc
+++ /dev/null
@@ -1,310 +0,0 @@
-// Copyright 2014 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/renderer/media/audio_pipeline_proxy.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/macros.h"
-#include "base/memory/shared_memory.h"
-#include "base/message_loop/message_loop.h"
-#include "base/threading/thread_checker.h"
-#include "chromecast/common/media/cma_messages.h"
-#include "chromecast/common/media/shared_memory_chunk.h"
-#include "chromecast/media/cma/base/buffering_defs.h"
-#include "chromecast/media/cma/base/cma_logging.h"
-#include "chromecast/media/cma/base/coded_frame_provider.h"
-#include "chromecast/media/cma/ipc/media_message_fifo.h"
-#include "chromecast/media/cma/ipc_streamer/av_streamer_proxy.h"
-#include "chromecast/media/cma/pipeline/av_pipeline_client.h"
-#include "chromecast/renderer/media/cma_message_filter_proxy.h"
-#include "chromecast/renderer/media/media_channel_proxy.h"
-#include "media/base/bind_to_current_loop.h"
-#include "media/base/pipeline_status.h"
-
-namespace chromecast {
-namespace media {
-
-namespace {
-
-void IgnoreResult() {
-}
-
-} // namespace
-
-// AudioPipelineProxyInternal -
-// This class is not thread safe and should run on the same thread
-// as the media channel proxy.
-class AudioPipelineProxyInternal {
- public:
- typedef base::Callback<void(std::unique_ptr<base::SharedMemory>)> SharedMemCB;
-
- static void Release(std::unique_ptr<AudioPipelineProxyInternal> proxy);
-
- explicit AudioPipelineProxyInternal(
- scoped_refptr<MediaChannelProxy> media_channel_proxy);
- virtual ~AudioPipelineProxyInternal();
-
- // Notify the other side (browser process) of some activity on the audio pipe.
- // TODO(erickung): either send an IPC message or write a byte on the
- // SyncSocket.
- void NotifyPipeWrite();
-
- // These functions are almost a one to one correspondence with AudioPipeline
- // but this is an internal class and there is no reason to derive from
- // AudioPipeline.
- void SetClient(const base::Closure& pipe_read_cb,
- const AvPipelineClient& client);
- void CreateAvPipe(const SharedMemCB& shared_mem_cb);
- void Initialize(const ::media::AudioDecoderConfig& config,
- const ::media::PipelineStatusCB& status_cb);
- void SetVolume(float volume);
-
- private:
- void Shutdown();
-
- // Callbacks for CmaMessageFilterHost::AudioDelegate.
- void OnAvPipeCreated(bool status,
- base::SharedMemoryHandle shared_mem_handle,
- base::FileDescriptor socket);
- void OnStateChanged(::media::PipelineStatus status);
-
- base::ThreadChecker thread_checker_;
-
- scoped_refptr<MediaChannelProxy> media_channel_proxy_;
-
- // Store the callback for a pending state transition.
- ::media::PipelineStatusCB status_cb_;
-
- SharedMemCB shared_mem_cb_;
-
- DISALLOW_COPY_AND_ASSIGN(AudioPipelineProxyInternal);
-};
-
-// static
-void AudioPipelineProxyInternal::Release(
- std::unique_ptr<AudioPipelineProxyInternal> proxy) {
- proxy->Shutdown();
-}
-
-AudioPipelineProxyInternal::AudioPipelineProxyInternal(
- scoped_refptr<MediaChannelProxy> media_channel_proxy)
- : media_channel_proxy_(media_channel_proxy) {
- DCHECK(media_channel_proxy.get());
-
- // Creation can be done on a different thread.
- thread_checker_.DetachFromThread();
-}
-
-AudioPipelineProxyInternal::~AudioPipelineProxyInternal() {
-}
-
-void AudioPipelineProxyInternal::Shutdown() {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- // Remove any callback on AudioPipelineProxyInternal.
- media_channel_proxy_->SetAudioDelegate(
- CmaMessageFilterProxy::AudioDelegate());
-}
-
-void AudioPipelineProxyInternal::NotifyPipeWrite() {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- // TODO(erickung): An alternative way would be to use a dedicated socket for
- // this event.
- bool success = media_channel_proxy_->Send(
- std::unique_ptr<IPC::Message>(new CmaHostMsg_NotifyPipeWrite(
- media_channel_proxy_->GetId(), kAudioTrackId)));
- VLOG_IF(4, !success) << "Sending msg failed";
-}
-
-void AudioPipelineProxyInternal::SetClient(const base::Closure& pipe_read_cb,
- const AvPipelineClient& client) {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- CmaMessageFilterProxy::AudioDelegate delegate;
- delegate.av_pipe_cb =
- base::Bind(&AudioPipelineProxyInternal::OnAvPipeCreated,
- base::Unretained(this));
- delegate.state_changed_cb =
- base::Bind(&AudioPipelineProxyInternal::OnStateChanged,
- base::Unretained(this));
- delegate.pipe_read_cb = pipe_read_cb;
- delegate.client = client;
- bool success = media_channel_proxy_->SetAudioDelegate(delegate);
- CHECK(success);
-}
-
-void AudioPipelineProxyInternal::CreateAvPipe(
- const SharedMemCB& shared_mem_cb) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(shared_mem_cb_.is_null());
- bool success = media_channel_proxy_->Send(
- std::unique_ptr<IPC::Message>(new CmaHostMsg_CreateAvPipe(
- media_channel_proxy_->GetId(), kAudioTrackId, kAppAudioBufferSize)));
- if (!success) {
- shared_mem_cb.Run(std::unique_ptr<base::SharedMemory>());
- return;
- }
- shared_mem_cb_ = shared_mem_cb;
-}
-
-void AudioPipelineProxyInternal::OnAvPipeCreated(
- bool success,
- base::SharedMemoryHandle shared_mem_handle,
- base::FileDescriptor socket) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!shared_mem_cb_.is_null());
- if (!success) {
- shared_mem_cb_.Run(std::unique_ptr<base::SharedMemory>());
- return;
- }
-
- CHECK(base::SharedMemory::IsHandleValid(shared_mem_handle));
- shared_mem_cb_.Run(std::unique_ptr<base::SharedMemory>(
- new base::SharedMemory(shared_mem_handle, false)));
-}
-
-void AudioPipelineProxyInternal::Initialize(
- const ::media::AudioDecoderConfig& config,
- const ::media::PipelineStatusCB& status_cb) {
- DCHECK(thread_checker_.CalledOnValidThread());
- bool success = media_channel_proxy_->Send(
- std::unique_ptr<IPC::Message>(new CmaHostMsg_AudioInitialize(
- media_channel_proxy_->GetId(), kAudioTrackId, config)));
- if (!success) {
- status_cb.Run( ::media::PIPELINE_ERROR_INITIALIZATION_FAILED);
- return;
- }
- DCHECK(status_cb_.is_null());
- status_cb_ = status_cb;
-}
-
-void AudioPipelineProxyInternal::SetVolume(float volume) {
- DCHECK(thread_checker_.CalledOnValidThread());
- media_channel_proxy_->Send(
- std::unique_ptr<IPC::Message>(new CmaHostMsg_SetVolume(
- media_channel_proxy_->GetId(), kAudioTrackId, volume)));
-}
-
-void AudioPipelineProxyInternal::OnStateChanged(
- ::media::PipelineStatus status) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!status_cb_.is_null());
- base::ResetAndReturn(&status_cb_).Run(status);
-}
-
-// A macro runs current member function on |io_task_runner_| thread.
-#define FORWARD_ON_IO_THREAD(param_fn, ...) \
- io_task_runner_->PostTask( \
- FROM_HERE, base::Bind(&AudioPipelineProxyInternal::param_fn, \
- base::Unretained(proxy_.get()), ##__VA_ARGS__))
-
-AudioPipelineProxy::AudioPipelineProxy(
- scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
- scoped_refptr<MediaChannelProxy> media_channel_proxy)
- : io_task_runner_(io_task_runner),
- proxy_(new AudioPipelineProxyInternal(media_channel_proxy)),
- audio_streamer_(new AvStreamerProxy()),
- weak_factory_(this) {
- DCHECK(io_task_runner_.get());
- weak_this_ = weak_factory_.GetWeakPtr();
- thread_checker_.DetachFromThread();
-}
-
-AudioPipelineProxy::~AudioPipelineProxy() {
- DCHECK(thread_checker_.CalledOnValidThread());
- // Release the underlying object on the right thread.
- io_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&AudioPipelineProxyInternal::Release, base::Passed(&proxy_)));
-}
-
-void AudioPipelineProxy::SetClient(const AvPipelineClient& client) {
- DCHECK(thread_checker_.CalledOnValidThread());
- base::Closure pipe_read_cb = ::media::BindToCurrentLoop(
- base::Bind(&AudioPipelineProxy::OnPipeRead, weak_this_));
- FORWARD_ON_IO_THREAD(SetClient, pipe_read_cb, client);
-}
-
-void AudioPipelineProxy::Initialize(
- const ::media::AudioDecoderConfig& config,
- std::unique_ptr<CodedFrameProvider> frame_provider,
- const ::media::PipelineStatusCB& status_cb) {
- CMALOG(kLogControl) << "AudioPipelineProxy::Initialize";
- DCHECK(thread_checker_.CalledOnValidThread());
- audio_streamer_->SetCodedFrameProvider(std::move(frame_provider));
-
- AudioPipelineProxyInternal::SharedMemCB shared_mem_cb =
- ::media::BindToCurrentLoop(base::Bind(
- &AudioPipelineProxy::OnAvPipeCreated, weak_this_,
- config, status_cb));
- FORWARD_ON_IO_THREAD(CreateAvPipe, shared_mem_cb);
-}
-
-void AudioPipelineProxy::OnAvPipeCreated(
- const ::media::AudioDecoderConfig& config,
- const ::media::PipelineStatusCB& status_cb,
- std::unique_ptr<base::SharedMemory> shared_memory) {
- CMALOG(kLogControl) << "AudioPipelineProxy::OnAvPipeCreated";
- DCHECK(thread_checker_.CalledOnValidThread());
- if (!shared_memory ||
- !shared_memory->Map(kAppAudioBufferSize)) {
- status_cb.Run(::media::PIPELINE_ERROR_INITIALIZATION_FAILED);
- return;
- }
- CHECK(shared_memory->memory());
-
- std::unique_ptr<MediaMemoryChunk> shared_memory_chunk(
- new SharedMemoryChunk(std::move(shared_memory), kAppAudioBufferSize));
- std::unique_ptr<MediaMessageFifo> audio_pipe(
- new MediaMessageFifo(std::move(shared_memory_chunk), false));
- audio_pipe->ObserveWriteActivity(
- base::Bind(&AudioPipelineProxy::OnPipeWrite, weak_this_));
-
- audio_streamer_->SetMediaMessageFifo(std::move(audio_pipe));
-
- // Now proceed to the decoder/renderer initialization.
- FORWARD_ON_IO_THREAD(Initialize, config, status_cb);
-}
-
-void AudioPipelineProxy::StartFeeding() {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(audio_streamer_);
- audio_streamer_->Start();
-}
-
-void AudioPipelineProxy::Flush(const base::Closure& done_cb) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(audio_streamer_);
- audio_streamer_->StopAndFlush(done_cb);
-}
-
-void AudioPipelineProxy::Stop() {
- DCHECK(thread_checker_.CalledOnValidThread());
- if (!audio_streamer_)
- return;
- audio_streamer_->StopAndFlush(base::Bind(&IgnoreResult));
-}
-
-void AudioPipelineProxy::SetVolume(float volume) {
- DCHECK(thread_checker_.CalledOnValidThread());
- FORWARD_ON_IO_THREAD(SetVolume, volume);
-}
-
-void AudioPipelineProxy::OnPipeWrite() {
- DCHECK(thread_checker_.CalledOnValidThread());
- FORWARD_ON_IO_THREAD(NotifyPipeWrite);
-}
-
-void AudioPipelineProxy::OnPipeRead() {
- DCHECK(thread_checker_.CalledOnValidThread());
- if (audio_streamer_)
- audio_streamer_->OnFifoReadEvent();
-}
-
-} // namespace cma
-} // namespace chromecast
« no previous file with comments | « chromecast/renderer/media/audio_pipeline_proxy.h ('k') | chromecast/renderer/media/chromecast_media_renderer_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698