void TextGrids_append_inline (TextGrid me, TextGrid thee, bool preserveTimes) { try { if (my tiers -> size != thy tiers -> size) { Melder_throw ("The number of tiers must be equal."); } if (preserveTimes && thy xmin < my xmax) { Melder_throw ("The start time of the second TextGrid can't be earlier than the end time of the first one if you want to preserve times."); } // all tiers must have the same end time // last intervals must have the same end time double xmax = preserveTimes ? thy xmax : my xmax + (thy xmax - thy xmin); for (long itier = 1; itier <= my tiers -> size; itier++) { Function myTier = (Function) my tiers -> item[itier], thyTier = (Function) thy tiers -> item[itier]; if (myTier -> classInfo == classIntervalTier && thyTier -> classInfo == classIntervalTier) { IntervalTier ti = (IntervalTier) myTier; IntervalTiers_append_inline (ti, (IntervalTier) thy tiers -> item[itier], preserveTimes); // make sure last interval has correct end tTime TextInterval last = (TextInterval) ti -> intervals -> item [ti -> intervals -> size]; last -> xmax = xmax; Melder_assert (last -> xmax > last -> xmin); } else if (myTier -> classInfo == classTextTier && thyTier -> classInfo == classTextTier) { TextTier ti = (TextTier) myTier; TextTiers_append_inline (ti, (TextTier) thy tiers -> item [itier], preserveTimes); ti -> xmax = xmax; } else { Melder_throw ("Tier number ", Melder_integer (itier), " in the second TextGrid is of different type as the corresponding tier in the first TextGrid."); } } my xmax = xmax; } catch (MelderError) { Melder_throw ("TextGrids not appended."); } }
void TextGrids_append_inline (TextGrid me, TextGrid thee, bool preserveTimes) { try { if (my tiers -> size != thy tiers -> size) { Melder_throw (U"The number of tiers must be equal."); } if (preserveTimes && thy xmin < my xmax) { Melder_throw (U"The start time of the second TextGrid can't be earlier than the end time of the first one if you want to preserve times."); } TextGrid_checkStartAndEndTimesOfTiers (me); // all tiers must have the same start/end time as textgrid TextGrid_checkStartAndEndTimesOfTiers (thee); // last intervals must have the same end time double xmax = preserveTimes ? thy xmax : my xmax + (thy xmax - thy xmin); for (long itier = 1; itier <= my tiers -> size; itier++) { Function myTier = my tier (itier), thyTier = thy tier (itier); if (myTier -> classInfo == classIntervalTier && thyTier -> classInfo == classIntervalTier) { IntervalTier myIntervalTier = static_cast <IntervalTier> (myTier); IntervalTier thyIntervalTier = static_cast <IntervalTier> (thyTier); IntervalTiers_append_inline (myIntervalTier, thyIntervalTier, preserveTimes); // make sure last interval has correct end time TextInterval lastInterval = myIntervalTier -> interval (myIntervalTier -> numberOfIntervals()); lastInterval -> xmax = xmax; Melder_assert (lastInterval -> xmax > lastInterval -> xmin); } else if (myTier -> classInfo == classTextTier && thyTier -> classInfo == classTextTier) { TextTier myTextTier = static_cast <TextTier> (myTier); TextTier thyTextTier = static_cast <TextTier> (thyTier); TextTiers_append_inline (myTextTier, thyTextTier, preserveTimes); myTextTier -> xmax = xmax; } else { Melder_throw (U"Tier ", itier, U" in the second TextGrid is of a different type " "than tier ", itier, U" in the first TextGrid."); } } my xmax = xmax; } catch (MelderError) { Melder_throw (U"TextGrids not appended."); } }