La cosa migliore (avendo accesso al server web) sarebbe quella di far "uploadare" i file al di fuori della document_root in modo da non potere accedervi direttamente tramite browser.

Se non è il tuo caso metti un file .htaccess che protegga l'accesso ai file.

A questo punto (allo stesso modo per tutte e 2 le alternative), quando vuoi dare in lettura il file all'utente usi una procedura php, che richiama la funzione readfile, e da in output l'mp3.

Facendo in questo modo puoi mettere all'interno del tuo file php tutti i controlli che vuoi, richiedere ad esempio una variabile che contenga un codice di downlaod che può valere 1 o N volte ecc ecc.

Qui sotto ti posto il codice generico che uso per dare in output un file:

codice:
  function readfileheader($nomefile) {
    
    if($nomefile) {
    
      header("Expires: Mon, 12 Jul 1976 06:20:00 GMT");
      header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

      header("Cache-Control: no-store, no-cache, must-revalidate");
      header("Cache-Control: post-check=0, pre-check=0", false);

      header("Pragma: no-cache");
    
      header('Content-type: application/octet-stream');
      header('Content-Disposition: attachment; filename="'.basename($nomefile).'"');
      readfile($nomefile);
      
    } 
    
  }
La riga in grossetto puoi migliorarla mettendo il mimetype dell'mp3.

ciao