There are a couple of things to consider here. First is loading vs. playing. Sounds come in a couple of different categories:
1. Short sounds that get reused frequently like a beep, click or explosion.
2. Longer sounds that may only happen at specific events, like say a voice over.
3. Long sounds that play in the background for a long duration.
For #1 it’s best to load these in main.lua once and have them available globally and then you just call audio.play() when you need them. You never dispose them, never reload them, etc.
For #2, these sounds eat up a lot of memory and don’t need to be around outside of the scene you’re in. There are two schools of thought. a) load them in scene:create() and dispose them in scene:destroy() or load them in scene:show()'s did phase and dispose them in either of the scene:hide()'s phases. You don’t want loading big files to impact the performance of the scene transition. If it’s a sound you need right away, use audio.loadStream() instead of audio.loadSound().
For #3, if the background track is scene dependent, then treat as #2 above. But If the background tracks live beyond the life of a scene, then it’s more like #1, load them in and keep them in memory.
The second thing to consider is the sounds themselves. Do you really need stereo sounds playing at 48,000 samples per second when it probably sounds just as good on mobile devices at 11,025 samples per second and mono. (same sound comes out both speakers)? Those high sample rate stereo audio tracks eat up a boat lad of memory.
Rob