SINT32 NOTERecord::WriteRecord(FileWriter &writer) { WRITE(EDID); WRITE(OBND); WRITE(FULL); MODL.Write(writer); WRITE(ICON); WRITE(MICO); WRITE(YNAM); WRITE(ZNAM); WRITE(DATA); WRITE(ONAM); WRITE(XNAM); if(IsVoice()) WRITEAS(TNAMAlt,TNAM); else WRITE(TNAM); WRITE(SNAM); return -1; }
bool NOTERecord::VisitFormIDs(FormIDOp &op) { if(!IsLoaded()) return false; if(MODL.IsLoaded()) { for(UINT32 x = 0; x < MODL->Textures.MODS.size(); x++) op.Accept(MODL->Textures.MODS[x]->texture); } if(YNAM.IsLoaded()) op.Accept(YNAM.value); if(ZNAM.IsLoaded()) op.Accept(ZNAM.value); for(UINT32 x = 0; x < ONAM.value.size(); x++) op.Accept(ONAM.value[x]); if(IsVoice() && TNAMAlt.IsLoaded()) op.Accept(TNAMAlt.value); if(SNAM.IsLoaded()) op.Accept(SNAM.value); return op.Stop(); }
uint32_t NOTERecord::GetFieldAttribute(FIELD_IDENTIFIERS, uint32_t WhichAttribute) { switch(FieldID) { case 0: //recType return GetType(); case 1: //flags1 return CB_UINT32_FLAG_FIELD; case 2: //fid return CB_FORMID_FIELD; case 3: //versionControl1 switch(WhichAttribute) { case 0: //fieldType return CB_UINT8_ARRAY_FIELD; case 1: //fieldSize return 4; default: return CB_UNKNOWN_FIELD; } return CB_UNKNOWN_FIELD; case 4: //eid return CB_ISTRING_FIELD; case 5: //formVersion return CB_UINT16_FIELD; case 6: //versionControl2 switch(WhichAttribute) { case 0: //fieldType return CB_UINT8_ARRAY_FIELD; case 1: //fieldSize return 2; default: return CB_UNKNOWN_FIELD; } return CB_UNKNOWN_FIELD; case 7: //boundX1 return CB_SINT16_FIELD; case 8: //boundY1 return CB_SINT16_FIELD; case 9: //boundZ1 return CB_SINT16_FIELD; case 10: //boundX2 return CB_SINT16_FIELD; case 11: //boundY2 return CB_SINT16_FIELD; case 12: //boundZ2 return CB_SINT16_FIELD; case 13: //full return CB_STRING_FIELD; case 14: //modPath return CB_ISTRING_FIELD; case 15: //modb return CB_FLOAT32_FIELD; case 16: //modt_p switch(WhichAttribute) { case 0: //fieldType return CB_UINT8_ARRAY_FIELD; case 1: //fieldSize return MODL.IsLoaded() ? MODL->MODT.GetSize() : 0; default: return CB_UNKNOWN_FIELD; } return CB_UNKNOWN_FIELD; case 17: //altTextures if(!MODL.IsLoaded()) return CB_UNKNOWN_FIELD; if(ListFieldID == 0) //altTextures { switch(WhichAttribute) { case 0: //fieldType return CB_LIST_FIELD; case 1: //fieldSize return (uint32_t)MODL->Textures.MODS.size(); default: return CB_UNKNOWN_FIELD; } } if(ListIndex >= MODL->Textures.MODS.size()) return CB_UNKNOWN_FIELD; switch(ListFieldID) { case 1: //name return CB_STRING_FIELD; case 2: //texture return CB_FORMID_FIELD; case 3: //index return CB_SINT32_FIELD; default: return CB_UNKNOWN_FIELD; } return CB_UNKNOWN_FIELD; case 18: //modelFlags return CB_UINT8_FLAG_FIELD; case 19: //iconPath return CB_ISTRING_FIELD; case 20: //smallIconPath return CB_ISTRING_FIELD; case 21: //pickupSound return CB_FORMID_FIELD; case 22: //dropSound return CB_FORMID_FIELD; case 23: //noteType return CB_UINT8_TYPE_FIELD; case 24: //quests switch(WhichAttribute) { case 0: //fieldType return CB_FORMID_ARRAY_FIELD; case 1: //fieldSize return (uint32_t)ONAM.value.size(); default: return CB_UNKNOWN_FIELD; } return CB_UNKNOWN_FIELD; case 25: //texturePath return CB_ISTRING_FIELD; case 26: //textOrTopic switch(WhichAttribute) { case 0: //fieldType return CB_FORMID_OR_STRING_FIELD; case 2: //WhichType return IsVoice() ? CB_FORMID_FIELD : CB_STRING_FIELD; default: return CB_UNKNOWN_FIELD; } return CB_UNKNOWN_FIELD; case 27: //sound return CB_FORMID_FIELD; default: return CB_UNKNOWN_FIELD; } return CB_UNKNOWN_FIELD; }
bool NOTERecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, uint32_t ArraySize) { switch(FieldID) { case 1: //flags1 SetHeaderFlagMask(*(uint32_t *)FieldValue); break; case 3: //versionControl1 if(ArraySize != 4) break; ((UINT8ARRAY)&flagsUnk)[0] = ((UINT8ARRAY)FieldValue)[0]; ((UINT8ARRAY)&flagsUnk)[1] = ((UINT8ARRAY)FieldValue)[1]; ((UINT8ARRAY)&flagsUnk)[2] = ((UINT8ARRAY)FieldValue)[2]; ((UINT8ARRAY)&flagsUnk)[3] = ((UINT8ARRAY)FieldValue)[3]; break; case 4: //eid EDID.Copy((char *)FieldValue); break; case 5: //formVersion formVersion = *(uint16_t *)FieldValue; break; case 6: //versionControl2 if(ArraySize != 2) break; versionControl2[0] = ((UINT8ARRAY)FieldValue)[0]; versionControl2[1] = ((UINT8ARRAY)FieldValue)[1]; break; case 7: //boundX1 OBND.value.x1 = *(int16_t *)FieldValue; break; case 8: //boundY1 OBND.value.y1 = *(int16_t *)FieldValue; break; case 9: //boundZ1 OBND.value.z1 = *(int16_t *)FieldValue; break; case 10: //boundX2 OBND.value.x2 = *(int16_t *)FieldValue; break; case 11: //boundY2 OBND.value.y2 = *(int16_t *)FieldValue; break; case 12: //boundZ2 OBND.value.z2 = *(int16_t *)FieldValue; break; case 13: //full FULL.Copy((char *)FieldValue); break; case 14: //modPath MODL.Load(); MODL->MODL.Copy((char *)FieldValue); break; case 15: //modb MODL.Load(); MODL->MODB.value = *(float *)FieldValue; break; case 16: //modt_p MODL.Load(); MODL->MODT.Copy((UINT8ARRAY)FieldValue, ArraySize); break; case 17: //altTextures MODL.Load(); if(ListFieldID == 0) //altTexturesSize { MODL->Textures.resize(ArraySize); return false; } if(ListIndex >= MODL->Textures.MODS.size()) break; switch(ListFieldID) { case 1: //name delete []MODL->Textures.MODS[ListIndex]->name; MODL->Textures.MODS[ListIndex]->name = NULL; if(FieldValue != NULL) { ArraySize = (uint32_t)strlen((char *)FieldValue) + 1; MODL->Textures.MODS[ListIndex]->name = new char[ArraySize]; strcpy_s(MODL->Textures.MODS[ListIndex]->name, ArraySize, (char *)FieldValue); } break; case 2: //texture MODL->Textures.MODS[ListIndex]->texture = *(FORMID *)FieldValue; return true; case 3: //index MODL->Textures.MODS[ListIndex]->index = *(int32_t *)FieldValue; break; default: break; } break; case 18: //modelFlags MODL.Load(); MODL->SetFlagMask(*(uint8_t *)FieldValue); break; case 19: //iconPath ICON.Copy((char *)FieldValue); break; case 20: //smallIconPath MICO.Copy((char *)FieldValue); break; case 21: //pickupSound YNAM.value = *(FORMID *)FieldValue; return true; case 22: //dropSound ZNAM.value = *(FORMID *)FieldValue; return true; case 23: //noteType DATA.value = *(uint8_t *)FieldValue; return true; //controls whether textOrTopic is a formID case 24: //quests ONAM.resize(ArraySize); for(uint32_t x = 0; x < ArraySize; x++) ONAM.value[x] = ((FORMIDARRAY)FieldValue)[x]; return true; case 25: //texturePath XNAM.Copy((char *)FieldValue); break; case 26: //textOrTopic if(IsVoice()) { TNAMAlt.value = *(FORMID *)FieldValue; return true; } else { TNAM.Copy((char *)FieldValue); break; } break; case 27: //sound SNAM.value = *(FORMID *)FieldValue; return true; default: break; } return false; }
void * NOTERecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) { switch(FieldID) { case 1: //flags1 return &flags; case 2: //fid return &formID; case 3: //versionControl1 *FieldValues = &flagsUnk; return NULL; case 4: //eid return EDID.value; case 5: //formVersion return &formVersion; case 6: //versionControl2 *FieldValues = &versionControl2[0]; return NULL; case 7: //boundX1 return &OBND.value.x1; case 8: //boundY1 return &OBND.value.y1; case 9: //boundZ1 return &OBND.value.z1; case 10: //boundX2 return &OBND.value.x2; case 11: //boundY2 return &OBND.value.y2; case 12: //boundZ2 return &OBND.value.z2; case 13: //full return FULL.value; case 14: //modPath return MODL.IsLoaded() ? MODL->MODL.value : NULL; case 15: //modb return MODL.IsLoaded() ? &MODL->MODB.value : NULL; case 16: //modt_p *FieldValues = MODL.IsLoaded() ? MODL->MODT.value : NULL; return NULL; case 17: //altTextures if(!MODL.IsLoaded()) return NULL; if(ListIndex >= MODL->Textures.MODS.size()) return NULL; switch(ListFieldID) { case 1: //name return MODL->Textures.MODS[ListIndex]->name; case 2: //texture return &MODL->Textures.MODS[ListIndex]->texture; case 3: //index return &MODL->Textures.MODS[ListIndex]->index; default: return NULL; } return NULL; case 18: //modelFlags return MODL.IsLoaded() ? &MODL->MODD.value : NULL; case 19: //iconPath return ICON.value; case 20: //smallIconPath return MICO.value; case 21: //pickupSound return &YNAM.value; case 22: //dropSound return &ZNAM.value; case 23: //noteType return &DATA.value; case 24: //quests *FieldValues = ONAM.IsLoaded() ? &ONAM.value[0] : NULL; return NULL; case 25: //texturePath return XNAM.value; case 26: //textOrTopic return IsVoice() ? (void *)&TNAMAlt.value : (void *)TNAM.value; case 27: //sound return &SNAM.value; default: return NULL; } return NULL; }
void CVoiceDetection::StartEndPointDetection() { int status = 0; int start = 0; int end = 0; int voiceCount = 0; int silenceCount = 0; for( int i = 0; i < m_frameCount; ++i ) { switch (status) { case 0: case 1: if ( IsVoice( m_amplitude[i], m_zeroCrossRate[i] ) ) { start = MAX( ( i - voiceCount -1 ),1 ); status = 2; silenceCount = 0; voiceCount++; } else if( IsMaybeVoice( m_amplitude[i], m_zeroCrossRate[i] )) //可能是语音 { status = 1; voiceCount++; } else { status = 0; voiceCount = 0; } break; case 2: if( IsVoice( m_amplitude[i], m_zeroCrossRate[i] ) ) { voiceCount++; } else { silenceCount++; if( silenceCount < m_minSilence ) voiceCount++; else if( voiceCount < m_minVoice ) { status = 0; silenceCount = 0; voiceCount = 0; } else status = 3; } break; case 3: voiceCount = voiceCount - silenceCount/2; end = start + voiceCount - 1; m_startEndMap.insert( pair<int,int>( start, end ) ); status = 0; silenceCount = 0; voiceCount = 0; break; } }//end for if( voiceCount > m_minVoice ) m_startEndMap.insert( pair<int,int>( m_frameCount - voiceCount,m_frameCount-1 ) ); }
SINT32 NOTERecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { UINT32 subType = 0; UINT32 subSize = 0; while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(OBND): OBND.Read(buffer, subSize); break; case REV32(FULL): FULL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MODL): MODL.Load(); MODL->MODL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MODB): MODL.Load(); MODL->MODB.Read(buffer, subSize); break; case REV32(MODT): MODL.Load(); MODL->MODT.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MODS): MODL.Load(); MODL->Textures.Read(buffer, subSize); break; case REV32(MODD): MODL.Load(); MODL->MODD.Read(buffer, subSize); break; case REV32(ICON): ICON.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MICO): MICO.Read(buffer, subSize, CompressedOnDisk); break; case REV32(YNAM): YNAM.Read(buffer, subSize); break; case REV32(ZNAM): ZNAM.Read(buffer, subSize); break; case REV32(DATA): DATA.Read(buffer, subSize); break; case REV32(ONAM): ONAM.Read(buffer, subSize); break; case REV32(XNAM): XNAM.Read(buffer, subSize, CompressedOnDisk); break; case REV32(TNAM): if(IsVoice()) TNAMAlt.Read(buffer, subSize); else TNAM.Read(buffer, subSize, CompressedOnDisk); break; case REV32(SNAM): SNAM.Read(buffer, subSize); break; default: //printer("FileName = %s\n", FileName); printer(" NOTE: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }