1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef MODULES_AUDIO_CODING_TEST_PCMFILE_H_ 12*d9f75844SAndroid Build Coastguard Worker #define MODULES_AUDIO_CODING_TEST_PCMFILE_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stdio.h> 15*d9f75844SAndroid Build Coastguard Worker #include <stdlib.h> 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker #include <string> 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h" 20*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/audio/audio_frame.h" 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 24*d9f75844SAndroid Build Coastguard Worker 25*d9f75844SAndroid Build Coastguard Worker class PCMFile { 26*d9f75844SAndroid Build Coastguard Worker public: 27*d9f75844SAndroid Build Coastguard Worker PCMFile(); 28*d9f75844SAndroid Build Coastguard Worker PCMFile(uint32_t timestamp); 29*d9f75844SAndroid Build Coastguard Worker ~PCMFile(); 30*d9f75844SAndroid Build Coastguard Worker 31*d9f75844SAndroid Build Coastguard Worker void Open(absl::string_view filename, 32*d9f75844SAndroid Build Coastguard Worker uint16_t frequency, 33*d9f75844SAndroid Build Coastguard Worker absl::string_view mode, 34*d9f75844SAndroid Build Coastguard Worker bool auto_rewind = false); 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker int32_t Read10MsData(AudioFrame& audio_frame); 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker void Write10MsData(const int16_t* playout_buffer, size_t length_smpls); 39*d9f75844SAndroid Build Coastguard Worker void Write10MsData(const AudioFrame& audio_frame); 40*d9f75844SAndroid Build Coastguard Worker 41*d9f75844SAndroid Build Coastguard Worker uint16_t PayloadLength10Ms() const; 42*d9f75844SAndroid Build Coastguard Worker int32_t SamplingFrequency() const; 43*d9f75844SAndroid Build Coastguard Worker void Close(); EndOfFile()44*d9f75844SAndroid Build Coastguard Worker bool EndOfFile() const { return end_of_file_; } 45*d9f75844SAndroid Build Coastguard Worker // Moves forward the specified number of 10 ms blocks. If a limit has been set 46*d9f75844SAndroid Build Coastguard Worker // with SetNum10MsBlocksToRead, fast-forwarding does not count towards this 47*d9f75844SAndroid Build Coastguard Worker // limit. 48*d9f75844SAndroid Build Coastguard Worker void FastForward(int num_10ms_blocks); 49*d9f75844SAndroid Build Coastguard Worker void Rewind(); 50*d9f75844SAndroid Build Coastguard Worker static int16_t ChooseFile(std::string* file_name, 51*d9f75844SAndroid Build Coastguard Worker int16_t max_len, 52*d9f75844SAndroid Build Coastguard Worker uint16_t* frequency_hz); 53*d9f75844SAndroid Build Coastguard Worker bool Rewinded(); 54*d9f75844SAndroid Build Coastguard Worker void SaveStereo(bool is_stereo = true); 55*d9f75844SAndroid Build Coastguard Worker void ReadStereo(bool is_stereo = true); 56*d9f75844SAndroid Build Coastguard Worker // If set, the reading will stop after the specified number of blocks have 57*d9f75844SAndroid Build Coastguard Worker // been read. When that has happened, EndOfFile() will return true. Calling 58*d9f75844SAndroid Build Coastguard Worker // Rewind() will reset the counter and start over. 59*d9f75844SAndroid Build Coastguard Worker void SetNum10MsBlocksToRead(int value); 60*d9f75844SAndroid Build Coastguard Worker 61*d9f75844SAndroid Build Coastguard Worker private: 62*d9f75844SAndroid Build Coastguard Worker FILE* pcm_file_; 63*d9f75844SAndroid Build Coastguard Worker uint16_t samples_10ms_; 64*d9f75844SAndroid Build Coastguard Worker int32_t frequency_; 65*d9f75844SAndroid Build Coastguard Worker bool end_of_file_; 66*d9f75844SAndroid Build Coastguard Worker bool auto_rewind_; 67*d9f75844SAndroid Build Coastguard Worker bool rewinded_; 68*d9f75844SAndroid Build Coastguard Worker uint32_t timestamp_; 69*d9f75844SAndroid Build Coastguard Worker bool read_stereo_; 70*d9f75844SAndroid Build Coastguard Worker bool save_stereo_; 71*d9f75844SAndroid Build Coastguard Worker absl::optional<int> num_10ms_blocks_to_read_; 72*d9f75844SAndroid Build Coastguard Worker int blocks_read_ = 0; 73*d9f75844SAndroid Build Coastguard Worker }; 74*d9f75844SAndroid Build Coastguard Worker 75*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker #endif // MODULES_AUDIO_CODING_TEST_PCMFILE_H_ 78