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.");
	}
}
Пример #2
0
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.");
	}
}