static int64_t Convert(double aTime, void* aClosure) { TrackRate sampleRate = IdealAudioRate(); ConvertTimeToTickHelper* This = static_cast<ConvertTimeToTickHelper*> (aClosure); TrackTicks tick = This->mSourceStream->GetCurrentPosition(); StreamTime streamTime = TicksToTimeRoundDown(sampleRate, tick); GraphTime graphTime = This->mSourceStream->StreamTimeToGraphTime(streamTime); StreamTime destinationStreamTime = This->mDestinationStream->GraphTimeToStreamTime(graphTime); return TimeToTicksRoundDown(sampleRate, destinationStreamTime + SecondsToMediaTime(aTime)); }
TrackTicks WebAudioUtils::ConvertDestinationStreamTimeToSourceStreamTime(double aTime, AudioNodeStream* aSource, MediaStream* aDestination) { StreamTime streamTime = std::max<MediaTime>(0, SecondsToMediaTime(aTime)); GraphTime graphTime = aDestination->StreamTimeToGraphTime(streamTime); StreamTime thisStreamTime = aSource->GraphTimeToStreamTimeOptimistic(graphTime); TrackTicks ticks = TimeToTicksRoundUp(aSource->SampleRate(), thisStreamTime); return ticks; }
double AudioNodeStream::TimeFromDestinationTime(AudioNodeStream* aDestination, double aSeconds) { MOZ_ASSERT(aDestination->SampleRate() == SampleRate()); double destinationSeconds = std::max(0.0, aSeconds); StreamTime streamTime = SecondsToMediaTime(destinationSeconds); // MediaTime does not have the resolution of double double offset = destinationSeconds - MediaTimeToSeconds(streamTime); GraphTime graphTime = aDestination->StreamTimeToGraphTime(streamTime); StreamTime thisStreamTime = GraphTimeToStreamTimeOptimistic(graphTime); double thisSeconds = MediaTimeToSeconds(thisStreamTime) + offset; MOZ_ASSERT(thisSeconds >= 0.0); return thisSeconds; }