Spaces:
Sleeping
Sleeping
| /* | |
| Copyright 2015 Google Inc. All rights reserved. | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| */ | |
| template <class CodecImplementation> | |
| inline bool CodecApi<CodecImplementation>::SetHeaderInfo( | |
| int sampling_rate, int num_samples_per_channel) { | |
| bool status = set_sampling_rate(sampling_rate); | |
| status &= set_num_samples_per_channel(num_samples_per_channel); | |
| return status; | |
| } | |
| template <class CodecImplementation> | |
| inline bool CodecApi<CodecImplementation>::GetHeaderInfo( | |
| int *sampling_rate, int *num_samples_per_channel) { | |
| *sampling_rate = sampling_rate_; | |
| *num_samples_per_channel = num_samples_per_channel_; | |
| return true; | |
| } | |
| template <class CodecImplementation> | |
| inline bool CodecApi<CodecImplementation>::ReadHeader(FileResource *fr) { | |
| return codec_.ReadHeader(fr, &num_samples_per_channel_, &sampling_rate_); | |
| } | |
| template <class CodecImplementation> | |
| bool CodecApi<CodecImplementation>::ReadAudioData( | |
| int wave_start, int num_samples, | |
| std::vector<int16_t> *samples, FileResource *fr) { | |
| if (samples == NULL) { | |
| fprintf(stderr, "CodecApi::ReadAudioData: empty pointer was given"); | |
| return true; | |
| } | |
| int64_t offset_audio_container = ftell(fr->fp()); | |
| bool status = codec_.ReadAudioData(wave_start, num_samples, samples, fr); | |
| // Reset the file resource pointer back to the beginning of the | |
| // audio container. | |
| if (fseek(fr->fp(), offset_audio_container, SEEK_SET) != 0) { | |
| fprintf(stderr, "CodecApi::ReadAudioData: error seeking the beginning of the " | |
| "audio container"); | |
| return false; | |
| } | |
| return status; | |
| } | |
| template <class CodecImplementation> | |
| bool CodecApi<CodecImplementation>::ReadAudioContainer( | |
| int container_size_in_bytes, | |
| std::vector<int16_t> *samples, | |
| FileResource *fr) { | |
| int64_t offset_audio_container = ftell(fr->fp()); | |
| bool status = codec_.ReadAudioContainer(container_size_in_bytes, samples, fr); | |
| // Reset the FileResource pointer back to the beginning of the audio container | |
| if (fseek(fr->fp(), offset_audio_container, SEEK_SET) != 0) { | |
| fprintf(stderr, "CodecApi::ReadAudioData: error seeking the beginning of the " | |
| "audio container"); | |
| return false; | |
| } | |
| return status; | |
| } | |
| template <class CodecImplementation> | |
| inline int CodecApi<CodecImplementation>::get_num_samples_per_channel() const { | |
| return num_samples_per_channel_; | |
| } | |
| template <class CodecImplementation> | |
| inline int CodecApi<CodecImplementation>::get_sampling_rate() const { | |
| return sampling_rate_; | |
| } | |
| template <class CodecImplementation> | |
| inline | |
| bool CodecApi<CodecImplementation>::set_num_samples_per_channel(int value) { | |
| num_samples_per_channel_ = value; | |
| return true; | |
| } | |
| template <class CodecImplementation> | |
| inline | |
| bool CodecApi<CodecImplementation>::set_sampling_rate(int value) { | |
| sampling_rate_ = value; | |
| return true; | |
| } | |
| template <class CodecImplementation> | |
| bool CodecApi<CodecImplementation>::Load( | |
| FileResource *fr, std::vector<int16_t> *samples) { | |
| if (!codec_.ReadHeader(fr, &num_samples_per_channel_, &sampling_rate_)) { | |
| return false; | |
| } | |
| samples->resize(num_samples_per_channel_); | |
| return codec_.ReadAudioData( | |
| 0, num_samples_per_channel_, PCM16, samples, fr); | |
| } | |
| template <class CodecImplementation> | |
| template <class FileResourceType> | |
| bool CodecApi<CodecImplementation>::Load( | |
| const std::string &filename, std::vector<int16_t> *samples) { | |
| FileResource *fr = FileResourceType::Open(filename); | |
| if (fr != NULL) { | |
| return Load(fr, samples); | |
| } else { | |
| fprintf(stderr, "CodecApi::Load: Failed to open \"%s\"", filename.c_str()); | |
| return false; | |
| } | |
| } | |
| template <class CodecImplementation> | |
| bool CodecApi<CodecImplementation>::Initialize( | |
| WaveCodingType coding_type) { | |
| return codec_.Initialize(coding_type); | |
| } | |