Die beiden Varianten machen schlicht nicht das gleiche (insbesondere im Falle von isAudioOnly = False bei beiden Objekten).
Dein funktionierender Code macht das:
Delphi-Quellcode:
function CompareAudioAtEnd(input1, input2: Pointer): Integer;
var
b1, b2: Boolean;
begin
b1 := TMMItem(input1).isAudioOnly;
b2 := TMMItem(input2).isAudioOnly;
if not (b1 xor b2) then
Result := CompareText(TMMItem(input1).InputName, TMMItem(input2).InputName)
else if b1 then
Result := 1
else
Result := -1;
end;
Wobei im Falle von unterschiedlichen Werten für isAudioOnly das Verhalten dennoch anders ist. Aber ich schätze mal dieses ist gewollt.