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