diff options
author | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-20 05:02:56 +0000 |
---|---|---|
committer | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-20 05:02:56 +0000 |
commit | 6f56d48b6d12eb675aeb78c503cc72c100b243f3 (patch) | |
tree | 36b0b18addb8543521297401ccd88f69f712f6fd /chrome | |
parent | f8fae18a398d4925bd59e80e81890c12195146cc (diff) | |
download | chromium_src-6f56d48b6d12eb675aeb78c503cc72c100b243f3.zip chromium_src-6f56d48b6d12eb675aeb78c503cc72c100b243f3.tar.gz chromium_src-6f56d48b6d12eb675aeb78c503cc72c100b243f3.tar.bz2 |
Audio related IPC messages and handlers from browser to
renderer
1. Added 4 IPC messages and corresponding handlers for
audio:
- RequestAudioPacket(int stream_id)
Browser process is hungry for audio packet, notify
renderer process to provide more.
- NotifyAudioStreamCreated(int stream_id, SharedMemoryHandler
buffer, int len)
Notify stream created event and provide buffer for
filling in the future.
- NotifyAudioStreamStateChanged(int stream_id, enum state,
nt info)
The internal state of the audio stream has chagned,
notify renderer
process of the change. int info provides additional
information of the
change, e.g. platform specific error code.
- NotifyAudioStreamVolume(int stream_id, double left, double right)
Notify the current volume for the audio stream.
2. Added methods to RenderView for creating audio streams
and delegate audio related requests to browser process with
IPC. Now the registration and bookkeeping of
AudioRendererImpl happens in RenderView (see
audio_renderers_). The reason being that the code is almost
just an base::IDMap that doesn't worth creating a new class.
Review URL: http://codereview.chromium.org/20410
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@10078 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rwxr-xr-x[-rw-r--r--] | chrome/common/render_messages.h | 35 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 25 | ||||
-rw-r--r-- | chrome/renderer/DEPS | 1 | ||||
-rw-r--r-- | chrome/renderer/media/audio_renderer_impl.cc | 18 | ||||
-rw-r--r-- | chrome/renderer/media/audio_renderer_impl.h | 7 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 97 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 35 |
7 files changed, 218 insertions, 0 deletions
diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h index e78970e..e2a0aa0 100644..100755 --- a/chrome/common/render_messages.h +++ b/chrome/common/render_messages.h @@ -1707,6 +1707,41 @@ struct ParamTraits<gfx::NativeView> { #endif // defined(OS_POSIX) +template <> +struct ParamTraits<AudioOutputStream::State> { + typedef AudioOutputStream::State param_type; + static void Write(Message* m, const param_type& p) { + m->WriteInt(p); + } + static bool Read(const Message* m, void** iter, param_type* p) { + int type; + if (!m->ReadInt(iter, &type)) + return false; + *p = static_cast<AudioOutputStream::State>(type); + return true; + } + static void Log(const param_type& p, std::wstring* l) { + std::wstring state; + switch (p) { + case AudioOutputStream::STATE_PAUSED: + state = L"AUDIO_STREAM_PAUSED"; + break; + case AudioOutputStream::STATE_STARTED: + state = L"AUDIO_STREAM_STARTED"; + break; + case AudioOutputStream::STATE_ERROR: + state = L"AUDIO_STREAM_ERROR"; + break; + default: + state = L"UNKNOWN"; + break; + } + + LogParam(state, l); + } +}; + + } // namespace IPC diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index f02f5cf..8475890 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -498,6 +498,31 @@ IPC_BEGIN_MESSAGES(View) IPC_MESSAGE_ROUTED1(ViewMsg_PopupNotificationVisiblityChanged, bool /* Whether it is visible */) + // Sent by AudioRendererHost to renderer to request an audio packet. + IPC_MESSAGE_ROUTED1(ViewMsg_RequestAudioPacket, + int /* stream id */) + + // Tell the renderer process that the audio stream has been created, renderer + // process would be given a ShareMemoryHandle that it should write to from + // then on. + IPC_MESSAGE_ROUTED3(ViewMsg_NotifyAudioStreamCreated, + int /* stream id */, + base::SharedMemoryHandle /* handle */, + int /* length */) + + // Notification message sent from AudioRendererHost to renderer for state + // update after the renderer has requested a Create/Start/Close. + IPC_MESSAGE_ROUTED3(ViewMsg_NotifyAudioStreamStateChanged, + int /* stream id */, + AudioOutputStream::State /* new state */, + int /* additional information (e.g. platform specific + error code*/) + + IPC_MESSAGE_ROUTED3(ViewMsg_NotifyAudioStreamVolume, + int /* stream id */, + double /* left channel */, + double /* right channel */) + IPC_END_MESSAGES(View) diff --git a/chrome/renderer/DEPS b/chrome/renderer/DEPS index 23643c8d..817eba7 100644 --- a/chrome/renderer/DEPS +++ b/chrome/renderer/DEPS @@ -3,6 +3,7 @@ include_rules = [ "+chrome/personalization", "+chrome/plugin", "+grit", # For generated headers + "+media/audio", "+media/base", # For HTML5 media rendering. "+sandbox/src", "+skia/ext", diff --git a/chrome/renderer/media/audio_renderer_impl.cc b/chrome/renderer/media/audio_renderer_impl.cc index 113d700..9dbd392 100644 --- a/chrome/renderer/media/audio_renderer_impl.cc +++ b/chrome/renderer/media/audio_renderer_impl.cc @@ -32,3 +32,21 @@ bool AudioRendererImpl::IsMediaFormatSupported( // TODO(hclam): check the format correct. return true; } + +void AudioRendererImpl::OnRequestPacket() { + // TODO(hclam): implement this. +} + +void AudioRendererImpl::OnCreated(base::SharedMemoryHandle handle, + size_t length) { + // TODO(hclam): implement this. +} + +void AudioRendererImpl::OnStateChanged(AudioOutputStream::State state, + int info) { + // TODO(hclam): implement this. +} + +void AudioRendererImpl::OnVolume(double left, double right) { + // TODO(hclam): implement this. +} diff --git a/chrome/renderer/media/audio_renderer_impl.h b/chrome/renderer/media/audio_renderer_impl.h index e76bf64..9d6b0b4 100644 --- a/chrome/renderer/media/audio_renderer_impl.h +++ b/chrome/renderer/media/audio_renderer_impl.h @@ -5,6 +5,8 @@ #ifndef CHROME_RENDERER_MEDIA_AUDIO_RENDERER_IMPL_H_ #define CHROME_RENDERER_MEDIA_AUDIO_RENDERER_IMPL_H_ +#include "base/shared_memory.h" +#include "media/audio/audio_output.h" #include "media/base/factory.h" #include "media/base/filters.h" @@ -31,6 +33,11 @@ class AudioRendererImpl : public media::AudioRenderer { // Answers question from the factory to see if we accept |format|. static bool IsMediaFormatSupported(const media::MediaFormat* format); + void OnRequestPacket(); + void OnStateChanged(AudioOutputStream::State state, int info); + void OnCreated(base::SharedMemoryHandle handle, size_t length); + void OnVolume(double left, double right); + protected: virtual ~AudioRendererImpl(); diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 10f314d..9528187 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -26,6 +26,7 @@ #include "chrome/renderer/about_handler.h" #include "chrome/renderer/debug_message_handler.h" #include "chrome/renderer/localized_error.h" +#include "chrome/renderer/media/audio_renderer_impl.h" #include "chrome/renderer/render_process.h" #include "chrome/renderer/user_script_slave.h" #include "chrome/renderer/visitedlink_slave.h" @@ -408,6 +409,11 @@ void RenderView::OnMessageReceived(const IPC::Message& message) { OnReceivedAutofillSuggestions) IPC_MESSAGE_HANDLER(ViewMsg_PopupNotificationVisiblityChanged, OnPopupNotificationVisiblityChanged) + IPC_MESSAGE_HANDLER(ViewMsg_RequestAudioPacket, OnRequestAudioPacket) + IPC_MESSAGE_HANDLER(ViewMsg_NotifyAudioStreamCreated, OnAudioStreamCreated) + IPC_MESSAGE_HANDLER(ViewMsg_NotifyAudioStreamStateChanged, + OnAudioStreamStateChanged) + IPC_MESSAGE_HANDLER(ViewMsg_NotifyAudioStreamVolume, OnAudioStreamVolume) // Have the super handle all other messages. IPC_MESSAGE_UNHANDLED(RenderWidget::OnMessageReceived(message)) @@ -2864,3 +2870,94 @@ MessageLoop* RenderView::GetMessageLoopForIO() { return g_render_thread->owner_loop(); return NULL; } + +void RenderView::OnRequestAudioPacket(int stream_id) { + AudioRendererImpl* audio_renderer = audio_renderers_.Lookup(stream_id); + if (!audio_renderer){ + NOTREACHED(); + return; + } + audio_renderer->OnRequestPacket(); +} + +void RenderView::OnAudioStreamCreated( + int stream_id, base::SharedMemoryHandle handle, int length) { + AudioRendererImpl* audio_renderer = audio_renderers_.Lookup(stream_id); + if (!audio_renderer){ + NOTREACHED(); + return; + } + audio_renderer->OnCreated(handle, length); +} + +void RenderView::OnAudioStreamStateChanged( + int stream_id, AudioOutputStream::State state, int info) { + AudioRendererImpl* audio_renderer = audio_renderers_.Lookup(stream_id); + if (!audio_renderer){ + NOTREACHED(); + return; + } + audio_renderer->OnStateChanged(state, info); +} + +void RenderView::OnAudioStreamVolume(int stream_id, double left, double right) { + AudioRendererImpl* audio_renderer = audio_renderers_.Lookup(stream_id); + if (!audio_renderer){ + NOTREACHED(); + return; + } + audio_renderer->OnVolume(left, right); +} + +int32 RenderView::CreateAudioStream(AudioRendererImpl* audio_renderer, + AudioManager::Format format, int channels, + int sample_rate, int bits_per_sample, + size_t packet_size) { + // TODO(hclam): make sure this method is called on render thread. + // Loop through the map and make sure there's no renderer already in the map. + for (IDMap<AudioRendererImpl>::const_iterator iter = audio_renderers_.begin(); + iter != audio_renderers_.end(); ++iter) { + DCHECK(iter->second != audio_renderer); + } + + // Add to map and send the IPC to browser process. + int32 stream_id = audio_renderers_.Add(audio_renderer); + ViewHostMsg_Audio_CreateStream params; + params.format = format; + params.channels = channels; + params.sample_rate = sample_rate; + params.bits_per_sample = bits_per_sample; + params.packet_size = packet_size; + Send(new ViewHostMsg_CreateAudioStream(routing_id_, stream_id, params)); + return stream_id; +} + +void RenderView::StartAudioStream(int stream_id) { + // TODO(hclam): make sure this method is called on render thread. + DCHECK(audio_renderers_.Lookup(stream_id) != NULL); + Send(new ViewHostMsg_StartAudioStream(routing_id_, stream_id)); +} + +void RenderView::CloseAudioStream(int stream_id) { + // TODO(hclam): make sure this method is called on render thread. + DCHECK(audio_renderers_.Lookup(stream_id) != NULL); + Send(new ViewHostMsg_CloseAudioStream(routing_id_, stream_id)); +} + +void RenderView::NotifyAudioPacketReady(int stream_id) { + // TODO(hclam): make sure this method is called on render thread. + DCHECK(audio_renderers_.Lookup(stream_id) != NULL); + Send(new ViewHostMsg_NotifyAudioPacketReady(routing_id_, stream_id)); +} + +void RenderView::GetAudioVolume(int stream_id) { + // TODO(hclam): make sure this method is called on render thread. + DCHECK(audio_renderers_.Lookup(stream_id) != NULL); + Send(new ViewHostMsg_GetAudioVolume(routing_id_, stream_id)); +} + +void RenderView::SetAudioVolume(int stream_id, double left, double right) { + // TODO(hclam): make sure this method is called on render thread. + DCHECK(audio_renderers_.Lookup(stream_id) != NULL); + Send(new ViewHostMsg_SetAudioVolume(routing_id_, stream_id, left, right)); +} diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 59e2fad..9ff7e06 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -11,6 +11,8 @@ #include "base/basictypes.h" #include "base/gfx/point.h" #include "base/gfx/rect.h" +#include "base/id_map.h" +#include "base/shared_memory.h" #include "base/timer.h" #include "base/values.h" #include "build/build_config.h" @@ -23,6 +25,7 @@ #include "chrome/renderer/external_host_bindings.h" #include "chrome/renderer/external_js_object.h" #include "chrome/renderer/render_widget.h" +#include "media/audio/audio_output.h" #include "testing/gtest/include/gtest/gtest_prod.h" #include "webkit/glue/console_message_level.h" #include "webkit/glue/dom_serializer_delegate.h" @@ -38,6 +41,7 @@ #pragma warning(disable: 4250) #endif +class AudioRendererImpl; class DictionaryValue; class DebugMessageHandler; class FilePath; @@ -342,6 +346,19 @@ class RenderView : public RenderWidget, // the renderer, which processes all IPC, to any I/O should be non-blocking. MessageLoop* GetMessageLoopForIO(); + // Register the audio renderer and try to create an audio output stream in the + // browser process. Always return a stream id. Audio renderer will then + // receive state change notification messages. + int32 CreateAudioStream(AudioRendererImpl* renderer, + AudioManager::Format format, int channels, + int sample_rate, int bits_per_sample, + size_t packet_size); + void StartAudioStream(int stream_id); + void CloseAudioStream(int stream_id); + void NotifyAudioPacketReady(int stream_id); + void GetAudioVolume(int stream_id); + void SetAudioVolume(int stream_id, double left, double right); + private: FRIEND_TEST(RenderViewTest, OnLoadAlternateHTMLText); FRIEND_TEST(RenderViewTest, OnNavStateChanged); @@ -524,6 +541,21 @@ class RenderView : public RenderWidget, // grouping, and should form our own grouping. void OnDisassociateFromPopupCount(); + // Received when browser process wants more audio packet. + void OnRequestAudioPacket(int stream_id); + + // Received when browser process has created an audio output stream for us. + void OnAudioStreamCreated(int stream_id, base::SharedMemoryHandle handle, + int length); + + // Received when internal state of browser process' audio output device has + // changed. + void OnAudioStreamStateChanged(int stream_id, AudioOutputStream::State state, + int info); + + // Notification of volume property of an audio output stream. + void OnAudioStreamVolume(int stream_id, double left, double right); + // Switches the frame's CSS media type to "print" and calculate the number of // printed pages that are to be expected. |frame| will be used to calculate // the number of expected pages for this frame only. @@ -752,6 +784,9 @@ class RenderView : public RenderWidget, // change but is overridden by tests. int delay_seconds_for_form_state_sync_; + // A set of audio renderers registered to use IPC for audio output. + IDMap<AudioRendererImpl> audio_renderers_; + DISALLOW_COPY_AND_ASSIGN(RenderView); }; |