⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdb_06.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/shell/Sdb/sdb_06.cc// version: $Id: sdb_06.cc,v 1.7 2002/02/22 19:09:54 gao Exp $//// isip include files// #include "Sdb.h"// method: append//// arguments://  const Filename& arg: (input) Filename to append//  boolean is_list: (input) is this file a list?//// return: a boolean value indicating status//// this method processes all arguments on the command line as input files //boolean Sdb::append(const Filename& arg_a, boolean is_list_a) {  // call the master function  //  Pair<Filename, Boolean> pair(arg_a, is_list_a);  return files_d.insertLast(&pair);}// method: append//// arguments://  const String& arg: (input) string to append//  boolean is_list: (input) is this file a list?//// return: a boolean value indicating status//// this method processes all arguments on the command line as input files //boolean Sdb::append(const String& arg_a, boolean is_list_a) {  // call the master function  //  Filename temp(arg_a);  return append(temp, is_list_a);}// method: append//// arguments://  const unichar* arg: (input) array of unichar to append//  boolean is_list: (input) is this file a list?//// return: a boolean value indicating status//// this method processes all arguments on the command line as input files //boolean Sdb::append(const unichar* arg_a, boolean is_list_a) {  // assign input array to Filename and insert onto list  //  Filename temp;  temp.assign(arg_a);  return append(temp, is_list_a);}// method: gotoNext//// arguments: none//// return: a boolean value indicating status//// this method advances the internal list to the next entry//boolean Sdb::gotoNext() {  // advance to a new Filename  //  Filename fn;  if (queue_d.isEmpty()) {    // if no files can be appended, we are at the end    //    if (iterate() == 0) {      return false;    }  }  // we know that it is either not empty or iterate added elements, so  // we can safely remove the oldest element.  //  if (queue_d.remove(&fn) == (Filename*)NULL) {    return Error::handle(name(), L"gotoNext", ERR, __FILE__, __LINE__);  }  // this handles the case of exacly 1 file in the queue before the  // remove  //  if (queue_d.isEmpty()) {    // if no files can be appended, we are at the end    //    if (iterate() == 0) {      return false;    }  }  // exit gracefully  //  return (!queue_d.isEmpty());}// method: gotoFirst//// arguments: none//// return: a boolean value indicating status//// this method sets the internal list to the first entry//boolean Sdb::gotoFirst() {  // clear out the file buffer  //  queue_d.clear();    // close out and clear the stack  //  Sof* sof;  while ((sof = fps_d.pop()) != (Sof*)NULL) {    Long tag;    if (tags_d.pop(&tag) == (Long*)NULL) {      return Error::handle(name(), L"gotoFirst", ERR, __FILE__, __LINE__);    }    if (nums_d.pop(&tag) == (Long*)NULL) {      return Error::handle(name(), L"gotoFirst", ERR, __FILE__, __LINE__);    }    sof->close();    delete sof;  }  // if there are items, goto first  //  if (!files_d.gotoFirst()) {    return false;  }  // initialize the at_first variable  //  at_first_d = true;    // exit gracefully  //  return true;}// method: getName//// arguments://  Filename& name: (output) filename//// return: a boolean value indicating status//// this method returns the current filename//boolean Sdb::getName(Filename& name_a) {  // declare local variables  //  const Filename* ptr = (Filename*)NULL;  if (!queue_d.isEmpty()) {    ptr = queue_d.peek();  }  // if the element is NULL, try expanding the structure  //  if (ptr == (Filename*)NULL) {    if (iterate() == 0) {      return false;    }    ptr = queue_d.peek();    // if the element is still NULL, error    //    if (ptr == (Filename*)NULL) {      return Error::handle(name(), L"getName", Error::ARG, __FILE__, __LINE__);    }  }  // assign the name  //  name_a.assign(*ptr);  // exit gracefully  //  return true;}// method: transformName//// arguments://  Filename& out_name: (output) output filename//  const Filename& in_name: (input) input filename//// return: a boolean value indicating status//// this method transforms the input filename into an output filename// given the Sdb specified transformation rules.//boolean Sdb::transformName(Filename& out_name_a,			   const Filename& in_name_a) {  // clear the content of the output filename  //  out_name_a.clear();  // if the input name is the stream code, just copy to output  //  if (in_name_a.eq(File::STREAM_FILE)) {    out_name_a.assign(in_name_a);    return true;  }  // get the extension of the input filename  //  String extension;  in_name_a.getExt(extension);  // if no output directory is specified, just transform the name  // uniquely  //  if (output_directory_d.length() == 0) {    if (extension.eq(output_extension_d)) {      out_name_a.transformUniquely(in_name_a);    }    else {      out_name_a.assign(in_name_a);      out_name_a.transform(output_extension_d);    }  }  // output directory specified, so combine the old name (truncated by  // the number of directory levels to preserve) with the new  // directory.  //  else {    out_name_a.assign(in_name_a);    out_name_a.transform(output_directory_d, output_extension_d, dir_pres_d);  }  // now use buildPath to make sure the output path exists  //  String dir;  out_name_a.getDir(dir);  if (dir.length() > 0) {    Filename::buildPath(dir);  }  // make sure the input file exists  //  if (!File::exists(in_name_a)) {    return false;  }  // exit gracefully  //  return true;}// method: iterate//// arguments: none//// return: a long value containing the number of files added to// available list//// this method is fed a new filename to be appended to the list. the// file is tested. if it is an Sof file containing an Sdb object, then// the file will be opened and each entry will be added.//long Sdb::iterate() {  // initialize the mode to be reference  //  //  boolean self_reference = false;  String next_line;  Pair<Filename, Boolean> bin_entry;  long i = 0;    // add lookahead files to the list, the increment is inside  // the loop  //  for (; i < lookahead_d; ) {    next_line.clear();    boolean read_entry = false;    Filename new_file;    boolean is_list = false;        // if we have an open file, read from it    //    while (!fps_d.isEmpty()) {      // for text mode: if we can read from the file, break      //      if (fps_d.peek()->isText() && fps_d.peek()->gets(next_line)) {	// make sure the line has at least one character	//	if (next_line.length() == 0) {	  continue;	}	read_entry = true;	break;      }      // for binary mode: if we can read from the file, break      //      else if (fps_d.peek()->isBinary()	       && nums_d.peek()->gt(0)  // make sure there are still elements	       && bin_entry.readData(*(fps_d.peek()),				     String::getEmptyString())) {		// copy the data over	//	new_file.assign(bin_entry.first());	is_list = bin_entry.second();	// decrement the number to read in this object and break	//	nums_d.peek()->sub(*(nums_d.peek()), 1);	read_entry = true;		break;      }            // the read failed, try to move on to the next Sdb object in this file      //      Long tag;      if (tags_d.pop(&tag) == (Long*)NULL) {	return Error::handle(name(), L"iterate", ERR, __FILE__, __LINE__);      }      tag = fps_d.peek()->next(CLASS_NAME, (long)tag);      // if there is another Sdb object, move to it      //      if (tag != Sof::NO_TAG) {	// position the Sof file	//	if (!fps_d.peek()->find(CLASS_NAME, (long)tag)) {	  return Error::handle(name(), L"iterate", Sdb::ERR, __FILE__,			       __LINE__, Error::WARNING);	}	// for binary mode read the number of elements and place it on	// the stack	//	if (fps_d.peek()->isBinary()) {	  nums_d.peek()->readData(*(fps_d.peek()));	}	// place the tag on the stack	//	tags_d.push(&tag);	// continue back to the top-level loop	//	continue;      }            // no more Sdb objects: cleanup the Sof object      //      Sof* sof;      sof = fps_d.pop();      sof->close();      delete sof;      // pop the num stack as well      //      Long num;      nums_d.pop(&num);    }    // if no entry was read, use the next file on the list    //    if (!read_entry) {      // if we are at the first entry, use it. else gotoNext      //      if (at_first_d) {	// make sure the list is not empty	//	if (files_d.isEmpty()) {	  return 0;	}	new_file.assign(files_d.getCurr()->first());	is_list = files_d.getCurr()->second();	at_first_d = false;      }      else {		// terminal condition -- no more files to expand	//	if (files_d.isLast()) {	  break;	}		// advance the position in the list	//	files_d.gotoNext();		// assign the entry line to this next file	//	new_file.assign(files_d.getCurr()->first());	if (new_file.length() == 0) {	  return Error::handle(name(), L"iterate", ERR, __FILE__, __LINE__);	}	is_list = files_d.getCurr()->second();      }    }    // parse the line if we didn't get it from the list directly    //    if (new_file.length() == 0) {      if (!parse(new_file, is_list, next_line)) {	continue;      }    }    // determine if the line is a list or a single file entry    //    if (is_list) {            Sof* sof = new Sof;      // open the file with error checking      //      if (!sof->open(new_file)) {	delete sof;	Console::put(new_file);	return Error::handle(name(), L"iterate", Sof::ERR_NOTSOF, __FILE__,			     __LINE__, Error::WARNING);      }      // determine the tag      //      Long tag = sof->first(CLASS_NAME);      // find the Sdb object with error checking      //      if (tag == Sof::NO_TAG) {	delete sof;	Console::put(new_file);	return Error::handle(name(), L"iterate", Sdb::ERR_NOTSDB, __FILE__,			     __LINE__, Error::WARNING);      }            // position the Sof file      //      if (!sof->find(CLASS_NAME, (long)tag)) {	delete sof;	Console::put(new_file);	return Error::handle(name(), L"iterate", Sdb::ERR, __FILE__,			     __LINE__, Error::WARNING);      }      // for binary, read the number of elements and push it onto the      // stack      //      Long num_elem;      if (sof->isBinary()) {	num_elem.readData(*sof);      }      nums_d.push(&num_elem);            // now that the object is ready place it on the stack      //      fps_d.push((WSof*)sof);      tags_d.push(&tag);    }    // else this is a plain file, so place it onto new_files and    // increment the counter    //    else {      queue_d.add(&new_file);      i++;    }	  }       // exit gracefully -- if we get this far we must have looped far enough  //  return i;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -