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

Side by Side Diff: media/audio/alsa/alsa_output_unittest.cc

Issue 2101303004: Pass delay and timestamp to AudioSourceCallback::OnMoreData. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Pass target playout time to AudioSourceCallback::OnMoreData. Created 4 years, 4 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 <stdint.h> 5 #include <stdint.h>
6 6
7 #include "base/macros.h" 7 #include "base/macros.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "base/test/test_message_loop.h" 10 #include "base/test/test_message_loop.h"
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 char AlsaPcmOutputStreamTest::kSurround51[] = "surround51:CARD=foo,DEV=0"; 208 char AlsaPcmOutputStreamTest::kSurround51[] = "surround51:CARD=foo,DEV=0";
209 char AlsaPcmOutputStreamTest::kSurround70[] = "surround70:CARD=foo,DEV=0"; 209 char AlsaPcmOutputStreamTest::kSurround70[] = "surround70:CARD=foo,DEV=0";
210 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0"; 210 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0";
211 void* AlsaPcmOutputStreamTest::kFakeHints[] = { 211 void* AlsaPcmOutputStreamTest::kFakeHints[] = {
212 kSurround40, kSurround41, kSurround50, kSurround51, 212 kSurround40, kSurround41, kSurround50, kSurround51,
213 kSurround70, kSurround71, NULL }; 213 kSurround70, kSurround71, NULL };
214 char AlsaPcmOutputStreamTest::kGenericSurround50[] = "surround50"; 214 char AlsaPcmOutputStreamTest::kGenericSurround50[] = "surround50";
215 215
216 // Custom action to clear a memory buffer. 216 // Custom action to clear a memory buffer.
217 ACTION(ClearBuffer) { 217 ACTION(ClearBuffer) {
218 arg0->Zero(); 218 arg2->Zero();
219 } 219 }
220 220
221 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) { 221 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) {
222 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 222 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
223 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream->state()); 223 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream->state());
224 test_stream->Close(); 224 test_stream->Close();
225 225
226 // Should support mono. 226 // Should support mono.
227 test_stream = CreateStream(CHANNEL_LAYOUT_MONO); 227 test_stream = CreateStream(CHANNEL_LAYOUT_MONO);
228 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream->state()); 228 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream->state());
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 .WillOnce(Return(0)); 425 .WillOnce(Return(0));
426 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)) 426 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle))
427 .WillOnce(Return(0)); 427 .WillOnce(Return(0));
428 428
429 // Expect the pre-roll. 429 // Expect the pre-roll.
430 MockAudioSourceCallback mock_callback; 430 MockAudioSourceCallback mock_callback;
431 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle)) 431 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle))
432 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING)); 432 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING));
433 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _)) 433 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _))
434 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0))); 434 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0)));
435 EXPECT_CALL(mock_callback, OnMoreData(_, _, 0)) 435 EXPECT_CALL(mock_callback, OnMoreData(_, 0, _))
436 .WillRepeatedly(DoAll(ClearBuffer(), Return(kTestFramesPerPacket))); 436 .WillRepeatedly(DoAll(ClearBuffer(), Return(kTestFramesPerPacket)));
437 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) 437 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _))
438 .WillRepeatedly(Return(kTestFramesPerPacket)); 438 .WillRepeatedly(Return(kTestFramesPerPacket));
439 439
440 // Expect scheduling. 440 // Expect scheduling.
441 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) 441 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle))
442 .Times(AtLeast(2)) 442 .Times(AtLeast(2))
443 .WillRepeatedly(Return(kTestFramesPerPacket)); 443 .WillRepeatedly(Return(kTestFramesPerPacket));
444 444
445 test_stream->Start(&mock_callback); 445 test_stream->Start(&mock_callback);
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 588
589 MockAudioSourceCallback mock_callback; 589 MockAudioSourceCallback mock_callback;
590 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 590 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
591 .WillOnce(Return(SND_PCM_STATE_RUNNING)); 591 .WillOnce(Return(SND_PCM_STATE_RUNNING));
592 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) 592 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _))
593 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); 593 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0)));
594 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 594 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
595 .WillRepeatedly(Return(0)); // Buffer is full. 595 .WillRepeatedly(Return(0)); // Buffer is full.
596 596
597 // Return a partially filled packet. 597 // Return a partially filled packet.
598 EXPECT_CALL(mock_callback, OnMoreData(_, _, 0)) 598 EXPECT_CALL(mock_callback, OnMoreData(_, 0, _))
chcunningham 2016/07/29 01:21:08 Here they're setting the PcmDelay out argument to
jameswest 2016/08/26 02:08:47 Done.
599 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2))); 599 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2)));
600 600
601 bool source_exhausted; 601 bool source_exhausted;
602 test_stream->set_source_callback(&mock_callback); 602 test_stream->set_source_callback(&mock_callback);
603 test_stream->packet_size_ = kTestPacketSize; 603 test_stream->packet_size_ = kTestPacketSize;
604 test_stream->BufferPacket(&source_exhausted); 604 test_stream->BufferPacket(&source_exhausted);
605 605
606 EXPECT_EQ(kTestPacketSize / 2, test_stream->buffer_->forward_bytes()); 606 EXPECT_EQ(kTestPacketSize / 2, test_stream->buffer_->forward_bytes());
607 EXPECT_FALSE(source_exhausted); 607 EXPECT_FALSE(source_exhausted);
608 test_stream->Close(); 608 test_stream->Close();
609 } 609 }
610 610
611 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) { 611 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) {
612 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 612 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
613 InitBuffer(test_stream); 613 InitBuffer(test_stream);
614 test_stream->buffer_->Clear(); 614 test_stream->buffer_->Clear();
615 615
616 // Simulate where the underrun has occurred right after checking the delay. 616 // Simulate where the underrun has occurred right after checking the delay.
617 MockAudioSourceCallback mock_callback; 617 MockAudioSourceCallback mock_callback;
618 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 618 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
619 .WillOnce(Return(SND_PCM_STATE_RUNNING)); 619 .WillOnce(Return(SND_PCM_STATE_RUNNING));
620 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) 620 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _))
621 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); 621 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0)));
622 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 622 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
623 .WillRepeatedly(Return(0)); // Buffer is full. 623 .WillRepeatedly(Return(0)); // Buffer is full.
624 EXPECT_CALL(mock_callback, OnMoreData(_, _, 0)) 624 EXPECT_CALL(mock_callback, OnMoreData(_, 0, _))
chcunningham 2016/07/29 01:21:08 This target playout time should also roughly equal
jameswest 2016/08/26 02:08:47 Done.
625 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2))); 625 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2)));
626 626
627 bool source_exhausted; 627 bool source_exhausted;
628 test_stream->set_source_callback(&mock_callback); 628 test_stream->set_source_callback(&mock_callback);
629 test_stream->packet_size_ = kTestPacketSize; 629 test_stream->packet_size_ = kTestPacketSize;
630 test_stream->BufferPacket(&source_exhausted); 630 test_stream->BufferPacket(&source_exhausted);
631 631
632 EXPECT_EQ(kTestPacketSize / 2, test_stream->buffer_->forward_bytes()); 632 EXPECT_EQ(kTestPacketSize / 2, test_stream->buffer_->forward_bytes());
633 EXPECT_FALSE(source_exhausted); 633 EXPECT_FALSE(source_exhausted);
634 test_stream->Close(); 634 test_stream->Close();
635 } 635 }
636 636
637 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) { 637 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) {
638 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 638 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
639 InitBuffer(test_stream); 639 InitBuffer(test_stream);
640 test_stream->buffer_->Clear(); 640 test_stream->buffer_->Clear();
641 641
642 // If ALSA has underrun then we should assume a delay of zero. 642 // If ALSA has underrun then we should assume a delay of zero.
643 MockAudioSourceCallback mock_callback; 643 MockAudioSourceCallback mock_callback;
644 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 644 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
645 .WillOnce(Return(SND_PCM_STATE_XRUN)); 645 .WillOnce(Return(SND_PCM_STATE_XRUN));
646 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 646 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
647 .WillRepeatedly(Return(0)); // Buffer is full. 647 .WillRepeatedly(Return(0)); // Buffer is full.
648 EXPECT_CALL(mock_callback, OnMoreData(_, 0, 0)) 648 EXPECT_CALL(mock_callback, OnMoreData(_, 0, _))
chcunningham 2016/07/29 01:21:08 Its weird that this one was ever 0 - IIUC they are
jameswest 2016/08/26 02:08:47 It doesn't call PcmDelay because PcmState returns
chcunningham1 2016/08/27 00:35:00 Acknowledged.
649 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2))); 649 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2)));
650 650
651 bool source_exhausted; 651 bool source_exhausted;
652 test_stream->set_source_callback(&mock_callback); 652 test_stream->set_source_callback(&mock_callback);
653 test_stream->packet_size_ = kTestPacketSize; 653 test_stream->packet_size_ = kTestPacketSize;
654 test_stream->BufferPacket(&source_exhausted); 654 test_stream->BufferPacket(&source_exhausted);
655 655
656 EXPECT_EQ(kTestPacketSize / 2, test_stream->buffer_->forward_bytes()); 656 EXPECT_EQ(kTestPacketSize / 2, test_stream->buffer_->forward_bytes());
657 EXPECT_FALSE(source_exhausted); 657 EXPECT_FALSE(source_exhausted);
658 test_stream->Close(); 658 test_stream->Close();
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
858 858
859 // TODO(ajwong): Find a way to test whether or not another task has been 859 // TODO(ajwong): Find a way to test whether or not another task has been
860 // posted so we can verify that the Alsa code will indeed break the task 860 // posted so we can verify that the Alsa code will indeed break the task
861 // posting loop. 861 // posting loop.
862 862
863 test_stream->TransitionTo(AlsaPcmOutputStream::kIsClosed); 863 test_stream->TransitionTo(AlsaPcmOutputStream::kIsClosed);
864 test_stream->Close(); 864 test_stream->Close();
865 } 865 }
866 866
867 } // namespace media 867 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698