|  | /* | 
|  | *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | // Unit tests for FilePlayer. | 
|  |  | 
|  | #include "webrtc/modules/utility/include/file_player.h" | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <string> | 
|  |  | 
|  | #include "gflags/gflags.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  | #include "webrtc/base/md5digest.h" | 
|  | #include "webrtc/base/stringencode.h" | 
|  | #include "webrtc/test/testsupport/fileutils.h" | 
|  |  | 
|  | DEFINE_bool(file_player_output, false, "Generate reference files."); | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | class FilePlayerTest : public ::testing::Test { | 
|  | protected: | 
|  | static const uint32_t kId = 0; | 
|  | static const FileFormats kFileFormat = kFileFormatWavFile; | 
|  | static const int kSampleRateHz = 8000; | 
|  |  | 
|  | FilePlayerTest() | 
|  | : player_(FilePlayer::CreateFilePlayer(kId, kFileFormat)), | 
|  | output_file_(NULL) {} | 
|  |  | 
|  | void SetUp() override { | 
|  | if (FLAGS_file_player_output) { | 
|  | std::string output_file = | 
|  | webrtc::test::OutputPath() + "file_player_unittest_out.pcm"; | 
|  | output_file_ = fopen(output_file.c_str(), "wb"); | 
|  | ASSERT_TRUE(output_file_ != NULL); | 
|  | } | 
|  | } | 
|  |  | 
|  | void TearDown() override { | 
|  | if (output_file_) | 
|  | fclose(output_file_); | 
|  | } | 
|  |  | 
|  | ~FilePlayerTest() { FilePlayer::DestroyFilePlayer(player_); } | 
|  |  | 
|  | void PlayFileAndCheck(const std::string& input_file, | 
|  | const std::string& ref_checksum, | 
|  | int output_length_ms) { | 
|  | const float kScaling = 1; | 
|  | ASSERT_EQ(0, | 
|  | player_->StartPlayingFile( | 
|  | input_file.c_str(), false, 0, kScaling, 0, 0, NULL)); | 
|  | rtc::Md5Digest checksum; | 
|  | for (int i = 0; i < output_length_ms / 10; ++i) { | 
|  | int16_t out[10 * kSampleRateHz / 1000] = {0}; | 
|  | size_t num_samples; | 
|  | EXPECT_EQ(0, | 
|  | player_->Get10msAudioFromFile(out, num_samples, kSampleRateHz)); | 
|  | checksum.Update(out, num_samples * sizeof(out[0])); | 
|  | if (FLAGS_file_player_output) { | 
|  | ASSERT_EQ(num_samples, | 
|  | fwrite(out, sizeof(out[0]), num_samples, output_file_)); | 
|  | } | 
|  | } | 
|  | char checksum_result[rtc::Md5Digest::kSize]; | 
|  | EXPECT_EQ(rtc::Md5Digest::kSize, | 
|  | checksum.Finish(checksum_result, rtc::Md5Digest::kSize)); | 
|  | EXPECT_EQ(ref_checksum, | 
|  | rtc::hex_encode(checksum_result, sizeof(checksum_result))); | 
|  | } | 
|  |  | 
|  | FilePlayer* player_; | 
|  | FILE* output_file_; | 
|  | }; | 
|  |  | 
|  | #if defined(WEBRTC_IOS) | 
|  | #define MAYBE_PlayWavPcmuFile DISABLED_PlayWavPcmuFile | 
|  | #else | 
|  | #define MAYBE_PlayWavPcmuFile PlayWavPcmuFile | 
|  | #endif | 
|  | TEST_F(FilePlayerTest, MAYBE_PlayWavPcmuFile) { | 
|  | const std::string kFileName = | 
|  | test::ResourcePath("utility/encapsulated_pcmu_8khz", "wav"); | 
|  | // The file is longer than this, but keeping the output shorter limits the | 
|  | // runtime for the test. | 
|  | const int kOutputLengthMs = 10000; | 
|  | const std::string kRefChecksum = "c74e7fd432d439b1311e1c16815b3e9a"; | 
|  |  | 
|  | PlayFileAndCheck(kFileName, kRefChecksum, kOutputLengthMs); | 
|  | } | 
|  |  | 
|  | #if defined(WEBRTC_IOS) | 
|  | #define MAYBE_PlayWavPcm16File DISABLED_PlayWavPcm16File | 
|  | #else | 
|  | #define MAYBE_PlayWavPcm16File PlayWavPcm16File | 
|  | #endif | 
|  | TEST_F(FilePlayerTest, MAYBE_PlayWavPcm16File) { | 
|  | const std::string kFileName = | 
|  | test::ResourcePath("utility/encapsulated_pcm16b_8khz", "wav"); | 
|  | // The file is longer than this, but keeping the output shorter limits the | 
|  | // runtime for the test. | 
|  | const int kOutputLengthMs = 10000; | 
|  | const std::string kRefChecksum = "e41d7e1dac8aeae9f21e8e03cd7ecd71"; | 
|  |  | 
|  | PlayFileAndCheck(kFileName, kRefChecksum, kOutputLengthMs); | 
|  | } | 
|  |  | 
|  | }  // namespace webrtc |