void CSentence::Append( float starttime, const CSentence& src ) { #if PHONEME_EDITOR int i; // Combine for ( i = 0 ; i < src.m_Words.Size(); i++ ) { CWordTag *word = src.m_Words[ i ]; CWordTag *newWord = new CWordTag( *word ); newWord->m_flStartTime += starttime; newWord->m_flEndTime += starttime; // Offset times int c = newWord->m_Phonemes.Count(); for ( int i = 0; i < c; ++i ) { CPhonemeTag *tag = newWord->m_Phonemes[ i ]; tag->AddStartTime( starttime ); tag->AddEndTime( starttime ); } AddWordTag( newWord ); } if ( src.GetText()[ 0 ] ) { char fulltext[ 4096 ]; if ( GetText()[ 0 ] ) { Q_snprintf( fulltext, sizeof( fulltext ), "%s %s", GetText(), src.GetText() ); } else { Q_strncpy( fulltext, src.GetText(), sizeof( fulltext ) ); } SetText( fulltext ); } int c = src.m_EmphasisSamples.Size(); for ( i = 0; i < c; i++ ) { CEmphasisSample s = src.m_EmphasisSamples[ i ]; s.time += starttime; m_EmphasisSamples.AddToTail( s ); } // Or in voice duck settings m_bShouldVoiceDuck |= src.m_bShouldVoiceDuck; #else Assert( 0 ); #endif }
//----------------------------------------------------------------------------- // Purpose: Assignment operator // Input : src - // Output : CSentence& //----------------------------------------------------------------------------- CSentence& CSentence::operator=( const CSentence& src ) { int i; // Clear current stuff Reset(); int c; #if PHONEME_EDITOR // Copy everything for ( i = 0 ; i < src.m_Words.Size(); i++ ) { CWordTag *word = src.m_Words[ i ]; CWordTag *newWord = new CWordTag( *word ); AddWordTag( newWord ); } SetText( src.GetText() ); m_nResetWordBase = src.m_nResetWordBase; c = src.m_EmphasisSamples.Size(); for ( i = 0; i < c; i++ ) { CEmphasisSample s = src.m_EmphasisSamples[ i ]; m_EmphasisSamples.AddToTail( s ); } #endif m_bIsCached = src.m_bIsCached; c = src.GetRuntimePhonemeCount(); for ( i = 0; i < c; i++ ) { Assert( m_bIsCached ); const CBasePhonemeTag *tag = src.GetRuntimePhoneme( i ); CPhonemeTag full; ((CBasePhonemeTag &)(full)) = *tag; AddRuntimePhoneme( &full ); } m_bShouldVoiceDuck = src.m_bShouldVoiceDuck; #if PHONEME_EDITOR m_bStoreCheckSum = src.m_bStoreCheckSum; m_uCheckSum = src.m_uCheckSum; #endif m_bIsValid = src.m_bIsValid; return (*this); }
//----------------------------------------------------------------------------- // Purpose: Assignment operator // Input : src - // Output : CSentence& //----------------------------------------------------------------------------- CSentence& CSentence::operator=( const CSentence& src ) { // Clear current stuff Reset(); // Copy everything for ( int i = 0 ; i < src.m_Words.Size(); i++ ) { CWordTag *word = src.m_Words[ i ]; CWordTag *newWord = new CWordTag( *word ); AddWordTag( newWord ); } SetText( src.m_szText ); m_nResetWordBase = src.m_nResetWordBase; int c = src.m_EmphasisSamples.Size(); for ( i = 0; i < c; i++ ) { CEmphasisSample s = src.m_EmphasisSamples[ i ]; m_EmphasisSamples.AddToTail( s ); } for ( int l = 0; l < CC_NUM_LANGUAGES; l++ ) { c = src.m_CloseCaption[ l ].Count(); for ( i = 0; i < c; i++ ) { CCloseCaptionPhrase *phrase = new CCloseCaptionPhrase( (*src.m_CloseCaption[ l ][ i ]) ); m_CloseCaption[ l ].AddToTail( phrase ); } } m_bShouldVoiceDuck = src.m_bShouldVoiceDuck; return (*this); }
void CSentence::ParseWords( CUtlBuffer& buf ) { char token[ 4096 ]; char word[ 256 ]; float start, end; while ( 1 ) { buf.GetString( token ); if ( !stricmp( token, "}" ) ) break; if ( stricmp( token, "WORD" ) ) break; buf.GetString( token ); Q_strncpy( word, token, sizeof( word ) ); buf.GetString( token ); start = atof( token ); buf.GetString( token ); end = atof( token ); CWordTag *wt = new CWordTag( word ); assert( wt ); wt->m_flStartTime = start; wt->m_flEndTime = end; AddWordTag( wt ); buf.GetString( token ); if ( stricmp( token, "{" ) ) break; while ( 1 ) { buf.GetString( token ); if ( !stricmp( token, "}" ) ) break; // Parse phoneme int code; char phonemename[ 256 ]; float start, end; float volume; code = atoi( token ); buf.GetString( token ); Q_strncpy( phonemename, token, sizeof( phonemename ) ); buf.GetString( token ); start = atof( token ); buf.GetString( token ); end = atof( token ); buf.GetString( token ); volume = atof( token ); CPhonemeTag *pt = new CPhonemeTag(); assert( pt ); pt->SetPhonemeCode( code ); pt->SetTag( phonemename ); pt->SetStartTime( start ); pt->SetEndTime( end ); AddPhonemeTag( wt, pt ); } } }
void CSentence::CreateEventWordDistribution( char const *pszText, float flSentenceDuration ) { Assert( pszText ); if ( !pszText ) return; int wordCount = CountWords( pszText ); if ( wordCount <= 0 ) return; float wordLength = ( flSentenceDuration - 2 * STARTEND_TIMEGAP) / (float)wordCount; float wordStart = STARTEND_TIMEGAP; Reset(); char word[ 256 ]; unsigned char const *in = (unsigned char *)pszText; char *out = word; while ( *in ) { if ( !ShouldSplitWord( *in ) ) { *out++ = *in++; } else { *out = 0; // Skip over splitters while ( *in && ( ShouldSplitWord( *in ) ) ) { in++; } if ( strlen( word ) > 0 ) { CWordTag *w = new CWordTag(); Assert( w ); w->SetWord( word ); w->m_flStartTime = wordStart; w->m_flEndTime = wordStart + wordLength; AddWordTag( w ); wordStart += wordLength; } out = word; } } *out = 0; if ( strlen( word ) > 0 ) { CWordTag *w = new CWordTag(); Assert( w ); w->SetWord( word ); w->m_flStartTime = wordStart; w->m_flEndTime = wordStart + wordLength; AddWordTag( w ); wordStart += wordLength; } }