Bonjour à tous,

Je suis en train de me servir de fmod pour faire un petit SoundManager basic.
Tout se passe à peu près bien, sauf une erreur que je ne m'explique pas :

A chaque frame, je regarde si un des caneaux de sons qui jouait n'aurait pas arrêter de le faire ( synonyme d'un mp3 dont la lecture serait terminée par exemple) , pour ensuite garder en mémoire le fait que tel canau est libre.

Le problème est qu'il me renvoie une erreur lors de la vérification de si un canau est en train de jouer :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
m_result = (it->second)->isPlaying(&IsPlaying);
err_check(m_result);
Il m'affiche

fmod error 11 - The specified channel has been reused to play another sound
Sachant, que je charge un fichier son, et que je test de le jouer deux fois.
Un affichage de mes canaux utilisés donne "0 et 1", donc rien d'anormal, il ne s'agit pas du même.


Je me demande si ce n'est pas un message d'erreur "normal", étant donné que dans la doc un des exemples comporte ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
                result = channel->isPlaying(&playing);
                if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
                {
                    ERRCHECK(result);
                }
Ils semblent n'affichent les erreurs que si la canneau ne joue pas, n'est pas "volé" ( ce qui correspond à mon msg d'erreur) et n'a pas de handle invalide.

Bref, je suis un peu perlexe quand à la signification de mon message d'erreur.

EDIT : petit complément d'information car c'est surement lié :
Si je charge deux son différents, je n'ai pas pu de message d'erreur, et si je charge un son, que je "play" deux fois, il semble que le second son chargé, empeche le premier de jouer totalement (ma variable IsPlaying se retrouve a false pour le premier son, dès que le second commence à jouer ).

Ma fonction de lecture est faites de la sorte :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
unsigned int SoundManager::PlaySound(std::string SoundName)
{
	m_Ids[m_MAX_ID] = SoundName ;
 
	FMOD::Channel * c = 0;
	m_result = m_system->playSound(FMOD_CHANNEL_FREE, m_Sounds[SoundName], false, &c);
	err_check(m_result);
	m_Channels[m_MAX_ID] = c;
 
	m_Numbers[SoundName]++ ;
 
	return m_MAX_ID++ ;
}
Celle de chargement est comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
void SoundManager::LoadSound(std::string SoundName, std::string SoundPath)
{
	if ( m_Numbers.find(SoundName) == m_Numbers.end() )
	{
		FMOD::Sound * s ;
		m_result = m_system->createStream(SoundPath.c_str(), FMOD_HARDWARE | FMOD_LOOP_OFF | FMOD_2D, 0, &s); 
		err_check(m_result);
		m_Sounds[SoundName] = s ;
	}
}
je fais finir par poster la classe entière à force de bouts m'enfin...

Problème résolu : CreateStream au lieu de CreateSound :/