Chromium Code Reviews| Index: content/browser/renderer_host/media/audio_renderer_host.cc |
| diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc |
| index 9e33d82aff60381664dae784eabeba681f814309..4c0b8686169df75568ad1e4b48846059dd929dd6 100644 |
| --- a/content/browser/renderer_host/media/audio_renderer_host.cc |
| +++ b/content/browser/renderer_host/media/audio_renderer_host.cc |
| @@ -134,15 +134,16 @@ void ValidateRenderFrameId(int render_process_id, |
| class AudioRendererHost::AudioEntry |
| : public media::AudioOutputController::EventHandler { |
| public: |
| - AudioEntry(AudioRendererHost* host, |
| - int stream_id, |
| - int render_frame_id, |
| - const media::AudioParameters& params, |
| - const std::string& output_device_id, |
| - std::unique_ptr<base::SharedMemory> shared_memory, |
| - std::unique_ptr<media::AudioOutputController::SyncReader> reader); |
| ~AudioEntry() override; |
| + // Returns nullptr on failure. |
| + static std::unique_ptr<AudioRendererHost::AudioEntry> Create( |
| + AudioRendererHost* host, |
| + int stream_id, |
| + int render_frame_id, |
| + const media::AudioParameters& params, |
| + const std::string& output_device_id); |
| + |
| int stream_id() const { |
| return stream_id_; |
| } |
| @@ -151,18 +152,20 @@ class AudioRendererHost::AudioEntry |
| media::AudioOutputController* controller() const { return controller_.get(); } |
| - base::SharedMemory* shared_memory() { |
| - return shared_memory_.get(); |
| - } |
| - |
| - media::AudioOutputController::SyncReader* reader() const { |
| - return reader_.get(); |
| - } |
| + AudioSyncReader* reader() const { return reader_.get(); } |
| + // Used by ARH to track the number of active streams for UMA stats. |
| bool playing() const { return playing_; } |
| void set_playing(bool playing) { playing_ = playing; } |
| private: |
| + AudioEntry(AudioRendererHost* host, |
| + int stream_id, |
| + int render_frame_id, |
| + const media::AudioParameters& params, |
| + const std::string& output_device_id, |
| + std::unique_ptr<AudioSyncReader> reader); |
| + |
| // media::AudioOutputController::EventHandler implementation. |
| void OnCreated() override; |
| void OnPlaying() override; |
| @@ -175,16 +178,15 @@ class AudioRendererHost::AudioEntry |
| // The routing ID of the source RenderFrame. |
| const int render_frame_id_; |
| - // Shared memory for transmission of the audio data. Used by |reader_|. |
| - const std::unique_ptr<base::SharedMemory> shared_memory_; |
| - |
| // The synchronous reader to be used by |controller_|. |
| - const std::unique_ptr<media::AudioOutputController::SyncReader> reader_; |
| + const std::unique_ptr<AudioSyncReader> reader_; |
| // The AudioOutputController that manages the audio stream. |
| const scoped_refptr<media::AudioOutputController> controller_; |
| bool playing_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(AudioEntry); |
| }; |
| AudioRendererHost::AudioEntry::AudioEntry( |
| @@ -193,12 +195,10 @@ AudioRendererHost::AudioEntry::AudioEntry( |
| int render_frame_id, |
| const media::AudioParameters& params, |
| const std::string& output_device_id, |
| - std::unique_ptr<base::SharedMemory> shared_memory, |
| - std::unique_ptr<media::AudioOutputController::SyncReader> reader) |
| + std::unique_ptr<AudioSyncReader> reader) |
| : host_(host), |
| stream_id_(stream_id), |
| render_frame_id_(render_frame_id), |
| - shared_memory_(std::move(shared_memory)), |
| reader_(std::move(reader)), |
| controller_(media::AudioOutputController::Create(host->audio_manager_, |
| this, |
| @@ -206,11 +206,27 @@ AudioRendererHost::AudioEntry::AudioEntry( |
| output_device_id, |
| reader_.get())), |
| playing_(false) { |
| - DCHECK(controller_.get()); |
| + DCHECK(controller_); |
| } |
| AudioRendererHost::AudioEntry::~AudioEntry() {} |
| +// static |
| +std::unique_ptr<AudioRendererHost::AudioEntry> |
| +AudioRendererHost::AudioEntry::Create(AudioRendererHost* host, |
| + int stream_id, |
| + int render_frame_id, |
| + const media::AudioParameters& params, |
| + const std::string& output_device_id) { |
| + std::unique_ptr<AudioSyncReader> reader(AudioSyncReader::Create(params)); |
| + if (!reader) { |
| + return {}; |
| + } |
| + return std::unique_ptr<AudioEntry>( |
| + new AudioEntry(host, stream_id, render_frame_id, params, output_device_id, |
|
o1ka
2016/09/16 10:51:59
(you can use base::WrapUnique instead as well
http
Max Morin
2016/09/16 12:46:15
Done.
|
| + std::move(reader))); |
| +} |
| + |
| /////////////////////////////////////////////////////////////////////////////// |
| // AudioRendererHost implementations. |
| @@ -326,41 +342,32 @@ void AudioRendererHost::DoCompleteCreation(int stream_id) { |
| return; |
| } |
| - // Once the audio stream is created then complete the creation process by |
| - // mapping shared memory and sharing with the renderer process. |
|
o1ka
2016/09/16 10:51:59
Could you transit all the comments to the new code
Max Morin
2016/09/16 12:46:15
Done.
|
| - base::SharedMemoryHandle foreign_memory_handle; |
| - if (!entry->shared_memory()->ShareToProcess(PeerHandle(), |
| - &foreign_memory_handle)) { |
| - // If we failed to map and share the shared memory then close the audio |
| - // stream and send an error message. |
| - ReportErrorAndClose(entry->stream_id()); |
| - return; |
| - } |
| - |
| - AudioSyncReader* reader = static_cast<AudioSyncReader*>(entry->reader()); |
| - |
| + base::SharedMemory* shared_memory = entry->reader()->shared_memory(); |
| + base::CancelableSyncSocket* foreign_socket = |
| + entry->reader()->foreign_socket(); |
| + base::SharedMemoryHandle memory_handle; |
|
o1ka
2016/09/16 10:51:59
nit: I think foreign_memory_handle was more descri
Max Morin
2016/09/16 12:46:15
Done.
|
| base::SyncSocket::TransitDescriptor socket_descriptor; |
| - |
| - // If we failed to prepare the sync socket for the renderer then we fail |
| - // the construction of audio stream. |
| - if (!reader->PrepareForeignSocket(PeerHandle(), &socket_descriptor)) { |
| + size_t shared_memory_size = shared_memory->requested_size(); |
| + if (!(shared_memory->ShareToProcess(PeerHandle(), &memory_handle) && |
| + foreign_socket->PrepareTransitDescriptor(PeerHandle(), |
| + &socket_descriptor))) { |
| ReportErrorAndClose(entry->stream_id()); |
| return; |
| } |
| Send(new AudioMsg_NotifyStreamCreated( |
| - entry->stream_id(), foreign_memory_handle, socket_descriptor, |
| - entry->shared_memory()->requested_size())); |
| + stream_id, memory_handle, socket_descriptor, |
| + static_cast<uint32_t>(shared_memory_size))); |
|
o1ka
2016/09/16 10:51:59
checked_cast? (https://cs.chromium.org/chromium/sr
Max Morin
2016/09/16 12:46:15
Done.
|
| } |
| void AudioRendererHost::DidValidateRenderFrame(int stream_id, bool is_valid) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - if (!is_valid) { |
| - DLOG(WARNING) << "Render frame for stream (id=" << stream_id |
| - << ") no longer exists."; |
| - ReportErrorAndClose(stream_id); |
| - } |
| + if (!is_valid) { |
| + DLOG(WARNING) << "Render frame for stream (id=" << stream_id |
| + << ") no longer exists."; |
| + ReportErrorAndClose(stream_id); |
| + } |
| } |
| void AudioRendererHost::DoNotifyStreamStateChanged(int stream_id, |
| @@ -608,18 +615,9 @@ void AudioRendererHost::OnCreateStream(int stream_id, |
| base::Bind(&AudioRendererHost::DidValidateRenderFrame, this, |
| stream_id))); |
| - // Create the shared memory and share with the renderer process. |
| - uint32_t shared_memory_size = sizeof(media::AudioOutputBufferParameters) + |
| - AudioBus::CalculateMemorySize(params); |
| - std::unique_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); |
| - if (!shared_memory->CreateAndMapAnonymous(shared_memory_size)) { |
| - SendErrorMessage(stream_id); |
| - return; |
| - } |
| - |
| - std::unique_ptr<AudioSyncReader> reader( |
| - new AudioSyncReader(shared_memory.get(), params)); |
| - if (!reader->Init()) { |
| + std::unique_ptr<AudioEntry> entry = AudioEntry::Create( |
| + this, stream_id, render_frame_id, params, device_unique_id); |
| + if (!entry) { |
| SendErrorMessage(stream_id); |
| return; |
| } |
| @@ -629,9 +627,6 @@ void AudioRendererHost::OnCreateStream(int stream_id, |
| if (media_observer) |
| media_observer->OnCreatingAudioStream(render_process_id_, render_frame_id); |
| - std::unique_ptr<AudioEntry> entry( |
| - new AudioEntry(this, stream_id, render_frame_id, params, device_unique_id, |
| - std::move(shared_memory), std::move(reader))); |
| if (mirroring_manager_) { |
| mirroring_manager_->AddDiverter( |
| render_process_id_, entry->render_frame_id(), entry->controller()); |