annotate src/Support/Parameters.cc @ 16:2a5354042241

-Updated the Slaney IIR gammatone to use a cascase of four second-order filters as per the implementtion in Slaney's auditory toolbox. This is more numerically stable at high sample rates and low centre frequencies.
author tomwalters
date Sat, 20 Feb 2010 17:56:40 +0000
parents fcbf85ce59fb
children 491b1b1d1dc5
rev   line source
tomwalters@0 1 // Copyright 2006-2010, Willem van Engen
tomwalters@0 2 //
tomwalters@0 3 // AIM-C: A C++ implementation of the Auditory Image Model
tomwalters@0 4 // http://www.acousticscale.org/AIMC
tomwalters@0 5 //
tomwalters@0 6 // This program is free software: you can redistribute it and/or modify
tomwalters@0 7 // it under the terms of the GNU General Public License as published by
tomwalters@0 8 // the Free Software Foundation, either version 3 of the License, or
tomwalters@0 9 // (at your option) any later version.
tomwalters@0 10 //
tomwalters@0 11 // This program is distributed in the hope that it will be useful,
tomwalters@0 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
tomwalters@0 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
tomwalters@0 14 // GNU General Public License for more details.
tomwalters@0 15 //
tomwalters@0 16 // You should have received a copy of the GNU General Public License
tomwalters@0 17 // along with this program. If not, see <http://www.gnu.org/licenses/>.
tomwalters@0 18
tomwalters@8 19 /*!
tomwalters@8 20 * \file
tomwalters@8 21 * \brief Main parameters store
tomwalters@8 22 *
tomwalters@8 23 * \author Willem van Engen <cnbh@willem.engen.nl>
tomwalters@8 24 * \date created 2006/09/21
tomwalters@8 25 * \version \$Id: Parameters.cc 4 2010-02-03 18:44:58Z tcw $
tomwalters@8 26 */
tomwalters@0 27
tomwalters@0 28 #include <stdio.h>
tomwalters@0 29 #include <stdlib.h>
tomwalters@0 30 #include <string.h>
tomwalters@0 31
tomwalters@0 32 #include "Support/Common.h"
tomwalters@0 33 #include "Support/Parameters.h"
tomwalters@0 34
tomwalters@0 35 namespace aimc {
tomwalters@0 36 const char *Parameters::m_SDefaultIniSection = "";
tomwalters@0 37
tomwalters@0 38 Parameters::Parameters() {
tomwalters@0 39 m_iNestCount = 0;
tomwalters@0 40 m_pIni = new CSimpleIniCase(false, false, true);
tomwalters@0 41 AIM_ASSERT(m_pIni);
tomwalters@0 42 }
tomwalters@0 43
tomwalters@0 44 Parameters::~Parameters() {
tomwalters@0 45 DELETE_IF_NONNULL(m_pIni);
tomwalters@0 46 }
tomwalters@0 47
tomwalters@0 48 const char * Parameters::DefaultString(const char* sName, const char* val) {
tomwalters@0 49 AIM_ASSERT(m_pIni);
tomwalters@0 50 if (!IsSet(sName)) {
tomwalters@1 51 SetString(sName, val);
tomwalters@0 52 }
tomwalters@1 53 return GetString(sName);
tomwalters@0 54 }
tomwalters@0 55
tomwalters@0 56 int Parameters::DefaultInt(const char* sName, int val) {
tomwalters@0 57 AIM_ASSERT(m_pIni);
tomwalters@0 58 if (!IsSet(sName)) {
tomwalters@1 59 SetInt(sName, val);
tomwalters@0 60 }
tomwalters@1 61 return GetInt(sName);
tomwalters@0 62 }
tomwalters@0 63
tomwalters@0 64 unsigned int Parameters::DefaultUInt(const char* sName, unsigned int val) {
tomwalters@0 65 AIM_ASSERT(m_pIni);
tomwalters@0 66 if (!IsSet(sName)) {
tomwalters@1 67 SetUInt(sName, val);
tomwalters@0 68 }
tomwalters@1 69 return GetUInt(sName);
tomwalters@0 70 }
tomwalters@0 71
tomwalters@0 72 float Parameters::DefaultFloat(const char* sName, float val) {
tomwalters@0 73 AIM_ASSERT(m_pIni);
tomwalters@0 74 if (!IsSet(sName)) {
tomwalters@1 75 SetFloat(sName, val);
tomwalters@0 76 }
tomwalters@1 77 return GetFloat(sName);
tomwalters@0 78 }
tomwalters@0 79
tomwalters@0 80 bool Parameters::DefaultBool(const char* sName, bool val) {
tomwalters@0 81 AIM_ASSERT(m_pIni);
tomwalters@0 82 if (!IsSet(sName)) {
tomwalters@1 83 SetBool(sName, val);
tomwalters@0 84 }
tomwalters@1 85 return GetBool(sName);
tomwalters@0 86 }
tomwalters@0 87
tomwalters@0 88 void Parameters::SetString(const char *sName, const char *val) {
tomwalters@0 89 AIM_ASSERT(m_pIni);
tomwalters@0 90 m_pIni->SetValue(m_SDefaultIniSection, sName, val);
tomwalters@0 91 }
tomwalters@0 92
tomwalters@0 93 void Parameters::SetInt(const char *sName, int val) {
tomwalters@0 94 char sVal[20];
tomwalters@0 95 snprintf(sVal, sizeof(sVal)/sizeof(sVal[0]), "%d", val);
tomwalters@0 96 SetString(sName, sVal);
tomwalters@0 97 }
tomwalters@0 98
tomwalters@0 99 void Parameters::SetUInt(const char *sName, unsigned int val) {
tomwalters@0 100 char sVal[20];
tomwalters@0 101 snprintf(sVal, sizeof(sVal)/sizeof(sVal[0]), "%ud", val);
tomwalters@0 102 SetString(sName, sVal);
tomwalters@0 103 }
tomwalters@0 104
tomwalters@0 105 void Parameters::SetBool(const char *sName, bool val) {
tomwalters@0 106 SetString(sName, val ? "true" : "false");
tomwalters@0 107 }
tomwalters@0 108
tomwalters@0 109 void Parameters::SetFloat(const char *sName, float val) {
tomwalters@0 110 char sVal[20];
tomwalters@0 111 snprintf(sVal, sizeof(sVal)/sizeof(sVal[0]), "%f", val);
tomwalters@0 112 SetString(sName, sVal);
tomwalters@0 113 }
tomwalters@0 114
tomwalters@0 115 const char *Parameters::GetString(const char *sName) {
tomwalters@0 116 AIM_ASSERT(m_pIni);
tomwalters@0 117 const char *sVal = m_pIni->GetValue(m_SDefaultIniSection, sName, NULL);
tomwalters@0 118 if (!sVal) {
tomwalters@0 119 LOG_ERROR(_T("Parameter not found '%s'"), sName);
tomwalters@0 120 return "";
tomwalters@0 121 }
tomwalters@0 122 return sVal;
tomwalters@0 123 }
tomwalters@0 124
tomwalters@0 125 int Parameters::GetInt(const char *sName) {
tomwalters@0 126 return atoi(GetString(sName));
tomwalters@0 127 }
tomwalters@0 128
tomwalters@0 129 unsigned int Parameters::GetUInt(const char *sName) {
tomwalters@0 130 return atoi(GetString(sName));
tomwalters@0 131 }
tomwalters@0 132
tomwalters@0 133 float Parameters::GetFloat(const char *sName) {
tomwalters@8 134 return atof(GetString(sName));
tomwalters@0 135 }
tomwalters@0 136
tomwalters@0 137 bool Parameters::GetBool(const char *sName) {
tomwalters@0 138 const char *sVal = GetString(sName);
tomwalters@8 139 if (strcmp(sVal, "true") == 0 || strcmp(sVal, "on") == 0 ||
tomwalters@8 140 strcmp(sVal, "yes") == 0 || strcmp(sVal, "1") == 0 ||
tomwalters@8 141 strcmp(sVal, "y") == 0 || strcmp(sVal, "t") == 0)
tomwalters@0 142 return true;
tomwalters@0 143 else
tomwalters@0 144 return false;
tomwalters@0 145 }
tomwalters@0 146
tomwalters@0 147 bool Parameters::IsSet(const char *sName) {
tomwalters@0 148 AIM_ASSERT(m_pIni);
tomwalters@8 149 return m_pIni->GetValue(m_SDefaultIniSection, sName, NULL) != NULL;
tomwalters@0 150 }
tomwalters@0 151
tomwalters@0 152 bool Parameters::Parse(const char *sCmd) {
tomwalters@8 153 /*! \todo There is some code duplication here from Parameters::Merge()
tomwalters@8 154 */
tomwalters@0 155
tomwalters@0 156 CSimpleIniCase *pIni2 = new CSimpleIniCase(false, false, true);
tomwalters@0 157 AIM_ASSERT(pIni2);
tomwalters@0 158 if (pIni2->Load(sCmd, strlen(sCmd)) < 0) {
tomwalters@0 159 LOG_ERROR(_T("Could not parse option '%s'"), sCmd);
tomwalters@0 160 delete pIni2;
tomwalters@0 161 return false;
tomwalters@0 162 }
tomwalters@0 163
tomwalters@0 164 // if there are keys and values...
tomwalters@0 165 const CSimpleIniCase::TKeyVal *pSectionData =
tomwalters@0 166 pIni2->GetSection(m_SDefaultIniSection);
tomwalters@0 167 if (pSectionData) {
tomwalters@0 168 // iterate over all keys and set them in the current parameter file
tomwalters@0 169 CSimpleIniCase::TKeyVal::const_iterator iKeyVal = pSectionData->begin();
tomwalters@0 170 for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) {
tomwalters@0 171 m_pIni->SetValue(m_SDefaultIniSection,
tomwalters@0 172 iKeyVal->first.pItem,
tomwalters@0 173 iKeyVal->second);
tomwalters@0 174 }
tomwalters@0 175 }
tomwalters@0 176 delete pIni2;
tomwalters@0 177 return true;
tomwalters@0 178 }
tomwalters@0 179
tomwalters@0 180 bool Parameters::Delete(const char *sName) {
tomwalters@0 181 AIM_ASSERT(m_pIni);
tomwalters@0 182 return(m_pIni->Delete(m_SDefaultIniSection, sName));
tomwalters@0 183 }
tomwalters@0 184
tomwalters@0 185 bool Parameters::LoadFile(const char *sParamFilename) {
tomwalters@0 186 AIM_ASSERT(m_pIni);
tomwalters@0 187 SI_Error siErr;
tomwalters@0 188 bool bRet = true;
tomwalters@0 189
tomwalters@0 190 // Avoid inclusion loops
tomwalters@0 191 if (m_iNestCount >= m_iNestCountMaximum) {
tomwalters@0 192 LOG_ERROR(_T("Possible inclusion loop in file '%s' (%d times)"),
tomwalters@0 193 sParamFilename, m_iNestCount);
tomwalters@0 194 return false;
tomwalters@0 195 }
tomwalters@0 196 m_iNestCount++;
tomwalters@0 197
tomwalters@8 198 if ((siErr=m_pIni->LoadFile(sParamFilename)) < 0) {
tomwalters@0 199 // Don't complain if file not found, but do return error
tomwalters@8 200 if (siErr != SI_FILE)
tomwalters@0 201 LOG_ERROR(_T("Couldn't parse parameters from '%s'"), sParamFilename);
tomwalters@0 202 m_iNestCount--;
tomwalters@0 203 return false;
tomwalters@0 204 }
tomwalters@0 205
tomwalters@0 206 m_iNestCount--;
tomwalters@0 207 return bRet;
tomwalters@0 208 }
tomwalters@0 209
tomwalters@0 210 bool Parameters::MergeFile(const char *sParamFilename) {
tomwalters@0 211 Parameters *pParam2 = new Parameters();
tomwalters@0 212 AIM_ASSERT(pParam2);
tomwalters@0 213 if (!pParam2->LoadFile(sParamFilename)) {
tomwalters@0 214 LOG_ERROR(_T("Could not load parameter file '%s' for merging"),
tomwalters@0 215 sParamFilename);
tomwalters@0 216 delete pParam2;
tomwalters@0 217 return false;
tomwalters@0 218 }
tomwalters@0 219
tomwalters@0 220 // if there are keys and values...
tomwalters@0 221 const CSimpleIniCase::TKeyVal *pSectionData =
tomwalters@0 222 pParam2->m_pIni->GetSection(m_SDefaultIniSection);
tomwalters@0 223 if (pSectionData) {
tomwalters@0 224 // iterate over all keys and set them in the current parameter file
tomwalters@0 225 CSimpleIniCase::TKeyVal::const_iterator iKeyVal = pSectionData->begin();
tomwalters@0 226 for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) {
tomwalters@0 227 m_pIni->SetValue(m_SDefaultIniSection,
tomwalters@0 228 iKeyVal->first.pItem,
tomwalters@0 229 iKeyVal->second);
tomwalters@0 230 }
tomwalters@0 231 }
tomwalters@0 232
tomwalters@0 233 delete pParam2;
tomwalters@0 234 return true;
tomwalters@0 235 }
tomwalters@0 236
tomwalters@0 237 bool Parameters::Merge(const char *sParamFilename) {
tomwalters@0 238 return MergeFile(sParamFilename);
tomwalters@0 239 }
tomwalters@0 240
tomwalters@0 241 bool Parameters::Load(const char *sParamFilename) {
tomwalters@0 242 bool bRet = true;
tomwalters@0 243 // Load parameter file
tomwalters@0 244 bRet &= Merge(sParamFilename);
tomwalters@0 245 return bRet;
tomwalters@0 246 }
tomwalters@0 247
tomwalters@0 248 bool Parameters::Save(const char *sParamFilename) {
tomwalters@0 249 AIM_ASSERT(m_pIni);
tomwalters@0 250 SI_Error siErr;
tomwalters@0 251 FILE *pSaveFile;
tomwalters@0 252
tomwalters@0 253 pSaveFile = fopen(sParamFilename, "wb");
tomwalters@0 254 if (pSaveFile == NULL) {
tomwalters@0 255 LOG_ERROR(_T("Couldn't create parameters file '%s' to save to"),
tomwalters@0 256 sParamFilename);
tomwalters@0 257 return false;
tomwalters@0 258 }
tomwalters@0 259
tomwalters@8 260 if ((siErr = m_pIni->SaveFile(pSaveFile)) < 0) {
tomwalters@0 261 LOG_ERROR(_T("Couldn't save parameters in file '%s'"), sParamFilename);
tomwalters@0 262 return false;
tomwalters@0 263 }
tomwalters@0 264
tomwalters@0 265 fclose(pSaveFile);
tomwalters@0 266
tomwalters@0 267 return true;
tomwalters@0 268 }
tomwalters@1 269
tomwalters@1 270 std::string Parameters::WriteString() {
tomwalters@1 271 AIM_ASSERT(m_pIni);
tomwalters@1 272 SI_Error siErr;
tomwalters@1 273 std::string output_string;
tomwalters@1 274
tomwalters@8 275 if ((siErr = m_pIni->Save(output_string)) < 0) {
tomwalters@1 276 LOG_ERROR(_T("Couldn't write parameters to string"));
tomwalters@1 277 return false;
tomwalters@1 278 }
tomwalters@1 279 return output_string;
tomwalters@1 280 }
tomwalters@1 281
tomwalters@0 282 } // namespace aimc