Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 // Tests PPB_MediaStreamAudioTrack interface. | 5 // Tests PPB_MediaStreamAudioTrack interface. |
| 6 | 6 |
| 7 #include "ppapi/tests/test_media_stream_audio_track.h" | 7 #include "ppapi/tests/test_media_stream_audio_track.h" |
| 8 | 8 |
| 9 #include "ppapi/c/private/ppb_testing_private.h" | 9 #include "ppapi/c/private/ppb_testing_private.h" |
| 10 #include "ppapi/cpp/audio_buffer.h" | 10 #include "ppapi/cpp/audio_buffer.h" |
| 11 #include "ppapi/cpp/completion_callback.h" | 11 #include "ppapi/cpp/completion_callback.h" |
| 12 #include "ppapi/cpp/instance.h" | 12 #include "ppapi/cpp/instance.h" |
| 13 #include "ppapi/cpp/var.h" | 13 #include "ppapi/cpp/var.h" |
| 14 #include "ppapi/tests/test_utils.h" | 14 #include "ppapi/tests/test_utils.h" |
| 15 #include "ppapi/tests/testing_instance.h" | 15 #include "ppapi/tests/testing_instance.h" |
| 16 | 16 |
| 17 REGISTER_TEST_CASE(MediaStreamAudioTrack); | 17 REGISTER_TEST_CASE(MediaStreamAudioTrack); |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 // Real max defined in | 21 // Real max defined in |
|
dmichael (off chromium)
2014/07/23 20:08:42
s/max/constants
Anand Mistry (off Chromium)
2014/07/24 01:28:28
Done.
| |
| 22 // content/renderer/pepper/pepper_media_stream_audio_track_host.cc. | 22 // content/renderer/pepper/pepper_media_stream_audio_track_host.cc. |
| 23 const int32_t kMaxNumberOfBuffers = 1000; | 23 const int32_t kMaxNumberOfBuffers = 1000; |
| 24 const int32_t kMinDuration = 10; | |
| 25 const int32_t kMaxDuration = 10000; | |
| 24 const int32_t kTimes = 3; | 26 const int32_t kTimes = 3; |
| 25 const char kJSCode[] = | 27 const char kJSCode[] = |
| 26 "function gotStream(stream) {" | 28 "function gotStream(stream) {" |
| 27 " test_stream = stream;" | 29 " test_stream = stream;" |
| 28 " var track = stream.getAudioTracks()[0];" | 30 " var track = stream.getAudioTracks()[0];" |
| 29 " var plugin = document.getElementById('plugin');" | 31 " var plugin = document.getElementById('plugin');" |
| 30 " plugin.postMessage(track);" | 32 " plugin.postMessage(track);" |
| 31 "}" | 33 "}" |
| 32 "var constraints = {" | 34 "var constraints = {" |
| 33 " audio: true," | 35 " audio: true," |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 194 ASSERT_GE(buffer.GetTimestamp(), timestamp); | 196 ASSERT_GE(buffer.GetTimestamp(), timestamp); |
| 195 timestamp = buffer.GetTimestamp(); | 197 timestamp = buffer.GetTimestamp(); |
| 196 | 198 |
| 197 ASSERT_GT(buffer.GetDataBufferSize(), 0U); | 199 ASSERT_GT(buffer.GetDataBufferSize(), 0U); |
| 198 ASSERT_TRUE(buffer.GetDataBuffer() != NULL); | 200 ASSERT_TRUE(buffer.GetDataBuffer() != NULL); |
| 199 | 201 |
| 200 audio_track_.RecycleBuffer(buffer); | 202 audio_track_.RecycleBuffer(buffer); |
| 201 } | 203 } |
| 202 } | 204 } |
| 203 | 205 |
| 206 // Configure buffer duration. | |
| 207 struct { | |
| 208 int32_t duration; | |
| 209 int32_t expect_result; | |
| 210 } durations[] = { | |
| 211 { kMinDuration, PP_OK }, | |
| 212 { kMaxDuration, PP_OK }, // This will take ~30 seconds. | |
|
dmichael (off chromium)
2014/07/23 20:08:42
We can't have the test take that long.
Maybe you
Anand Mistry (off Chromium)
2014/07/24 01:28:28
Done.
| |
| 213 { 123, PP_OK }, | |
| 214 { kMinDuration - 1, PP_ERROR_BADARGUMENT }, | |
| 215 { kMaxDuration + 1, PP_ERROR_BADARGUMENT }, | |
| 216 }; | |
| 217 for (size_t i = 0; i < sizeof(durations) / sizeof(durations[0]); ++i) { | |
|
dmichael (off chromium)
2014/07/23 20:08:42
Instead of duplicating this part, perhaps you can
Anand Mistry (off Chromium)
2014/07/24 01:28:28
Done.
| |
| 218 TestCompletionCallback cc_configure(instance_->pp_instance(), false); | |
| 219 int32_t attrib_list[] = { | |
| 220 PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION, durations[i].duration, | |
| 221 PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE, | |
| 222 }; | |
| 223 cc_configure.WaitForResult( | |
| 224 audio_track_.Configure(attrib_list, cc_configure.GetCallback())); | |
| 225 ASSERT_EQ(durations[i].expect_result, cc_configure.result()); | |
| 226 | |
| 227 // Get some buffers. This always works, but the buffer size will vary. | |
| 228 for (int j = 0; j < kTimes; ++j) { | |
| 229 TestCompletionCallbackWithOutput<pp::AudioBuffer> cc_get_buffer( | |
| 230 instance_->pp_instance(), false); | |
| 231 cc_get_buffer.WaitForResult( | |
| 232 audio_track_.GetBuffer(cc_get_buffer.GetCallback())); | |
| 233 ASSERT_EQ(PP_OK, cc_get_buffer.result()); | |
| 234 pp::AudioBuffer buffer = cc_get_buffer.output(); | |
| 235 ASSERT_FALSE(buffer.is_null()); | |
| 236 ASSERT_TRUE(IsSampleRateValid(buffer.GetSampleRate())); | |
| 237 ASSERT_EQ(buffer.GetSampleSize(), PP_AUDIOBUFFER_SAMPLESIZE_16_BITS); | |
| 238 | |
| 239 ASSERT_GE(buffer.GetTimestamp(), timestamp); | |
| 240 timestamp = buffer.GetTimestamp(); | |
| 241 | |
| 242 ASSERT_TRUE(buffer.GetDataBuffer() != NULL); | |
| 243 if (durations[i].expect_result == PP_OK) { | |
| 244 uint32_t buffer_size = buffer.GetDataBufferSize(); | |
| 245 uint32_t channels = buffer.GetNumberOfChannels(); | |
| 246 uint32_t sample_rate = buffer.GetSampleRate(); | |
| 247 uint32_t bytes_per_frame = channels * 2; | |
| 248 int32_t duration = durations[i].duration; | |
| 249 ASSERT_EQ(buffer_size % bytes_per_frame, 0U); | |
| 250 ASSERT_EQ(buffer_size, | |
| 251 (duration * sample_rate * bytes_per_frame) / 1000); | |
| 252 } else { | |
| 253 ASSERT_GT(buffer.GetDataBufferSize(), 0U); | |
| 254 } | |
| 255 | |
| 256 audio_track_.RecycleBuffer(buffer); | |
| 257 } | |
| 258 } | |
| 259 | |
| 204 // Configure should fail while plugin holds buffers. | 260 // Configure should fail while plugin holds buffers. |
| 205 { | 261 { |
| 206 TestCompletionCallbackWithOutput<pp::AudioBuffer> cc_get_buffer( | 262 TestCompletionCallbackWithOutput<pp::AudioBuffer> cc_get_buffer( |
| 207 instance_->pp_instance(), false); | 263 instance_->pp_instance(), false); |
| 208 cc_get_buffer.WaitForResult( | 264 cc_get_buffer.WaitForResult( |
| 209 audio_track_.GetBuffer(cc_get_buffer.GetCallback())); | 265 audio_track_.GetBuffer(cc_get_buffer.GetCallback())); |
| 210 ASSERT_EQ(PP_OK, cc_get_buffer.result()); | 266 ASSERT_EQ(PP_OK, cc_get_buffer.result()); |
| 211 pp::AudioBuffer buffer = cc_get_buffer.output(); | 267 pp::AudioBuffer buffer = cc_get_buffer.output(); |
| 212 int32_t attrib_list[] = { | 268 int32_t attrib_list[] = { |
| 213 PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS, 0, | 269 PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS, 0, |
| 214 PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE, | 270 PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE, |
| 215 }; | 271 }; |
| 216 TestCompletionCallback cc_configure(instance_->pp_instance(), false); | 272 TestCompletionCallback cc_configure(instance_->pp_instance(), false); |
| 217 cc_configure.WaitForResult( | 273 cc_configure.WaitForResult( |
| 218 audio_track_.Configure(attrib_list, cc_configure.GetCallback())); | 274 audio_track_.Configure(attrib_list, cc_configure.GetCallback())); |
| 219 ASSERT_EQ(PP_ERROR_INPROGRESS, cc_configure.result()); | 275 ASSERT_EQ(PP_ERROR_INPROGRESS, cc_configure.result()); |
| 220 audio_track_.RecycleBuffer(buffer); | 276 audio_track_.RecycleBuffer(buffer); |
| 221 } | 277 } |
| 222 | 278 |
| 223 // Close the track. | 279 // Close the track. |
| 224 audio_track_.Close(); | 280 audio_track_.Close(); |
| 225 ASSERT_TRUE(audio_track_.HasEnded()); | 281 ASSERT_TRUE(audio_track_.HasEnded()); |
| 226 audio_track_ = pp::MediaStreamAudioTrack(); | 282 audio_track_ = pp::MediaStreamAudioTrack(); |
| 227 PASS(); | 283 PASS(); |
| 228 } | 284 } |
| OLD | NEW |