Yo @Dad72 thanks for all you help thus far. I know its extremly frustrating to track down.
Let me recap.
First. I am using babylonjs with my toolkit runtime, that basically gives me script component (Unity-Style) life cycle for which i iwrite my BJS code. I only export models from unity.
Second. The setup (even the partent/child stuff) worked perfect in V1 for years. All the spatial stuff, linear rolloff, min and max distances. Both sounds are spatial. Both sound when far away the sound is lower, when camera is following the car, both sounds are aat the desired volume levels. I used this setup in Ammo.js using btRaycastVehicle for YEARS, then when got Havok and I switched the physics engine and created my own havok vehicle controller. That also worked fine.
Then we switched to V2 audio and made that the default. That is when shit blew up. I have been following @docEdub edits and progess on how to implement V2 audio. I made the AudioSource.ts wrapper class that basically support V1 and V2 for the same thing, for example:
My legacy audio setup:
/**
* Set legacy audio data source (BABYLON.Sound)
*/
public setLegacyDataSource(source:string|ArrayBuffer|MediaStream):void {
if (this._audio != null) {
this._audio.dispose();
this._audio = null;
}
const spatialBlend:boolean = (this._spatialblend >= 0.1);
const htmlAudioElementRequired:boolean = (this.transform.metadata != null && this.transform.metadata.vtt != null && this.transform.metadata.vtt === true);
this._initializedReadyInstance = false;
this._audio = new BABYLON.Sound(this._name, source, this.scene, () => {
this._lastmutedvolume = this._volume;
(this._audio as BABYLON.Sound).setVolume((this._mute === true) ? 0 : this._volume);
(this._audio as BABYLON.Sound).setPlaybackRate(this._pitch);
(this._audio as BABYLON.Sound).setPosition(this.transform.absolutePosition.clone());
this._initializedReadyInstance = true;
if (spatialBlend === true && this._audio instanceof BABYLON.Sound)
{
this._isAudioSpatial = true;
this._audio.attachToMesh(this.transform);
}
if (this.onReadyObservable && this.onReadyObservable.hasObservers()) {
this.onReadyObservable.notifyObservers(this._audio);
}
if (this._playonawake === true) this.play();
}, {
loop: this._loop,
autoplay: false, // Note: Never Auto Play Here
refDistance: this._mindistance,
maxDistance: this._maxdistance,
rolloffFactor: TOOLKIT.AudioSource.DEFAULT_ROLLOFF,
spatialSound: spatialBlend,
distanceModel: "linear",
streaming: htmlAudioElementRequired
});
}
and V2 audio setup:
public async setAudioDataSource(source: string | ArrayBuffer): Promise<void> {
if (this._audio != null) {
this._audio.dispose();
this._audio = null;
}
const spatialBlend: boolean = (this._spatialblend >= 0.1);
this._initializedReadyInstance = false;
this._lastmutedvolume = this._volume;
const defaultOptions: any = {
loop: this._loop,
volume: (this._mute === true) ? 0 : this._volume,
autoplay: false, // Note: Never Auto Play Here
autoUpdate: true,
playbackRate: this._pitch,
spatialEnabled: spatialBlend,
spatialAutoUpdate: true,
spatialPosition: new BABYLON.Vector3(0,0,0),
spatialRotationQuaternion: new BABYLON.Quaternion(0,0,0,1),
spatialPanningModel: "equalpower",
spatialDistanceModel: "linear",
spatialMinDistance: this._mindistance,
spatialMaxDistance: this._maxdistance,
spatialRolloffFactor: TOOLKIT.AudioSource.DEFAULT_ROLLOFF,
spatialConeInnerAngle: 360,
spatialConeOuterAngle: 360
}
this._audio = await TOOLKIT.AudioSource.CreateStaticSound(this._name, source, defaultOptions);
if (this._audio != null) {
this._initializedReadyInstance = true;
if (spatialBlend === true && this._audio.spatial != null)
{
this._audio.spatial.position = new BABYLON.Vector3(0,0,0);
this._audio.spatial.rotationQuaternion = new BABYLON.Quaternion(0,0,0,1);
this._audio.spatial.panningModel = "equalpower";
this._audio.spatial.distanceModel = "linear";
this._audio.spatial.minDistance = this._mindistance;
this._audio.spatial.maxDistance = this._maxdistance;
this._audio.spatial.rolloffFactor = TOOLKIT.AudioSource.DEFAULT_ROLLOFF;
this._audio.spatial.coneInnerAngle = 360;
this._audio.spatial.coneOuterAngle = 360;
this._audio.spatial.attach(this.transform, true, BABYLON.SpatialAudioAttachmentType.PositionAndRotation);
this._isAudioSpatial = true;
}
if (this.onReadyObservable && this.onReadyObservable.hasObservers()) {
this.onReadyObservable.notifyObservers(this._audio);
}
if (this._playonawake === true) this.play();
}
}
and to play and audio track:
/**
* Play the sound track
* @param time (optional) Start the sound after X seconds. Start immediately (0) by default.
* @param offset (optional) Start the sound at a specific time in seconds
* @param length (optional) Sound duration (in seconds)
*/
public async play(time?: number, offset?: number, length?: number): Promise<boolean> {
await TOOLKIT.AudioSource.UnlockAudioEngine(); // Note: Always Attempt To Unlock Current Audio Engine (V2 Preferred) On Play
this.internalPlay(time, offset, length);
return true;
}
private internalPlay(time?: number, offset?: number, length?: number): void {
if (this._audio != null) {
if (this._initializedReadyInstance === true) {
if (this._audio instanceof BABYLON.StaticSound) {
this._audio.play({ waitTime:time, startOffset:offset, duration:length });
} else if (this._audio instanceof BABYLON.Sound) {
this._audio.play(time, offset, length);
}
this._isAudioPlaying = true;
this._isAudioPaused = false;
} else {
this.onReadyObservable.addOnce(() => {
if (this._audio instanceof BABYLON.StaticSound) {
this._audio.play({ waitTime:time, startOffset:offset, duration:length });
} else if (this._audio instanceof BABYLON.Sound) {
this._audio.play(time, offset, length);
}
this._isAudioPlaying = true;
this._isAudioPaused = false;
});
}
}
}
So if legacy V1, I am using the BABYLON.Sound class and when V2, I am using the BABYLON.StaticSound class
I also am not sure about the parent child relationship. We never had this kind of issue in V1.
Again really frustrating trying to track down what is V2 doing that spatial sound is so much different.
If I simply, Enable Legacy V1 Audio Engine on construction { audioEngine: true } and force V1.
EVERYTHING IS PERFECT, so positions of my car and its wheels are no different.
I dont know man, i am bout to give up on V2 audio for now 
But hey man, I really appreciate all you have done to try and help me figure this out, thanks so much 
@Deltakosh , please dont completly remove V1 audio in near future, until i can figure out these V2 spatial audio issues.
I have to return to try and get my Havok Vehicle Demos working for the V9 video release. So i guess i will jut have to host on my own index.html pages where I can control the V1 legacy audio options.