Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: content/renderer/media/audio_renderer_impl_unittest.cc

Issue 7253003: Change audio renderer to communicate with host using low latency codepath. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/renderer/media/audio_renderer_impl.cc ('k') | media/audio/audio_output_controller.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/process_util.h" 5 #include "base/process_util.h"
6 #include "content/common/media/audio_messages.h" 6 #include "content/common/media/audio_messages.h"
7 #include "content/renderer/media/audio_renderer_impl.h" 7 #include "content/renderer/media/audio_renderer_impl.h"
8 #include "media/base/data_buffer.h" 8 #include "media/base/data_buffer.h"
9 #include "media/base/mock_callback.h" 9 #include "media/base/mock_callback.h"
10 #include "media/base/mock_filter_host.h" 10 #include "media/base/mock_filter_host.h"
11 #include "media/base/mock_filters.h" 11 #include "media/base/mock_filters.h"
12 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
13 13
14 using ::testing::Return; 14 using ::testing::Return;
15 15
16 // Class we would be tesing. The only difference between it and "real" one
17 // is that test class does not open sockets and launch audio thread.
18 class TestAudioRendererImpl : public AudioRendererImpl {
19 public:
20 explicit TestAudioRendererImpl(AudioMessageFilter* filter)
21 : AudioRendererImpl(filter) {
22 }
23 private:
24 virtual void CreateSocket(base::SyncSocket::Handle socket_handle) {}
25 virtual void CreateAudioThread() {}
26 };
27
16 class AudioRendererImplTest : public ::testing::Test { 28 class AudioRendererImplTest : public ::testing::Test {
17 public: 29 public:
18 static const int kRouteId = 0; 30 static const int kRouteId = 0;
19 static const int kSize = 1024; 31 static const int kSize = 1024;
20 32
33 static void SetUpTestCase() {
34 // Set low latency mode, as it soon would be on by default.
35 AudioRendererImpl::set_latency_type(AudioRendererImpl::kLowLatency);
36 }
37
21 AudioRendererImplTest() { 38 AudioRendererImplTest() {
22 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO)); 39 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO));
23 40
24 // TODO(scherkus): use gmock with AudioMessageFilter to verify 41 // TODO(scherkus): use gmock with AudioMessageFilter to verify
25 // AudioRendererImpl calls or doesn't call Send(). 42 // AudioRendererImpl calls or doesn't call Send().
26 filter_ = new AudioMessageFilter(kRouteId); 43 filter_ = new AudioMessageFilter(kRouteId);
27 filter_->message_loop_ = message_loop_.get(); 44 filter_->message_loop_ = message_loop_.get();
28 45
29 // Create temporary shared memory. 46 // Create temporary shared memory.
30 CHECK(shared_mem_.CreateAnonymous(kSize)); 47 CHECK(shared_mem_.CreateAnonymous(kSize));
31 48
32 // Setup expectations for initialization. 49 // Setup expectations for initialization.
33 decoder_ = new media::MockAudioDecoder(); 50 decoder_ = new media::MockAudioDecoder();
34 51
35 ON_CALL(*decoder_, config()) 52 ON_CALL(*decoder_, config())
36 .WillByDefault(Return(media::AudioDecoderConfig(16, 53 .WillByDefault(Return(media::AudioDecoderConfig(16,
37 CHANNEL_LAYOUT_MONO, 54 CHANNEL_LAYOUT_MONO,
38 44100))); 55 44100)));
39 56
40 // Create and initialize audio renderer. 57 // Create and initialize audio renderer.
41 renderer_ = new AudioRendererImpl(filter_); 58 renderer_ = new TestAudioRendererImpl(filter_);
42 renderer_->set_host(&host_); 59 renderer_->set_host(&host_);
43 renderer_->Initialize(decoder_, media::NewExpectedCallback()); 60 renderer_->Initialize(decoder_, media::NewExpectedCallback());
44 61
45 // Run pending tasks and simulate responding with a created audio stream. 62 // Run pending tasks and simulate responding with a created audio stream.
46 message_loop_->RunAllPending(); 63 message_loop_->RunAllPending();
47 64
48 // Duplicate the shared memory handle so both the test and the callee can 65 // Duplicate the shared memory handle so both the test and the callee can
49 // close their copy. 66 // close their copy.
50 base::SharedMemoryHandle duplicated_handle; 67 base::SharedMemoryHandle duplicated_handle;
51 EXPECT_TRUE(shared_mem_.ShareToProcess(base::GetCurrentProcessHandle(), 68 EXPECT_TRUE(shared_mem_.ShareToProcess(base::GetCurrentProcessHandle(),
52 &duplicated_handle)); 69 &duplicated_handle));
53 70 CallOnCreated(duplicated_handle);
54 renderer_->OnCreated(duplicated_handle, kSize);
55 } 71 }
56 72
57 virtual ~AudioRendererImplTest() { 73 virtual ~AudioRendererImplTest() {
58 } 74 }
59 75
76 void CallOnCreated(base::SharedMemoryHandle handle) {
77 if (renderer_->latency_type() == AudioRendererImpl::kHighLatency) {
78 renderer_->OnCreated(handle, kSize);
79 } else {
80 renderer_->OnLowLatencyCreated(handle, 0, kSize);
81 }
82 }
83
60 protected: 84 protected:
61 // Fixtures. 85 // Fixtures.
62 scoped_ptr<MessageLoop> message_loop_; 86 scoped_ptr<MessageLoop> message_loop_;
63 scoped_refptr<AudioMessageFilter> filter_; 87 scoped_refptr<AudioMessageFilter> filter_;
64 base::SharedMemory shared_mem_; 88 base::SharedMemory shared_mem_;
65 media::MockFilterHost host_; 89 media::MockFilterHost host_;
66 scoped_refptr<media::MockAudioDecoder> decoder_; 90 scoped_refptr<media::MockAudioDecoder> decoder_;
67 scoped_refptr<AudioRendererImpl> renderer_; 91 scoped_refptr<AudioRendererImpl> renderer_;
68 92
69 private: 93 private:
(...skipping 19 matching lines...) Expand all
89 message_loop_->RunAllPending(); 113 message_loop_->RunAllPending();
90 } 114 }
91 115
92 TEST_F(AudioRendererImplTest, Stop) { 116 TEST_F(AudioRendererImplTest, Stop) {
93 // Execute Stop() codepath to create an IPC message. 117 // Execute Stop() codepath to create an IPC message.
94 renderer_->Stop(media::NewExpectedCallback()); 118 renderer_->Stop(media::NewExpectedCallback());
95 message_loop_->RunAllPending(); 119 message_loop_->RunAllPending();
96 120
97 // Run AudioMessageFilter::Delegate methods, which can be executed after being 121 // Run AudioMessageFilter::Delegate methods, which can be executed after being
98 // stopped. AudioRendererImpl shouldn't create any messages. 122 // stopped. AudioRendererImpl shouldn't create any messages.
99 renderer_->OnRequestPacket(AudioBuffersState(kSize, 0)); 123 if (renderer_->latency_type() == AudioRendererImpl::kHighLatency) {
124 renderer_->OnRequestPacket(AudioBuffersState(kSize, 0));
125 }
100 renderer_->OnStateChanged(kAudioStreamError); 126 renderer_->OnStateChanged(kAudioStreamError);
101 renderer_->OnStateChanged(kAudioStreamPlaying); 127 renderer_->OnStateChanged(kAudioStreamPlaying);
102 renderer_->OnStateChanged(kAudioStreamPaused); 128 renderer_->OnStateChanged(kAudioStreamPaused);
103 renderer_->OnCreated(shared_mem_.handle(), kSize); 129 CallOnCreated(shared_mem_.handle());
104 renderer_->OnVolume(0.5); 130 renderer_->OnVolume(0.5);
105 131
106 // It's possible that the upstream decoder replies right after being stopped. 132 // It's possible that the upstream decoder replies right after being stopped.
107 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize)); 133 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize));
108 renderer_->ConsumeAudioSamples(buffer); 134 renderer_->ConsumeAudioSamples(buffer);
109 } 135 }
110 136
111 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_SetPlaybackRate) { 137 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_SetPlaybackRate) {
112 // Kill the message loop and verify SetPlaybackRate() still works. 138 // Kill the message loop and verify SetPlaybackRate() still works.
113 message_loop_.reset(); 139 message_loop_.reset();
(...skipping 10 matching lines...) Expand all
124 renderer_->Stop(media::NewExpectedCallback()); 150 renderer_->Stop(media::NewExpectedCallback());
125 } 151 }
126 152
127 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_ConsumeAudioSamples) { 153 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_ConsumeAudioSamples) {
128 // Kill the message loop and verify OnReadComplete() still works. 154 // Kill the message loop and verify OnReadComplete() still works.
129 message_loop_.reset(); 155 message_loop_.reset();
130 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize)); 156 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize));
131 renderer_->ConsumeAudioSamples(buffer); 157 renderer_->ConsumeAudioSamples(buffer);
132 renderer_->Stop(media::NewExpectedCallback()); 158 renderer_->Stop(media::NewExpectedCallback());
133 } 159 }
OLDNEW
« no previous file with comments | « content/renderer/media/audio_renderer_impl.cc ('k') | media/audio/audio_output_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698