sness@607: // Copyright 2006-2010, Thomas Walters sness@607: // sness@607: // AIM-C: A C++ implementation of the Auditory Image Model sness@607: // http://www.acousticscale.org/AIMC sness@607: // sness@607: // Licensed under the Apache License, Version 2.0 (the "License"); sness@607: // you may not use this file except in compliance with the License. sness@607: // You may obtain a copy of the License at sness@607: // sness@607: // http://www.apache.org/licenses/LICENSE-2.0 sness@607: // sness@607: // Unless required by applicable law or agreed to in writing, software sness@607: // distributed under the License is distributed on an "AS IS" BASIS, sness@607: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. sness@607: // See the License for the specific language governing permissions and sness@607: // limitations under the License. sness@607: sness@607: /*! sness@607: * \file sness@607: * \brief File output in the HTK format. sness@607: * sness@607: * \author Tom Walters sness@607: * \author Willem van Engen sness@607: * \date created 2007/01/26 sness@607: * \version \$Id: $ sness@607: */ sness@607: sness@607: sness@607: #include sness@607: #include sness@607: #include sness@607: sness@607: #include "Modules/Output/FileOutputJSON.h" sness@607: sness@607: #ifdef _WINDOWS sness@607: # include // for _mkdir & _rmdir sness@607: #else sness@607: # include sness@607: # include // for opendir & friends sness@607: #endif sness@607: sness@607: #include sness@607: #include sness@607: #include sness@607: #include sness@607: #include sness@607: sness@607: namespace aimc { sness@607: FileOutputJSON::FileOutputJSON(Parameters *params) : Module(params) { sness@607: module_description_ = "File output in JSON format"; sness@607: module_identifier_ = "json_out"; sness@607: module_type_ = "output"; sness@607: module_version_ = "$Id: FileOutputJSON.cc 51 2010-03-30 22:06:24Z tomwalters $"; sness@607: file_suffix_ = parameters_->DefaultString("file_suffix", ".json"); sness@607: sness@607: header_written_ = false; sness@607: frame_period_ms_ = 0.0f; sness@607: } sness@607: sness@607: FileOutputJSON::~FileOutputJSON() { sness@607: if (file_handle_) sness@607: CloseFile(); sness@607: } sness@607: sness@607: bool FileOutputJSON::OpenFile(string &filename) { sness@607: file_handle_.open(filename.c_str()); sness@607: sness@607: frame_count_ = 0; sness@607: frame_period_ms_ = 0.0; sness@607: header_written_ = false; sness@607: sness@607: if (initialized_) { sness@607: WriteHeader(); sness@607: } sness@607: sness@607: return true; sness@607: } sness@607: sness@607: bool FileOutputJSON::InitializeInternal(const SignalBank &input) { sness@607: channel_count_ = input.channel_count(); sness@607: buffer_length_ = input.buffer_length(); sness@607: sample_rate_ = input.sample_rate(); sness@607: ResetInternal(); sness@607: if (file_handle_ == NULL) { sness@607: LOG_ERROR(_T("Couldn't initialize file output.")); sness@607: return false; sness@607: } sness@607: return true; sness@607: } sness@607: sness@607: void FileOutputJSON::ResetInternal() { sness@607: if (file_handle_ != NULL && !header_written_) { sness@607: WriteHeader(); sness@607: } sness@607: if (file_handle_ != NULL) sness@607: CloseFile(); sness@607: sness@607: string out_filename; sness@607: out_filename = global_parameters_->GetString("output_filename_base") + file_suffix_; sness@607: OpenFile(out_filename); sness@607: } sness@607: sness@607: void FileOutputJSON::WriteHeader() { sness@607: if (header_written_) sness@607: return; sness@607: sness@607: uint32_t channels_out = channel_count_; sness@607: uint32_t samples_out = buffer_length_; sness@607: float sample_rate = sample_rate_; sness@607: sness@607: file_handle_ << std::setprecision(3); sness@607: file_handle_ << "{" << std::endl; sness@607: file_handle_ << "\"channels\" : " << channels_out << "," << std::endl; sness@607: file_handle_ << "\"samples\" : " << sizeof(samples_out) << "," << std::endl; sness@607: file_handle_ << "\"sample_rate\" : " << sizeof(sample_rate) << "," << std::endl; sness@607: sness@607: header_written_ = true; sness@607: } sness@607: sness@607: void FileOutputJSON::Process(const SignalBank &input) { sness@607: if (file_handle_ == NULL) { sness@607: LOG_ERROR(_T("Couldn't process file output. No file is open." sness@607: "Please call FileOutputJSON::OpenFile first")); sness@607: return; sness@607: } sness@607: sness@607: if (!header_written_) { sness@607: LOG_ERROR(_T("No header has been written on the output file yet. Please " sness@607: "call FileOutputJSON::Initialize() before calling " sness@607: "FileOutputJSON::Process()")); sness@607: return; sness@607: } sness@607: float s; sness@607: sness@607: for (int ch = 0; ch < input.channel_count(); ch++) { sness@607: file_handle_ << "\"channel\" : ["; sness@607: for (int i = 0; i < input.buffer_length(); i++) { sness@607: s = input.sample(ch, i); sness@607: file_handle_ << s; sness@607: if (i < input.buffer_length() - 1) { sness@607: file_handle_ << ","; sness@607: } sness@607: } sness@607: file_handle_ << "]" << std::endl; sness@607: if (ch < input.channel_count() - 1) { sness@607: file_handle_ << ","; sness@607: } sness@607: } sness@607: sness@607: frame_count_++; sness@607: sness@607: } sness@607: sness@607: bool FileOutputJSON::CloseFile() { sness@607: if (file_handle_ == NULL) sness@607: return false; sness@607: sness@607: uint32_t frame_count = frame_count_; sness@607: float sample_period_out = frame_period_ms_; sness@607: sness@607: file_handle_ << "\"frame_count\" : " << sizeof(frame_count) << std::endl; sness@607: file_handle_ << "\"samples\" : " << sizeof(sample_period_out) << std::endl; sness@607: file_handle_ << "}" << std::endl; sness@607: sness@607: sness@607: file_handle_.close(); sness@607: header_written_ = false; sness@607: return true; sness@607: } sness@607: } // namespace aimc sness@607: