I read quite few posts of this thread, and I think, I can add my two cents to summarize it. I have some programming background, and I focus on DSP audio (and MIDI) programming. But only on an advanced hobbyist level.
The core, the heart of every DAW is the sample clock. Whatever sample rate you set your project to, that's the clock's ratio. All other rulers are computed from this. If your project is at 44.1 kHz, it counts 44100 samples for a second. It advances in integers. After sample 1 comes sample 2, etc. And time is computed from this. For example, at 44.1 kHz time has a step value of 1/44100 ≈ 0.000023s.
However, there's also a musical format to be considered. BPM and measure are a time-based format. Under specific circumstances, a musical position can be between 2 samples. But that does not influence the sample clock. 44100 samples per second are outputted sample after sample, no matter what.
We can see that in code. The tracktion engine of the Waveform DAW is open source. In order to play or render, it uses a helper function to convert time/musical time to sample position:
C++:
toSamples (TimePosition p, double sampleRate)
{
return static_cast<int64_t> (
(p.inSeconds() * sampleRate)
+ (p.inSeconds() >= 0.0 ? 0.5 : -0.5));
}
This simply rounds to the nearest Integer. And any task uses this to set the position. For example, in the Lagrange-Resampler in WaveNode, we find
C++:
setPosition (TimePosition t)
{
setPosition (toSamples (t, getSampleRate()));
}
Within a DAW, the Position is always on the sample grid, even if it tells you 4/2/3 or 27,38s.
However, and that's why I explicitly chose the LagrangeResampler example, any wave file that is not in the DAW's sample rate, has to be resampled. It keeps the same starting position and length, but of course the new sample points are interpolated from the source. Very simplified example: source is at sample rate x, project is at x * 2, source will take its sample 1 as the new sample 1, then a calculated value between sample 1 and 2 as new sample 2, then sample 2 as new sample 3, then a calculated value between sample 2 and 3 as new sample 4, and so on.
This would then let any null test fail, of course, although both audio clips are technically identical, just with different resolutions. And resampling is used for a lot more than just an import sample rate conversion. Anytime, when audio is set to follow tempo, when pitch correcting, and more. The only time, any audio copy is exactly the same after rendering, is when all audio helper tools are disabled, the rate of the project matches the rate of the audio file, and the region of the copy can not be mis-rounded (that has nothing to do with the audio engine, but with the precision of the float format)