15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_AUDIO_SYNC_READER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_MEDIA_AUDIO_SYNC_READER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/process.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sync_socket.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_output_controller.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_bus.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_POSIX) 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/file_descriptor_posix.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SharedMemory; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A AudioOutputController::SyncReader implementation using SyncSocket. This 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is used by AudioOutputController to provide a low latency data source for 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// transmitting audio packets between the browser process and the renderer 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioSyncReader : public media::AudioOutputController::SyncReader { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioSyncReader(base::SharedMemory* shared_memory, 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const media::AudioParameters& params); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AudioSyncReader(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // media::AudioOutputController::SyncReader implementations. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdatePendingBytes(uint32 bytes) OVERRIDE; 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void Read(media::AudioBus* dest) OVERRIDE; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Close() OVERRIDE; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Init(); 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool PrepareForeignSocket(base::ProcessHandle process_handle, 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::SyncSocket::TransitDescriptor* descriptor); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Blocks until data is ready for reading or a timeout expires. Returns false 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // if an error or timeout occurs. 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool WaitUntilDataIsReady(); 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const base::SharedMemory* const shared_memory_; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Mutes all incoming samples. This is used to prevent audible sound 533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // during automated testing. 540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const bool mute_audio_; 553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Socket for transmitting audio data. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::CancelableSyncSocket> socket_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Socket to be used by the renderer. The reference is released after 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrepareForeignSocketHandle() is called and ran successfully. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::CancelableSyncSocket> foreign_socket_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shared memory wrapper used for transferring audio data to Read() callers. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<media::AudioBus> output_bus_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maximum amount of audio data which can be transferred in one Read() call. 670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const int packet_size_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Track the number of times the renderer missed its real-time deadline and 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // report a UMA stat during destruction. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t renderer_callback_count_; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t renderer_missed_callback_count_; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The maximum amount of time to wait for data from the renderer. Calculated 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // from the parameters given at construction. 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const base::TimeDelta maximum_wait_time_; 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The index of the audio buffer we're expecting to be sent from the renderer; 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // used to block with timeout for audio data. 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 buffer_index_; 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AudioSyncReader); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_BROWSER_RENDERER_HOST_MEDIA_AUDIO_SYNC_READER_H_ 88