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_RENDERER_MEDIA_AUDIO_INPUT_MESSAGE_FILTER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_RENDERER_MEDIA_AUDIO_INPUT_MESSAGE_FILTER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/shared_memory.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sync_socket.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_input_ipc.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MessageLoopProxy;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// MessageFilter that handles audio input messages and delegates them to
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// audio capturers. Created on render thread, AudioMessageFilter is operated on
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// IO thread (secondary thread of render process), it intercepts audio messages
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and process them on IO thread since these messages are time critical.
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass CONTENT_EXPORT AudioInputMessageFilter : public IPC::MessageFilter {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit AudioInputMessageFilter(
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const scoped_refptr<base::MessageLoopProxy>& io_message_loop);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getter for the one AudioInputMessageFilter object.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AudioInputMessageFilter* Get();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Create an AudioInputIPC to be owned by one delegate.  |render_view_id| is
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the render view containing the entity consuming the audio.
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The returned object is not thread-safe, and must be used on
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |io_message_loop|.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<media::AudioInputIPC> CreateAudioInputIPC(int render_view_id);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> io_message_loop() const {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return io_message_loop_;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Implementation of media::AudioInputIPC which augments IPC calls with
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // stream_id and the destination render_view_id.
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class AudioInputIPCImpl;
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AudioInputMessageFilter();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends an IPC message using |channel_|.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Send(IPC::Message* message);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // IPC::MessageFilter override. Called on |io_message_loop_|.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnFilterAdded(IPC::Sender* sender) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnFilterRemoved() OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChannelClosing() OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Received when browser process has created an audio input stream.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnStreamCreated(int stream_id,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       base::SharedMemoryHandle handle,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::SyncSocket::Handle socket_handle,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::FileDescriptor socket_descriptor,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       uint32 length,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       uint32 total_segments);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notification of volume property of an audio input stream.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnStreamVolume(int stream_id, double volume);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Received when internal state of browser process' audio input stream has
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // changed.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnStreamStateChanged(int stream_id,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            media::AudioInputIPCDelegate::State state);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A map of stream ids to delegates.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDMap<media::AudioInputIPCDelegate> delegates_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // IPC sender for Send(), must only be accesed on |io_message_loop_|.
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  IPC::Sender* sender_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Message loop on which IPC calls are driven.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const scoped_refptr<base::MessageLoopProxy> io_message_loop_;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The singleton instance for this filter.
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static AudioInputMessageFilter* g_filter;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AudioInputMessageFilter);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_RENDERER_MEDIA_AUDIO_INPUT_MESSAGE_FILTER_H_
98