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

📄 sof_09.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/io/Sof/sof_09.cc// version: $Id: sof_09.cc,v 1.1 2000/09/22 21:34:44 zhao Exp $//// isip include files//#include "Sof.h"// method: resize//// arguments://  const SysString& name: (input) class name//  long tag: (input) class tag//  long size: (input) new required size//// return: a boolean value indicating status//// resize the current entry, preserving current data//boolean Sof::resize(const SysString& name_a, long tag_a, long size_a) {    // find the object and seek to the beginning of the data  //  if (!find(name_a, tag_a)) {    return Error::handle(name(), L"resize", ERR_NOOBJ,			 __FILE__, __LINE__);  }  // check argument  //  if (size_a < 0) {    return Error::handle(name(), L"resize", Error::ARG, __FILE__, __LINE__);  }  long obj_size = getObjectSize();  long obj_pos = index_d.getPosition();    if (obj_size == size_a) {    // do nothing    //    return true;  }  else if (obj_size > size_a) {    if (!fseek(size_a, File::POS_PLUS_CUR)) {      return Error::handle(name(), L"resize", Error::SEEK, __FILE__, __LINE__);    }    // clear space    //    if (!clearSpace(obj_size - size_a)) {      return Error::handle(name(), L"resize", Error::IO, __FILE__, __LINE__);    }    // reposition the file pointer to the beginning of the object's data    //    if (!rewind()) {      return Error::handle(name(), L"resize", Error::SEEK, __FILE__, __LINE__);    }    // possibly shrink the file, if this is the last object    //    if ((obj_pos + obj_size) == end_of_data_d) {      end_of_data_d -= (obj_size - size_a);    }    // reset the size in the index    //    return index_d.setSize(size_a);  }  else if (obj_size < size_a) {    // here's the tricky part: delete the current entry and make a new    // one at the end    //    long new_pos;    long new_data_pos;          // get the new position (end of file)    //    if (isText()) {      // seek to the end of file      //      if (!fseek(0, File::POS_PLUS_END)) {	return Error::handle(name(), L"resize", Error::SEEK,			     __FILE__, __LINE__);      }      // this is the new position (beginning of label)      //      new_pos = ftell();            // write the label      //      if (!writeLabel(name_a, tag_a)) {	return Error::handle(name(), L"resize", ERR_LABEL,			     __FILE__, __LINE__);      }      // set the new position for the data      //      new_data_pos = ftell();    }    // for binary, seek to end_of_data_d    //    else {            if (!fseek(end_of_data_d, File::POS)) {	return Error::handle(name(), L"resize", Error::SEEK,			     __FILE__, __LINE__);      }      end_of_data_d += size_a;            // both position and data position are the same for binary      //      new_pos = ftell();      new_data_pos = new_pos;    }    // clear out the new space before we copy data over    //    if (!clearSpace(size_a)) {      return Error::handle(name(), L"resize", Error::IO, __FILE__, __LINE__);    }        // copy the data currently in the object to the end of the file    //    if (!copySegment(cur_data_d, new_data_pos, obj_size)) {      return Error::handle(name(), L"resize", Error::IO, __FILE__, __LINE__);    }    // now empty the old space    //    if (!rewind()) {      return Error::handle(name(), L"resize", Error::SEEK, __FILE__, __LINE__);    }    if (!clearSpace(obj_size + cur_data_d - obj_pos)) {      return Error::handle(name(), L"resize", Error::IO, __FILE__, __LINE__);    }        // change the values of position and size for this object    //    index_d.setPosition(new_pos);    index_d.setSize(size_a);        // position us back to the beginning of the new object (this will    // also set cur_data_d)    //    if (!seekData()) {      return Error::handle(name(), L"resize", Error::SEEK, __FILE__, __LINE__);    }  }  // exit gracefully  //  return true;}// method: resize//// arguments://  long size: (input) new required size//// return: a boolean value indicating status//// resize the current entry that is in partial write mode, preserving// current data. this is only for partial_write mode//boolean Sof::resize(long size_a) {    // make sure we are in partial write mode  //  if (!partial_write_d) {    return Error::handle(name(), L"resize", ERR_RESIZE, __FILE__, __LINE__);  }    // check argument  //  if (size_a < 0) {    debug(L"size went to zero");    return Error::handle(name(), L"resize", Error::ARG, __FILE__, __LINE__);  }    long obj_size = getObjectSize();  long obj_pos = index_d.getPosition();    // make sure it is the last entry  //  if (isBinary() && ((obj_size + obj_pos) != end_of_data_d)) {    return Error::handle(name(), L"resize", ERR, __FILE__, __LINE__);  }  if (obj_size == size_a) {    // do nothing    //    return true;  }  else if (obj_size > size_a) {    if (!fseek(size_a, File::POS_PLUS_CUR)) {      return Error::handle(name(), L"resize", Error::SEEK, __FILE__, __LINE__);    }    // clear space    //    if (!clearSpace(obj_size - size_a)) {      return Error::handle(name(), L"resize", Error::IO, __FILE__, __LINE__);    }        // reposition the file pointer to where it was before    //    if (!fseek(-size_a, File::POS_PLUS_CUR)) {      return Error::handle(name(), L"resize", Error::SEEK, __FILE__, __LINE__);    }        if (isBinary()) {      // reset the size in the index      //      index_d.setSize(size_a);      // adjust end_of_data_d      //      end_of_data_d += (size_a - obj_size);    }  }  else if (obj_size < size_a) {        if (isBinary()) {      // reset the size in the index      //      index_d.setSize(size_a);      // adjust end_of_data_d      //      end_of_data_d += (size_a - obj_size);    }  }  // exit gracefully  //  return true;}// method: copySegment//// arguments://  long src_pos: (input) file position of source//  long nbytes: (input) number of bytes to copy//// return: a boolean value indicating status//// this method copies a chunk of nbytes data from src_pos to the end// of the file//boolean Sof::copySegment(long src_pos_a, long nbytes_a) {  // seek the POS_PLUS_END  //  if (!fseek(0, File::POS_PLUS_END)) {    return Error::handle(name(), L"copySegment", Error::SEEK,			 __FILE__, __LINE__);  }  // call the master function  //  return copySegment(src_pos_a, ftell(), nbytes_a);}// method: copySegment//// arguments://  long src_pos: (input) file position of source//  long dst_pos: (input) file position of destination//  long nbytes: (input) number of bytes to copy//// return: a boolean value indicating status//// this method copies a chunk of nbytes data from src_pos to the end// of the file//boolean Sof::copySegment(long src_pos_a, long dst_pos_a, long nbytes_a) {  // seek to the destination  //  if (!fseek(dst_pos_a, File::POS)) {    return Error::handle(name(), L"copySegment", Error::SEEK,			 __FILE__, __LINE__);  }    // copy one buffer at a time  //  static byte buffer[BUFFER_SIZE];  long pass_size;    long diff_pos = dst_pos_a - src_pos_a;    for (long i = nbytes_a; i > 0; i -= BUFFER_SIZE) {     if (i > BUFFER_SIZE) {      pass_size = BUFFER_SIZE;    }    else {      pass_size = i;    }    // seek to the position to copy    //    if (!fseek(-diff_pos, File::POS_PLUS_CUR)) {      return Error::handle(name(), L"copySegment", Error::SEEK,			   __FILE__, __LINE__);    }        if (fp_d.read(buffer, sizeof(byte), pass_size) != pass_size) {      return Error::handle(name(), L"copySegment", Error::READ,			   __FILE__, __LINE__);    }    if (isBinary()) {      cur_pos_d += pass_size * sizeof(byte);    }    // seek to the position to write    //    if (!fseek(diff_pos - pass_size, File::POS_PLUS_CUR)) {      return Error::handle(name(), L"copySegment", Error::SEEK,			   __FILE__, __LINE__);    }        if (fp_d.write(buffer, sizeof(byte), pass_size) != pass_size) {      return Error::handle(name(), L"copySegment", Error::WRITE,			   __FILE__, __LINE__);    }        if (isBinary()) {      cur_pos_d += pass_size * sizeof(byte);    }  }          // exit gracefully  //  return true;}

⌨️ 快捷键说明

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