Yes, it seems pretty clear both scripts are calling on the same audio source at different times.
During the physics step, the collision handler is trying to play a sound when a collision occurs.
But the movement script will change the audiosource immediately on update, either changing it to play an engine sound or stop altogether. Either way, there’s no time to play the collision sound.
Your FreezeMovement() method happens during the physics step, before the next Update() cycle can occur, preventing this from happening.
Two other solutions that would likely work:
The collision handler can use AudioSource.PlayClipAtPoint instead. This will play the sound once, creating a temporary audio source for the file to use so it won’t have to use the ship’s audio source. This gives less control (can’t adjust the volume and pitch and stuff) but is great for collision, impact, and death sounds so you can do whatever you want to the main player object and the sound won’t be affected.
The other solution would be to place your movement script on a child object with its own AudioSource so the two scripts don’t have to share the same AudioSource. The child object could be called “Engines” or something. Some of the references in the script may have to be changed.
(Personally, I like to keep an audio source dedicated to one sound effect when I can, but often represent effects with temporarily created objects that often have their own audio source and particle system, and a small script.)