Appel d'une class template dans une callback appelé par un thread
Bonjour à tous.
Je fait actuellement une classe son basée sur SDL_sound (projet d'étude)
sound_manager.hpp
Code:
1 2 3 4 5 6 7 8 9 10
| template<typename T, typename U>
class c_sound_manager : public c_singleton<c_sound_manager<T,U> >
{
friend class c_singleton<c_sound_manager<T,U> >;
public:
private:
c_sound_manager();
~c_sound_manager();
} |
main.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include "sound_manager.hpp"
enum e_sound
{
SOUND_FIRE,
SOUND_WATER
};
int main(void)
{
c_sound_manager<e_sound, int>* sound_manager = c_sound_manager<e_sound, int>::get_instance();
// l'utilisateur utilise la classe son
} |
Voici ici la callback que j'indique au thread de la SDL, où je fais le mixage de son.
sound_manager.hpp
Code:
1 2 3 4 5 6 7 8 9 10 11
| void* callback_mix_audio(void* user_data, Uint8* stream, int len)
{
// par contre ici je dois récupérer le singleton soit via le suer_data comme ça
c_sound_manager<e_sound, int>* sound_manager = static_cast<c_sound_manager<e_sound, int>* >(user_data);
// soit comme cela
c_sound_manager<e_sound, int>* sound_manager = c_sound_manager<e_sound, int>::get_instance();
// traitement du son
} |
Et donc ce qui m'ennuis, c'est qu'il faut remettre les types template à l'appel du singleton ou au cast, mais cette callback n'est pas accessible à l'utilisateur, donc il devrait disposer des sources et ensuite re-compiler la callback.
J'ai mis une solution alternative en attendant une meilleure, avec des typedefs comme cela.
main.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| enum e_sound
{
SOUND_FIRE,
SOUND_WATER
};
typedef e_sound TYPE_1
typedef int TYPE_2
#include "sound_manager.hpp"
int main(void)
{
c_sound_manager<e_sound, int>* sound_manager = c_sound_manager<e_sound, int>::get_instance();
// l'utilisateur utilise la classe son
} |
La classe son ne change pas, et ça donne ça dans la callback
sound_manager.hpp
Code:
1 2 3 4 5 6
| void* callback_mix_audio(void* user_data, Uint8* stream, int len)
{
c_sound_manager<TYPE_1, TYPE_2>* sound_manager = c_sound_manager<TYPE_1, TYPE_2>::get_instance();
// traitement du son
} |
Donc ça marche l'utilisateur n'a pas besoin des sources, juste d'une petite documentation, mais je voudrais savoir s'il existe une solution encore plus pratique.
Car la il faut quand même definir les types template au dessus des typedefs et faire l'incude en dessous, je cherche au plus pratique.
Avant cette classe son n'était pas template, à l'intérieur les deux types en question était des int mais c'est plus pratique comme ça pour nommer ses sons, au lieu d'avoir des nombres.
Voila merci d'avance.