annotate trunk/src/Modules/Output/FileOutputJSON.cc @ 706:f8e90b5d85fd tip

Delete CARFAC code from this repository. It has been moved to https://github.com/google/carfac Please email me with your github username to get access. I've also created a new mailing list to discuss CARFAC development: https://groups.google.com/forum/#!forum/carfac-dev
author ronw@google.com
date Thu, 18 Jul 2013 20:56:51 +0000
parents e01caec17186
children
rev   line source
sness@618 1 // Copyright 2006-2010, Thomas Walters
sness@618 2 //
sness@618 3 // AIM-C: A C++ implementation of the Auditory Image Model
sness@618 4 // http://www.acousticscale.org/AIMC
sness@618 5 //
sness@618 6 // Licensed under the Apache License, Version 2.0 (the "License");
sness@618 7 // you may not use this file except in compliance with the License.
sness@618 8 // You may obtain a copy of the License at
sness@618 9 //
sness@618 10 // http://www.apache.org/licenses/LICENSE-2.0
sness@618 11 //
sness@618 12 // Unless required by applicable law or agreed to in writing, software
sness@618 13 // distributed under the License is distributed on an "AS IS" BASIS,
sness@618 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sness@618 15 // See the License for the specific language governing permissions and
sness@618 16 // limitations under the License.
sness@618 17
sness@618 18 /*!
sness@618 19 * \file
sness@618 20 * \brief File output in the HTK format.
sness@618 21 *
sness@618 22 * \author Tom Walters <tom@acousticscale.org>
sness@618 23 * \author Willem van Engen <cnbh@willem.engen.nl>
sness@618 24 * \date created 2007/01/26
sness@618 25 * \version \$Id: $
sness@618 26 */
sness@618 27
sness@618 28
sness@618 29 #include <iostream>
sness@618 30 #include <fstream>
sness@618 31 #include <iomanip>
sness@618 32
sness@618 33 #include "Modules/Output/FileOutputJSON.h"
sness@618 34
sness@618 35 #ifdef _WINDOWS
sness@618 36 # include <direct.h> // for _mkdir & _rmdir
sness@618 37 #else
sness@618 38 # include <sys/types.h>
sness@618 39 # include <dirent.h> // for opendir & friends
sness@618 40 #endif
sness@618 41
sness@618 42 #include <stdint.h>
sness@618 43 #include <stdio.h>
sness@618 44 #include <string.h>
sness@618 45 #include <cmath>
sness@618 46 #include <string>
sness@618 47
sness@618 48 namespace aimc {
sness@618 49 FileOutputJSON::FileOutputJSON(Parameters *params) : Module(params) {
sness@618 50 module_description_ = "File output in JSON format";
sness@618 51 module_identifier_ = "json_out";
sness@618 52 module_type_ = "output";
sness@618 53 module_version_ = "$Id: FileOutputJSON.cc 51 2010-03-30 22:06:24Z tomwalters $";
sness@618 54 file_suffix_ = parameters_->DefaultString("file_suffix", ".json");
sness@618 55
sness@618 56 header_written_ = false;
sness@618 57 frame_period_ms_ = 0.0f;
sness@618 58 }
sness@618 59
sness@618 60 FileOutputJSON::~FileOutputJSON() {
sness@618 61 if (file_handle_)
sness@618 62 CloseFile();
sness@618 63 }
sness@618 64
sness@618 65 bool FileOutputJSON::OpenFile(string &filename) {
sness@618 66 file_handle_.open(filename.c_str());
sness@618 67
sness@618 68 frame_count_ = 0;
sness@618 69 frame_period_ms_ = 0.0;
sness@618 70 header_written_ = false;
sness@618 71
sness@618 72 if (initialized_) {
sness@618 73 WriteHeader();
sness@618 74 }
sness@618 75
sness@618 76 return true;
sness@618 77 }
sness@618 78
sness@618 79 bool FileOutputJSON::InitializeInternal(const SignalBank &input) {
sness@618 80 channel_count_ = input.channel_count();
sness@618 81 buffer_length_ = input.buffer_length();
sness@618 82 sample_rate_ = input.sample_rate();
sness@618 83 ResetInternal();
sness@618 84 if (file_handle_ == NULL) {
sness@618 85 LOG_ERROR(_T("Couldn't initialize file output."));
sness@618 86 return false;
sness@618 87 }
sness@618 88 return true;
sness@618 89 }
sness@618 90
sness@618 91 void FileOutputJSON::ResetInternal() {
sness@618 92 if (file_handle_ != NULL && !header_written_) {
sness@618 93 WriteHeader();
sness@618 94 }
sness@618 95 if (file_handle_ != NULL)
sness@618 96 CloseFile();
sness@618 97
sness@618 98 string out_filename;
sness@618 99 out_filename = global_parameters_->GetString("output_filename_base") + file_suffix_;
sness@618 100 OpenFile(out_filename);
sness@618 101 }
sness@618 102
sness@618 103 void FileOutputJSON::WriteHeader() {
sness@618 104 if (header_written_)
sness@618 105 return;
sness@618 106
sness@618 107 uint32_t channels_out = channel_count_;
sness@618 108 uint32_t samples_out = buffer_length_;
sness@618 109 float sample_rate = sample_rate_;
sness@618 110
sness@618 111 file_handle_ << std::setprecision(3);
sness@618 112 file_handle_ << "{" << std::endl;
sness@618 113 file_handle_ << "\"channels\" : " << channels_out << "," << std::endl;
sness@618 114 file_handle_ << "\"samples\" : " << sizeof(samples_out) << "," << std::endl;
sness@618 115 file_handle_ << "\"sample_rate\" : " << sizeof(sample_rate) << "," << std::endl;
sness@618 116
sness@618 117 header_written_ = true;
sness@618 118 }
sness@618 119
sness@618 120 void FileOutputJSON::Process(const SignalBank &input) {
sness@618 121 if (file_handle_ == NULL) {
sness@618 122 LOG_ERROR(_T("Couldn't process file output. No file is open."
sness@618 123 "Please call FileOutputJSON::OpenFile first"));
sness@618 124 return;
sness@618 125 }
sness@618 126
sness@618 127 if (!header_written_) {
sness@618 128 LOG_ERROR(_T("No header has been written on the output file yet. Please "
sness@618 129 "call FileOutputJSON::Initialize() before calling "
sness@618 130 "FileOutputJSON::Process()"));
sness@618 131 return;
sness@618 132 }
sness@618 133 float s;
sness@618 134
sness@618 135 for (int ch = 0; ch < input.channel_count(); ch++) {
sness@618 136 file_handle_ << "\"channel\" : [";
sness@618 137 for (int i = 0; i < input.buffer_length(); i++) {
sness@618 138 s = input.sample(ch, i);
sness@618 139 file_handle_ << s;
sness@618 140 if (i < input.buffer_length() - 1) {
sness@618 141 file_handle_ << ",";
sness@618 142 }
sness@618 143 }
sness@618 144 file_handle_ << "]" << std::endl;
sness@618 145 if (ch < input.channel_count() - 1) {
sness@618 146 file_handle_ << ",";
sness@618 147 }
sness@618 148 }
sness@618 149
sness@618 150 frame_count_++;
sness@618 151
sness@618 152 }
sness@618 153
sness@618 154 bool FileOutputJSON::CloseFile() {
sness@618 155 if (file_handle_ == NULL)
sness@618 156 return false;
sness@618 157
sness@618 158 uint32_t frame_count = frame_count_;
sness@618 159 float sample_period_out = frame_period_ms_;
sness@618 160
sness@618 161 file_handle_ << "\"frame_count\" : " << sizeof(frame_count) << std::endl;
sness@618 162 file_handle_ << "\"samples\" : " << sizeof(sample_period_out) << std::endl;
sness@618 163 file_handle_ << "}" << std::endl;
sness@618 164
sness@618 165
sness@618 166 file_handle_.close();
sness@618 167 header_written_ = false;
sness@618 168 return true;
sness@618 169 }
sness@618 170 } // namespace aimc
sness@618 171