Salut.
Je suis entrain de faire un petit wrapper d'OpenAL en c#, et je fait face à un problème existentiel.
Devrais je utiliser le pattern Singleton ou pas?
J'expose la situation et la fonction de mes classes:
D'abord, j'ai une classe AudioSytem, qui est un singleton qui a en charge d'initialiser le device, de faire des captures audio, de vérifier quelles sont les extensions supportés par ma carte son, etc...
Aucun problème de ce coté la.
Ensuite j'ai une classe SourceManager qui est un singleton (et c'est là que ça m'embête ) qui me permet de créer des Sources sonores.
Les sources sonores peuvent référer un pointeur vers un même Buffer contenant les donnés à jouées, useful pour ne pas surcharger la mémoire en utilisant le même pointeur pour un son unique.
De plus, j'ai une classe Listener qui est un Singleton (la aussi ça me tracasse) qui représente le listener d'OpenAL (il est unique, dans l'api OpenAL).
Enfin, j'ai une classe BufferManager qui est un singleton qui me permet de créer des Buffers de son, utilisé par les Sources.
Aucun problème de ce coté ci.
Voila comment ça s'utilise:
Note les Instances des classes Listener et SourceManager doivent être unique, mais ne serait il pas "mieux" de "demander" leur référence à travers l'instance AudioSystem plutôt qu'avec le singleton.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 public void Initialise() { AudioSytem.Instance.Initialize();// une surcharge permet de prendre en parametre le nom d'un device. Buffer buffer=BufferManager.Instance.Load("Roxanne.ogg"); //le premier argument est le nom donné la source qui doit être crée Source source=SourceManager.Instance.CreateSource("toto",buffer); source.Play(); source.Position=new Vector(0,0,10); Listener.Instance.Position=new Vector(0,10,50); } [...] private SourceManager _sourceMgr; private Listener _listener; public void Loop() { //dans la boucle principale AudioSytem.Instance.Update(); }
Donc j'hésite avec ça:
J'espère avoir été suffisamment clair, merci d'avance pour toutes les suggestions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 SourceManager _sourceMgr; Listener _listener. public void Initialize() { AudioSystem.Instance.Initialize(); _sourceMgr=AudioSystem.Instance.SourceManager;//=getSourceManager() en cpp _listener=AudioSystem.Instance.Listener;//=getListener() //charge un bonne musique Buffer buffer=BufferManager.Instance.Load("Roxanne.ogg"); Source source=_sourceMgr.CreateSource("toto",buffer); source.Play(); source.Position=new Vector(0,0,10); } //dans la boocle principale public void Loop() { AudioSytem.Instance.Update(); }
Partager