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

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, 6 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
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) {
scherkus (not reviewing) 2011/06/24 21:09:26 nit: for empty one-liner functions we typically cl
enal1 2011/06/24 22:01:09 Done.
25 }
26 virtual void CreateAudioThread() {
27 }
28 };
29
16 class AudioRendererImplTest : public ::testing::Test { 30 class AudioRendererImplTest : public ::testing::Test {
17 public: 31 public:
18 static const int kRouteId = 0; 32 static const int kRouteId = 0;
19 static const int kSize = 1024; 33 static const int kSize = 1024;
20 34
35 void CallOnCreated(base::SharedMemoryHandle handle) {
36 if (renderer_->latency_type() == AudioRendererImpl::kHighLatency) {
37 renderer_->OnCreated(handle, kSize);
38 } else {
39 renderer_->OnLowLatencyCreated(handle, 0, kSize);
40 }
41 }
42
21 AudioRendererImplTest() { 43 AudioRendererImplTest() {
22 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO)); 44 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO));
23 45
24 // TODO(scherkus): use gmock with AudioMessageFilter to verify 46 // TODO(scherkus): use gmock with AudioMessageFilter to verify
25 // AudioRendererImpl calls or doesn't call Send(). 47 // AudioRendererImpl calls or doesn't call Send().
26 filter_ = new AudioMessageFilter(kRouteId); 48 filter_ = new AudioMessageFilter(kRouteId);
27 filter_->message_loop_ = message_loop_.get(); 49 filter_->message_loop_ = message_loop_.get();
28 50
29 // Create temporary shared memory. 51 // Create temporary shared memory.
30 CHECK(shared_mem_.CreateAnonymous(kSize)); 52 CHECK(shared_mem_.CreateAnonymous(kSize));
31 53
32 // Setup expectations for initialization. 54 // Setup expectations for initialization.
33 decoder_ = new media::MockAudioDecoder(); 55 decoder_ = new media::MockAudioDecoder();
34 56
35 ON_CALL(*decoder_, config()) 57 ON_CALL(*decoder_, config())
36 .WillByDefault(Return(media::AudioDecoderConfig(16, 58 .WillByDefault(Return(media::AudioDecoderConfig(16,
37 CHANNEL_LAYOUT_MONO, 59 CHANNEL_LAYOUT_MONO,
38 44100))); 60 44100)));
39 61
40 // Create and initialize audio renderer. 62 // Create and initialize audio renderer.
41 renderer_ = new AudioRendererImpl(filter_); 63 renderer_ = new TestAudioRendererImpl(filter_);
42 renderer_->set_host(&host_); 64 renderer_->set_host(&host_);
43 renderer_->Initialize(decoder_, media::NewExpectedCallback()); 65 renderer_->Initialize(decoder_, media::NewExpectedCallback());
44 66
67 // Set low latency mode, as it soon would be on by default.
68 renderer_->set_latency_type(AudioRendererImpl::kLowLatency);
69
45 // Run pending tasks and simulate responding with a created audio stream. 70 // Run pending tasks and simulate responding with a created audio stream.
46 message_loop_->RunAllPending(); 71 message_loop_->RunAllPending();
47 72
48 // Duplicate the shared memory handle so both the test and the callee can 73 // Duplicate the shared memory handle so both the test and the callee can
49 // close their copy. 74 // close their copy.
50 base::SharedMemoryHandle duplicated_handle; 75 base::SharedMemoryHandle duplicated_handle;
51 EXPECT_TRUE(shared_mem_.ShareToProcess(base::GetCurrentProcessHandle(), 76 EXPECT_TRUE(shared_mem_.ShareToProcess(base::GetCurrentProcessHandle(),
52 &duplicated_handle)); 77 &duplicated_handle));
53 78 CallOnCreated(duplicated_handle);
54 renderer_->OnCreated(duplicated_handle, kSize);
55 } 79 }
56 80
57 virtual ~AudioRendererImplTest() { 81 virtual ~AudioRendererImplTest() {
58 } 82 }
59 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_;
(...skipping 24 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) {
scherkus (not reviewing) 2011/06/24 21:09:26 if every test has its latency set as kLowLatency t
enal1 2011/06/24 22:01:09 I prefer code that can be executed in both high an
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

Powered by Google App Engine
This is Rietveld 408576698