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

📄 sof_04.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/io/Sof/sof_04.cc// version: $Id: sof_04.cc,v 1.4 2001/04/16 15:23:28 duncan Exp $//// isip include files//#include "Sof.h"#include <Console.h>// method: open//// arguments://  const SysString& fname: (input) filename//  File::MODE mode: (input) access mode//  File::TYPE type: (input) type of file (text, or binary)//// return: a boolean value indicating status//// this method opens an sof file//boolean Sof::open(const SysString& fname_a, File::MODE mode_a,		  File::TYPE type_a) {  // check if the file is already open  //  if (fp_d.isOpen()) {    Error::handle(name(), L"open", Error::FILE_REOPEN,		  __FILE__, __LINE__, Error::WARNING);    return false;  }    // assign the filename  //  name_d.assign(fname_a);  // expand the filename  //  if (!Integral::expandName(expanded_name_d, name_d)) {    SysString output(L"File: ");    output.concat(name_d);    output.concat(L"\n");    Error::handle(name(), L"open", Error::FILENAME_EXPAND, __FILE__, __LINE__,		  Error::WARNING, output);    name_d.clear();    expanded_name_d.clear();    return false;  }    if (debug_level_d > Integral::BRIEF) {    name_d.debug(L"<Sof::open> name_d");    expanded_name_d.debug(L"<Sof::open> expanded_name_d");  }    // save the type  //  file_type_d = type_a;    // initialize the position  //  if (type_a == File::BINARY) {    cur_pos_d = 0;  }    // if read only, call openRead  //  if (mode_a == File::READ_ONLY) {    return openRead();  }    // call open write (which calls read if necessary)  //  return openWrite(mode_a);}// method: close//// arguments: none//// return: a boolean value indicating status//// this method closes an sof file.//boolean Sof::close() {  // update the file if necessary  //  if (fp_d.isWritable()) {    if (!update()) {            // only error if we aren't exiting      //      if (!Error::isExiting()) {	return Error::handle(name(), L"close", ERR_UPDATE, __FILE__, __LINE__);      }    }  }  // if we are in the middle of a partial write, warn and stop  //  if (partial_write_d) {    // only error if we aren't exiting    //    if (!Error::isExiting()) {      return Error::handle(name(), L"close", ERR, __FILE__, __LINE__);    }    stopPartialWrite();  }  // if we are in the middle of a partial read, warn and stop  //  if (partial_read_d) {    // only error if we aren't exiting    //    if (!Error::isExiting()) {      return Error::handle(name(), L"close", ERR, __FILE__, __LINE__);    }    stopPartialRead();  }    // free resources  //  if (!cleanUp()) {    // no cleanup necessary, but only error if we aren't exiting    //    if (!Error::isExiting()) {      return Error::handle(name(), L"close", Error::RELEASE, __FILE__,			   __LINE__, Error::WARNING);    }  }    // exit gracefully  //  return true;}// method: openWrite//// arguments://  File::MODE access_mode: (input) what mode to open//// return: a boolean value indicating status//// this method opens a file for write access//boolean Sof::openWrite(File::MODE access_mode_a) {    boolean new_file = false;    // open the file as a standard Unix stream  //  if (access_mode_a == File::WRITE_ONLY) {    // note: WRITE_PLUS is used for WRITE_ONLY to allow for index    // manipulation. the user is kept from reading a write only file    // through software.    //    if (!fp_d.open(expanded_name_d, File::WRITE_PLUS)) {      Error::handle(name(), L"openWrite", Error::IO, __FILE__,		    __LINE__, Error::WARNING);      cleanUp();      return false;    }    new_file = true;      }  else if (access_mode_a == File::WRITE_PLUS) {        if (!fp_d.open(expanded_name_d, File::WRITE_PLUS)) {      Error::handle(name(), L"openWrite", Error::IO, __FILE__, __LINE__,		    Error::WARNING);      cleanUp();      return false;    }    new_file = true;  }  else if (access_mode_a == File::READ_PLUS) {        if (!fp_d.open(expanded_name_d, File::READ_PLUS)) {      Error::handle(name(), L"openWrite", Error::IO, __FILE__, __LINE__,		    Error::WARNING);      cleanUp();      return false;    }  }  else {    // invalid mode    //    return Error::handle(name(), L"openWrite", Error::ARG, __FILE__, __LINE__);  }    // grab a lock  //  if (!disable_lock_d) {    if (!fp_d.lock(lock_retry_d, lock_delay_d)) {      Error::handle(name(), L"openWrite", Error::FILE_LOCK, __FILE__, __LINE__,		    Error::WARNING);      cleanUp();      return false;    }  }    // if the file exists, read it in  //  if (!new_file) {    // make sure it is an Sof file    //    if (!isSof()) {      Error::handle(name(), L"openWrite", ERR_NOTSOF, __FILE__, __LINE__,		    Error::WARNING);      cleanUp();      return false;    }        // load the index    //    if (file_type_d == File::TEXT) {      return openReadText();    }    else if (file_type_d == File::BINARY) {      return openReadBinary();    }    else {      Error::handle(name(), L"openWrite", ERR_NOTSOF, __FILE__, __LINE__,		    Error::WARNING);      cleanUp();      return false;    }  }  else {    // set the class name and version strings to default values    //    cname_d.assign(CLASS_NAME);    version_d.assign(VERSION);    fp_d.setBMode(File::NATIVE);        // update the header    //    if (!update()) {      return Error::handle(name(), L"openWrite", ERR_UPDATE,			   __FILE__, __LINE__);    }        // set the end_of_data pointer to the end_of_header_d, as we have no data.    //    end_of_data_d = end_of_header_d;  }    // exit gracefully  //  return true;}// method: openRead//// arguments: none//// return: a boolean value indicating status//// this method opens a file for read only access.//boolean Sof::openRead() {  // open the file as a standard Unix stream  //  if (!fp_d.open(expanded_name_d, File::READ_ONLY)) {    Error::handle(name(), L"openRead", Error::FILE_NOTFND,		  __FILE__, __LINE__, Error::WARNING);    cleanUp();    return false;  }  // is it an Sof file  //  if (!isSof()) {    Error::handle(name(), L"openRead", ERR_NOTSOF, __FILE__,		  __LINE__, Error::WARNING);    cleanUp();    return false;  }  // load the index  //  if (file_type_d == File::TEXT) {    return openReadText();  }  else if (file_type_d == File::BINARY) {    return openReadBinary();  }  // exit ungracefully  //  Error::handle(name(), L"openRead", ERR_NOTSOF, __FILE__, __LINE__,		Error::WARNING);  cleanUp();  return false;}// method: openReadIndexText//// arguments: none//// return: a boolean value indicating status//// this method parses a text sof file, reading the index//boolean Sof::openReadIndexText() {  // declare buffers for parsing an object entry  //  SysString buf(SysString::MAX_LENGTH);  SysString object_name(SofSymbolTable::MAX_SYM_LENGTH);  long object_sym = SofSymbolTable::NO_SYMB;  long object_tag = SofList::NO_TAG;  long last_sym = SofSymbolTable::NO_SYMB;  long last_tag = SofList::NO_TAG;    boolean previous = false;    long cur_line_pos = ftell();  long data_pos = -1;  // loop over the entire file  //  while (fp_d.get(buf)) {    // is this line a label?    //    if (parseLabel(object_name, object_tag, buf)) {            if (object_tag == FREE_TAG) {		// we have a tag with no explicitly set tag number. set the	// number	//	object_tag = implicit_count_d++;		// check for overflow	//	if (implicit_count_d > IMPLICIT_END) {	  Error::handle(name(), L"openReadIndexText", ERR_IMPLIC, __FILE__,			__LINE__, Error::WARNING);	  cleanUp();	  return false;	}      }      else if (object_tag <= IMPLICIT_END) {	Error::handle(name(), L"openReadIndexText", ERR_TAG, __FILE__,		      __LINE__, Error::WARNING);      }          // grab the object position. this will probably need to be      // extended if we have anything but text in the label.      //      long object_pos = ftell() - buf.length() - 1;      // get the symbol table index for the name      //      object_sym = table_d.add(object_name);            // add the object to the index      //      if (!index_d.add(object_sym, object_tag, object_pos, (long)-1)) {	Error::handle(name(), L"openReadIndexText", SofList::ERR_ADD,		      __FILE__, __LINE__, Error::WARNING);	cleanUp();	return false;      }            // now we set the size of the previous entry      //      if (previous) {	// find the previous entry	//	if (!index_d.find(last_sym, last_tag)) {	  return Error::handle(name(), L"openReadIndexText", Error::MEM,			       __FILE__, __LINE__);	}	// set the size	//	index_d.setSize(cur_line_pos - data_pos);      }      // set the last values for the next pass      //      last_sym = object_sym;      last_tag = object_tag;      previous = true;      // data_pos will be used for size computation      //      data_pos = ftell();    }        // save the current line position for possible use in a size    //    cur_line_pos = ftell();  }  // set the size of the last object  //  if (previous) {    // find the previous entry    //    if (!index_d.find(last_sym, last_tag)) {      return Error::handle(name(), L"openReadIndexText", Error::MEM,			   __FILE__, __LINE__);    }    // set the size    //    index_d.setSize(cur_line_pos - data_pos);  }      // exit gracefully  //  return true;}// method: openReadIndexBinary//// arguments: none//// return: a boolean value indicating status//// this method open and reads the index from an sof file//boolean Sof::openReadIndexBinary() {  // seek to the end of data  //  if (!fseek(end_of_data_d, File::POS)) {    return Error::handle(name(), L"openReadIndexBinary",			 Error::SEEK, __FILE__, __LINE__);  }    // debug information  //  if (debug_level_d > Integral::BRIEF) {    SysString output;    output.assign((long)ftell());    output.insert(L"reading table from ", 0);    Console::put(output);  }  // clear the checksum  //  cksm_d.clear(Integral::RETAIN);    // read the symbol table  //  if (!readTable()) {    Error::handle(name(), L"openReadIndexBinary", Error::IO,		  __FILE__, __LINE__, Error::WARNING);    cleanUp();    return false;  }    // debug information  //  if (debug_level_d > Integral::BRIEF) {    SysString output;    output.assign((long)ftell());    output.insert(L"reading index from ", 0);    Console::put(output);  }    // read the binary index  //  if (!readIndex()) {    Error::handle(name(), L"openReadIndexBinary", Error::IO,		  __FILE__, __LINE__, Error::WARNING);    cleanUp();    return false;  }  // make sure the checksum matches  //  ushort checksum_computed = cksm_d.get();  if (checksum_computed != file_checksum_d) {    return Error::handle(name(), L"openReadIndexBinary", Checksum::ERR,			 __FILE__, __LINE__, Error::WARNING);    cleanUp();    return false;  }    // exit gracefully  //  return true;}

⌨️ 快捷键说明

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