Mercurial > hg > aimc
changeset 607:49eef19e4f1d
Added JSON output for use with node.js and backbone.js
author | sness@sness.net |
---|---|
date | Fri, 10 May 2013 20:12:49 +0000 |
parents | 03c642677954 |
children | fc353426eaad |
files | SConstruct src/Configurations/SAI_json_dump.aimcconfig src/Modules/Output/FileOutputJSON.cc src/Modules/Output/FileOutputJSON.h src/Support/ModuleFactory.cc |
diffstat | 5 files changed, 291 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/SConstruct Thu May 09 18:24:51 2013 +0000 +++ b/SConstruct Fri May 10 20:12:49 2013 +0000 @@ -52,6 +52,7 @@ 'Modules/Profile/ModuleScaler.cc', 'Modules/Output/FileOutputHTK.cc', 'Modules/Output/FileOutputAIMC.cc', + 'Modules/Output/FileOutputJSON.cc', #'Modules/Output/OSCOutput.cc', 'Modules/Features/ModuleGaussians.cc', 'Modules/Features/ModuleBoxes.cc',]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Configurations/SAI_json_dump.aimcconfig Fri May 10 20:12:49 2013 +0000 @@ -0,0 +1,26 @@ +module1.name = FileInput +module1.id = file_input +module1.child1 = PZFCFilterbank + +module2.name = PZFCFilterbank +module2.id = pzfc +module2.child1 = NAP + +module3.name = NAP +module3.id = hcl +module3.child1 = Strobes + +module4.name = Strobes +module4.id = local_max +module4.parameters = <<<ENDPARAMS +ENDPARAMS +module4.child1 = SAI + +module5.name = SAI +module5.id = weighted_sai +module5.child1 = SAIOutput + +module6.name = SAIOutput +module6.id = json_out +module6.parameters = <<<ENDPARAMS +ENDPARAMS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Modules/Output/FileOutputJSON.cc Fri May 10 20:12:49 2013 +0000 @@ -0,0 +1,171 @@ +// Copyright 2006-2010, Thomas Walters +// +// AIM-C: A C++ implementation of the Auditory Image Model +// http://www.acousticscale.org/AIMC +// +// 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. + +/*! + * \file + * \brief File output in the HTK format. + * + * \author Tom Walters <tom@acousticscale.org> + * \author Willem van Engen <cnbh@willem.engen.nl> + * \date created 2007/01/26 + * \version \$Id: $ + */ + + +#include <iostream> +#include <fstream> +#include <iomanip> + +#include "Modules/Output/FileOutputJSON.h" + +#ifdef _WINDOWS +# include <direct.h> // for _mkdir & _rmdir +#else +# include <sys/types.h> +# include <dirent.h> // for opendir & friends +#endif + +#include <stdint.h> +#include <stdio.h> +#include <string.h> +#include <cmath> +#include <string> + +namespace aimc { +FileOutputJSON::FileOutputJSON(Parameters *params) : Module(params) { + module_description_ = "File output in JSON format"; + module_identifier_ = "json_out"; + module_type_ = "output"; + module_version_ = "$Id: FileOutputJSON.cc 51 2010-03-30 22:06:24Z tomwalters $"; + file_suffix_ = parameters_->DefaultString("file_suffix", ".json"); + + header_written_ = false; + frame_period_ms_ = 0.0f; +} + +FileOutputJSON::~FileOutputJSON() { + if (file_handle_) + CloseFile(); +} + +bool FileOutputJSON::OpenFile(string &filename) { + file_handle_.open(filename.c_str()); + + frame_count_ = 0; + frame_period_ms_ = 0.0; + header_written_ = false; + + if (initialized_) { + WriteHeader(); + } + + return true; +} + +bool FileOutputJSON::InitializeInternal(const SignalBank &input) { + channel_count_ = input.channel_count(); + buffer_length_ = input.buffer_length(); + sample_rate_ = input.sample_rate(); + ResetInternal(); + if (file_handle_ == NULL) { + LOG_ERROR(_T("Couldn't initialize file output.")); + return false; + } + return true; +} + +void FileOutputJSON::ResetInternal() { + if (file_handle_ != NULL && !header_written_) { + WriteHeader(); + } + if (file_handle_ != NULL) + CloseFile(); + + string out_filename; + out_filename = global_parameters_->GetString("output_filename_base") + file_suffix_; + OpenFile(out_filename); +} + +void FileOutputJSON::WriteHeader() { + if (header_written_) + return; + + uint32_t channels_out = channel_count_; + uint32_t samples_out = buffer_length_; + float sample_rate = sample_rate_; + + file_handle_ << std::setprecision(3); + file_handle_ << "{" << std::endl; + file_handle_ << "\"channels\" : " << channels_out << "," << std::endl; + file_handle_ << "\"samples\" : " << sizeof(samples_out) << "," << std::endl; + file_handle_ << "\"sample_rate\" : " << sizeof(sample_rate) << "," << std::endl; + + header_written_ = true; +} + +void FileOutputJSON::Process(const SignalBank &input) { + if (file_handle_ == NULL) { + LOG_ERROR(_T("Couldn't process file output. No file is open." + "Please call FileOutputJSON::OpenFile first")); + return; + } + + if (!header_written_) { + LOG_ERROR(_T("No header has been written on the output file yet. Please " + "call FileOutputJSON::Initialize() before calling " + "FileOutputJSON::Process()")); + return; + } + float s; + + for (int ch = 0; ch < input.channel_count(); ch++) { + file_handle_ << "\"channel\" : ["; + for (int i = 0; i < input.buffer_length(); i++) { + s = input.sample(ch, i); + file_handle_ << s; + if (i < input.buffer_length() - 1) { + file_handle_ << ","; + } + } + file_handle_ << "]" << std::endl; + if (ch < input.channel_count() - 1) { + file_handle_ << ","; + } + } + + frame_count_++; + +} + +bool FileOutputJSON::CloseFile() { + if (file_handle_ == NULL) + return false; + + uint32_t frame_count = frame_count_; + float sample_period_out = frame_period_ms_; + + file_handle_ << "\"frame_count\" : " << sizeof(frame_count) << std::endl; + file_handle_ << "\"samples\" : " << sizeof(sample_period_out) << std::endl; + file_handle_ << "}" << std::endl; + + + file_handle_.close(); + header_written_ = false; + return true; +} +} // namespace aimc +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Modules/Output/FileOutputJSON.h Fri May 10 20:12:49 2013 +0000 @@ -0,0 +1,89 @@ +// Copyright 2006-2010, Thomas Walters, Willem van Engen +// +// AIM-C: A C++ implementation of the Auditory Image Model +// http://www.acousticscale.org/AIMC +// +// 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. + +/*! + * \file + * \brief File output to JSON format + * + * \author Thomas Walters <tom@acousticscale.org> + * \author Willem van Engen <cnbh@willem.engen.nl> + * \date created 2006/10/30 + * \version \$Header$ + */ + +#ifndef AIMC_MODULES_OUTPUT_JSON_H_ +#define AIMC_MODULES_OUTPUT_JSON_H_ + +#include <string> +#include <iostream> +#include <fstream> + +// using namespace std; + +#include "Support/Module.h" +#include "Support/SignalBank.h" + +namespace aimc { +class FileOutputJSON : public Module { + public: + /*! \brief Create a new file output for an JSON format file. + */ + explicit FileOutputJSON(Parameters *pParam); + ~FileOutputJSON(); + virtual void Process(const SignalBank &input); + private: + /*! \brief Initialize the output to JSON. + * \param *filename Filename of the ouptut file to be created. + * If the file exists it will be overwritten + * \return Returns true on success of initialization. + */ + bool OpenFile(string &filename); + bool CloseFile(); + bool OpenStrobesFile(string &filename); + bool CloseStrobesFile(); + + virtual bool InitializeInternal(const SignalBank &input); + virtual void ResetInternal(); + + void WriteHeader(); + + /*! \brief Whether initialization is done or not + */ + bool header_written_; + + /*! \brief Internal pointer to the output file + */ + // FILE *file_handle_; + // FILE *strobes_file_handle_; + std::ofstream file_handle_; + + /*! \brief Count of the number of samples in the file, written on close + */ + int frame_count_; + + int channel_count_; + int buffer_length_; + float sample_rate_; + float frame_period_ms_; + string file_suffix_; + bool dump_strobes_; + string strobes_file_suffix_; +}; +} // namespace aimc + +#endif // AIMC_MODULES_OUTPUT_JSON_H_ +
--- a/src/Support/ModuleFactory.cc Thu May 09 18:24:51 2013 +0000 +++ b/src/Support/ModuleFactory.cc Fri May 10 20:12:49 2013 +0000 @@ -23,6 +23,7 @@ #include "Modules/NAP/ModuleHCL.h" #include "Modules/Output/FileOutputHTK.h" #include "Modules/Output/FileOutputAIMC.h" +#include "Modules/Output/FileOutputJSON.h" //#include "Modules/Output/OSCOutput.h" #include "Modules/Output/Graphics/GraphicsViewTime.h" #include "Modules/Profile/ModuleSlice.h" @@ -64,6 +65,9 @@ if (module_name_.compare("aimc_out") == 0) return new FileOutputAIMC(params); + if (module_name_.compare("json_out") == 0) + return new FileOutputJSON(params); + if (module_name_.compare("graphics_time") == 0) return new GraphicsViewTime(params);