OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/api/test/fakeaudiocapturemodule.h" | 11 #include "webrtc/api/test/fakeaudiocapturemodule.h" |
12 | 12 |
13 #include "webrtc/base/common.h" | 13 #include "webrtc/base/common.h" |
14 #include "webrtc/base/refcount.h" | 14 #include "webrtc/base/refcount.h" |
15 #include "webrtc/base/thread.h" | 15 #include "webrtc/base/thread.h" |
16 #include "webrtc/base/timeutils.h" | 16 #include "webrtc/base/timeutils.h" |
17 | 17 |
18 // Audio sample value that is high enough that it doesn't occur naturally when | 18 // Audio sample value that is high enough that it doesn't occur naturally when |
19 // frames are being faked. E.g. NetEq will not generate this large sample value | 19 // frames are being faked. E.g. NetEq will not generate this large sample value |
20 // unless it has received an audio frame containing a sample of this value. | 20 // unless it has received an audio frame containing a sample of this value. |
21 // Even simpler buffers would likely just contain audio sample values of 0. | 21 // Even simpler buffers would likely just contain audio sample values of 0. |
22 static const int kHighSampleValue = 10000; | 22 static const int kHighSampleValue = 10000; |
23 | 23 |
24 // Same value as src/modules/audio_device/main/source/audio_device_config.h in | 24 // Same value as src/modules/audio_device/main/source/audio_device_config.h in |
25 // https://code.google.com/p/webrtc/ | 25 // https://code.google.com/p/webrtc/ |
26 static const uint32_t kAdmMaxIdleTimeProcess = 1000; | 26 static const int kAdmMaxIdleTimeProcess = 1000; |
27 | 27 |
28 // Constants here are derived by running VoE using a real ADM. | 28 // Constants here are derived by running VoE using a real ADM. |
29 // The constants correspond to 10ms of mono audio at 44kHz. | 29 // The constants correspond to 10ms of mono audio at 44kHz. |
30 static const int kTimePerFrameMs = 10; | 30 static const int kTimePerFrameMs = 10; |
31 static const uint8_t kNumberOfChannels = 1; | 31 static const uint8_t kNumberOfChannels = 1; |
32 static const int kSamplesPerSecond = 44000; | 32 static const int kSamplesPerSecond = 44000; |
33 static const int kTotalDelayMs = 0; | 33 static const int kTotalDelayMs = 0; |
34 static const int kClockDriftMs = 0; | 34 static const int kClockDriftMs = 0; |
35 static const uint32_t kMaxVolume = 14392; | 35 static const uint32_t kMaxVolume = 14392; |
36 | 36 |
(...skipping 29 matching lines...) Expand all Loading... |
66 } | 66 } |
67 return capture_module; | 67 return capture_module; |
68 } | 68 } |
69 | 69 |
70 int FakeAudioCaptureModule::frames_received() const { | 70 int FakeAudioCaptureModule::frames_received() const { |
71 rtc::CritScope cs(&crit_); | 71 rtc::CritScope cs(&crit_); |
72 return frames_received_; | 72 return frames_received_; |
73 } | 73 } |
74 | 74 |
75 int64_t FakeAudioCaptureModule::TimeUntilNextProcess() { | 75 int64_t FakeAudioCaptureModule::TimeUntilNextProcess() { |
76 const uint32_t current_time = rtc::Time(); | 76 const int64_t current_time = rtc::TimeMillis(); |
77 if (current_time < last_process_time_ms_) { | 77 if (current_time < last_process_time_ms_) { |
78 // TODO: wraparound could be handled more gracefully. | 78 // TODO: wraparound could be handled more gracefully. |
79 return 0; | 79 return 0; |
80 } | 80 } |
81 const uint32_t elapsed_time = current_time - last_process_time_ms_; | 81 const int64_t elapsed_time = current_time - last_process_time_ms_; |
82 if (kAdmMaxIdleTimeProcess < elapsed_time) { | 82 if (kAdmMaxIdleTimeProcess < elapsed_time) { |
83 return 0; | 83 return 0; |
84 } | 84 } |
85 return kAdmMaxIdleTimeProcess - elapsed_time; | 85 return kAdmMaxIdleTimeProcess - elapsed_time; |
86 } | 86 } |
87 | 87 |
88 void FakeAudioCaptureModule::Process() { | 88 void FakeAudioCaptureModule::Process() { |
89 last_process_time_ms_ = rtc::Time(); | 89 last_process_time_ms_ = rtc::TimeMillis(); |
90 } | 90 } |
91 | 91 |
92 int32_t FakeAudioCaptureModule::ActiveAudioLayer( | 92 int32_t FakeAudioCaptureModule::ActiveAudioLayer( |
93 AudioLayer* /*audio_layer*/) const { | 93 AudioLayer* /*audio_layer*/) const { |
94 ASSERT(false); | 94 ASSERT(false); |
95 return 0; | 95 return 0; |
96 } | 96 } |
97 | 97 |
98 webrtc::AudioDeviceModule::ErrorCode FakeAudioCaptureModule::LastError() const { | 98 webrtc::AudioDeviceModule::ErrorCode FakeAudioCaptureModule::LastError() const { |
99 ASSERT(false); | 99 ASSERT(false); |
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 ASSERT(false); | 583 ASSERT(false); |
584 } | 584 } |
585 } | 585 } |
586 | 586 |
587 bool FakeAudioCaptureModule::Initialize() { | 587 bool FakeAudioCaptureModule::Initialize() { |
588 // Set the send buffer samples high enough that it would not occur on the | 588 // Set the send buffer samples high enough that it would not occur on the |
589 // remote side unless a packet containing a sample of that magnitude has been | 589 // remote side unless a packet containing a sample of that magnitude has been |
590 // sent to it. Note that the audio processing pipeline will likely distort the | 590 // sent to it. Note that the audio processing pipeline will likely distort the |
591 // original signal. | 591 // original signal. |
592 SetSendBuffer(kHighSampleValue); | 592 SetSendBuffer(kHighSampleValue); |
593 last_process_time_ms_ = rtc::Time(); | 593 last_process_time_ms_ = rtc::TimeMillis(); |
594 return true; | 594 return true; |
595 } | 595 } |
596 | 596 |
597 void FakeAudioCaptureModule::SetSendBuffer(int value) { | 597 void FakeAudioCaptureModule::SetSendBuffer(int value) { |
598 Sample* buffer_ptr = reinterpret_cast<Sample*>(send_buffer_); | 598 Sample* buffer_ptr = reinterpret_cast<Sample*>(send_buffer_); |
599 const size_t buffer_size_in_samples = | 599 const size_t buffer_size_in_samples = |
600 sizeof(send_buffer_) / kNumberBytesPerSample; | 600 sizeof(send_buffer_) / kNumberBytesPerSample; |
601 for (size_t i = 0; i < buffer_size_in_samples; ++i) { | 601 for (size_t i = 0; i < buffer_size_in_samples; ++i) { |
602 buffer_ptr[i] = value; | 602 buffer_ptr[i] = value; |
603 } | 603 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 if (started_) { | 642 if (started_) { |
643 // Already started. | 643 // Already started. |
644 return; | 644 return; |
645 } | 645 } |
646 ProcessFrameP(); | 646 ProcessFrameP(); |
647 } | 647 } |
648 | 648 |
649 void FakeAudioCaptureModule::ProcessFrameP() { | 649 void FakeAudioCaptureModule::ProcessFrameP() { |
650 ASSERT(process_thread_->IsCurrent()); | 650 ASSERT(process_thread_->IsCurrent()); |
651 if (!started_) { | 651 if (!started_) { |
652 next_frame_time_ = rtc::Time(); | 652 next_frame_time_ = rtc::TimeMillis(); |
653 started_ = true; | 653 started_ = true; |
654 } | 654 } |
655 | 655 |
656 { | 656 { |
657 rtc::CritScope cs(&crit_); | 657 rtc::CritScope cs(&crit_); |
658 // Receive and send frames every kTimePerFrameMs. | 658 // Receive and send frames every kTimePerFrameMs. |
659 if (playing_) { | 659 if (playing_) { |
660 ReceiveFrameP(); | 660 ReceiveFrameP(); |
661 } | 661 } |
662 if (recording_) { | 662 if (recording_) { |
663 SendFrameP(); | 663 SendFrameP(); |
664 } | 664 } |
665 } | 665 } |
666 | 666 |
667 next_frame_time_ += kTimePerFrameMs; | 667 next_frame_time_ += kTimePerFrameMs; |
668 const uint32_t current_time = rtc::Time(); | 668 const int64_t current_time = rtc::TimeMillis(); |
669 const uint32_t wait_time = | 669 const int64_t wait_time = |
670 (next_frame_time_ > current_time) ? next_frame_time_ - current_time : 0; | 670 (next_frame_time_ > current_time) ? next_frame_time_ - current_time : 0; |
671 process_thread_->PostDelayed(wait_time, this, MSG_RUN_PROCESS); | 671 process_thread_->PostDelayed(wait_time, this, MSG_RUN_PROCESS); |
672 } | 672 } |
673 | 673 |
674 void FakeAudioCaptureModule::ReceiveFrameP() { | 674 void FakeAudioCaptureModule::ReceiveFrameP() { |
675 ASSERT(process_thread_->IsCurrent()); | 675 ASSERT(process_thread_->IsCurrent()); |
676 { | 676 { |
677 rtc::CritScope cs(&crit_callback_); | 677 rtc::CritScope cs(&crit_callback_); |
678 if (!audio_callback_) { | 678 if (!audio_callback_) { |
679 return; | 679 return; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 kNumberOfChannels, | 716 kNumberOfChannels, |
717 kSamplesPerSecond, kTotalDelayMs, | 717 kSamplesPerSecond, kTotalDelayMs, |
718 kClockDriftMs, current_mic_level, | 718 kClockDriftMs, current_mic_level, |
719 key_pressed, | 719 key_pressed, |
720 current_mic_level) != 0) { | 720 current_mic_level) != 0) { |
721 ASSERT(false); | 721 ASSERT(false); |
722 } | 722 } |
723 SetMicrophoneVolume(current_mic_level); | 723 SetMicrophoneVolume(current_mic_level); |
724 } | 724 } |
725 | 725 |
OLD | NEW |