や、音楽プレイヤーの文脈で言うならさらに Sound は再生しながらストリーミング読み込みという感じになりそうなので、波形データの部分的読み出しやデコードを担当する SoundStream みたいな型を用意することになるだろうけど。
内部的にファイルハンドルとかファイルパスのみを持つようなやつを MusicHandle とか MusicFile と命名しといて、
MusicFile::meta(&mut self) -> Music
MusicFile::sound(&mut self) -> Sound
みたいな感じの API にするかなぁ。
&mut なのは std::fs::File は読み込みでも変更されるから
ここで SoundInfo と SoundData に分けたうえで Sound を作るようなことは私はあまりしないですね……
まあコンパイル時間の最適化みたいな理由があるとまた話は変わってくるけど
そのうえで「ストレージ内で音楽を表現するバイト列やオブジェクト」を指すものを作りたいのであれば -Handle という形で「(音楽自体というよりは) ストレージ内のリソースを指している」ということを明示する意図があるので私は -Handle を多用する (そして -Info は普通のことなので省く)、という感じ
で、インターフェースというのは間接的であるものだから、「音楽」を表現するオブジェクトが内部的に何を持っていようがどうでもいい。「音楽そのもの」であるか「音楽を指す何か」であるかの区別なんてものは必要ない
たとえば音楽の波形データであればそれは音楽そのものではなく「音楽の波形」として扱うことになるだろうなと。
その波形を音楽 (を表現するオブジェクト) から弄れるようインターフェースを作ることはあるだろうけど。