There are two methods: The AO method, and the DRO method.
AO method
On AO, it is a .txt file that bears the same filename as the music track you're trying to loop, e.g. [999] Binary Game.ogg + [999] Binary Game.ogg.txt
Sample rate of the track matters here, .opus tracks are always 48000 sample rate.
There is also a handy music looping guide for the AO method:
https://docs.google.com/document/d/1h3o6-F3syhB388SBEyUXX7PfoBp4MFOC2JoP1nHipQE/edit?tab=t.0
Room Escape and Gameplay.zip
DRO method
The DRO method is based on the music subfolder and bears the same name as the folder, e.g.
dro_castlevania + dro_castlevania.ini
However I don't actually know if the .ini name HAS to be like this, or if it just looks up any ini in the music folder and uses that. Read the DRO codebase for that?

It also uses the sample rates, in addition to having "title" and "filename". "title" is what's used for music display while filename is what is looked up.
[0]
loop_start = 306704
loop_end = 10009867
title = "Belmont The Legend"
filename = "dro_castlevania/Belmont The Legend.opus"
[1]
loop_start = 0
loop_end = 14726653
title = "Blood Drops"
filename = "dro_castlevania/Blood Drops.opus"
[2]
loop_start = 682557
loop_end = 10589414
title = "Crystal Teardrops"
filename = "dro_castlevania/Crystal Teardrops.opus"
The AsyncAO method?!?!?
For AsyncAO, I'd take the AO/DRO method, but also introduce
loop_start_seconds
loop_length_seconds
loop_end_seconds
Working with sample rates is actually really annoying, and I feel if these fields above are defined they should take priority because it can just pre-calculate the required looping points in samples. Basically a user convenience feature.
Alternatively give us an editor so we can set up looping points ourselves like how the Godot Engine lets you do it for looping .ogg and .wav tracks.
There are two methods: The AO method, and the DRO method.
AO method
On AO, it is a .txt file that bears the same filename as the music track you're trying to loop, e.g.
[999] Binary Game.ogg+[999] Binary Game.ogg.txtSample rate of the track matters here, .opus tracks are always 48000 sample rate.
There is also a handy music looping guide for the AO method:
https://docs.google.com/document/d/1h3o6-F3syhB388SBEyUXX7PfoBp4MFOC2JoP1nHipQE/edit?tab=t.0
Room Escape and Gameplay.zip
DRO method
The DRO method is based on the music subfolder and bears the same name as the folder, e.g.

dro_castlevania+dro_castlevania.iniHowever I don't actually know if the .ini name HAS to be like this, or if it just looks up any ini in the music folder and uses that. Read the DRO codebase for that?
It also uses the sample rates, in addition to having "title" and "filename". "title" is what's used for music display while filename is what is looked up.
The AsyncAO method?!?!?
For AsyncAO, I'd take the AO/DRO method, but also introduce
loop_start_secondsloop_length_secondsloop_end_secondsWorking with sample rates is actually really annoying, and I feel if these fields above are defined they should take priority because it can just pre-calculate the required looping points in samples. Basically a user convenience feature.
Alternatively give us an editor so we can set up looping points ourselves like how the Godot Engine lets you do it for looping .ogg and .wav tracks.