Sounderer.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "Sounderer.h"
  2. Sounderer::Sounderer() : m_lastCanal(-1), m_folder("")
  3. {}
  4. Sounderer::Sounderer(std::string folder) : m_lastCanal(-1), m_folder(folder)
  5. {}
  6. Sounderer::~Sounderer()
  7. {
  8. for( m_it = m_paquet.begin(); m_it != m_paquet.end(); m_it++ )
  9. if (m_it->second != 0x0)
  10. {
  11. //Libération mémoire
  12. Mix_FreeChunk(m_it->second);
  13. m_it->second = 0x0;
  14. }
  15. Mix_Quit();
  16. }
  17. bool Sounderer::init()
  18. {
  19. ///SDL extend init
  20. SDL_InitSubSystem(SDL_INIT_AUDIO);
  21. Mix_Init(MIX_INIT_MOD | MIX_INIT_OGG);
  22. ///Implémentation des paramètres
  23. m_rate = 22050;
  24. m_format = AUDIO_S16SYS;
  25. m_nbChannels = 2;
  26. m_bufferSize = 4096;
  27. ///Démarrage du mixer avec les paramètres désirés
  28. if ( Mix_OpenAudio(m_rate, m_format, m_nbChannels, m_bufferSize) != 0 ) {
  29. std::cout <<"Impossible d'initialiser le système audio SDL_mixer avec les paramètres définis : "<<Mix_GetError()<< std::endl;
  30. return false;
  31. }
  32. ///Initialisation terminée
  33. return true;
  34. }
  35. bool Sounderer::preLoad(std::string nom, short extension)
  36. {
  37. /// Cherche le son dans le tableau
  38. m_it = m_paquet.find(nom);
  39. /// Si le son est déjà chargé, pas beson de le refaire
  40. if (m_it != m_paquet.end())
  41. {
  42. if (m_paquet[nom] == 0x0) return false;
  43. else return true;
  44. }
  45. /// Sinon on le charge
  46. else
  47. {
  48. //Définit l'extension
  49. std::string ext;
  50. if (extension == EXT_OGG) ext = ".ogg";
  51. else ext = ".wav";
  52. //Compose le source puis le charge
  53. std::string source(m_folder + nom + ext);
  54. m_paquet[nom] = Mix_LoadWAV(source.c_str());
  55. //Teste une erreur
  56. if (m_paquet[nom] == 0x0)
  57. {
  58. std::cout << "Le son " <<nom<< ".wav n'a pas pu être chargé : " << Mix_GetError() << std::endl << std::endl;
  59. return false;
  60. }
  61. //Attribut canal libre et réservé
  62. m_lastCanal++;
  63. m_channel[nom] = m_lastCanal;
  64. }
  65. // Fonction terminée
  66. return true;
  67. }
  68. bool Sounderer::play(std::string nom, int repetition)
  69. {
  70. //Capture le canal et joue le son
  71. if (preLoad(nom))
  72. m_channel[nom] = Mix_PlayChannel(m_channel[nom], m_paquet[nom], repetition);
  73. else return false;
  74. if(m_channel[nom] == -1) {
  75. std::cout <<"Impossible de jouer le son ''"<<nom<<"'' : "<<Mix_GetError()<< std::endl;
  76. return false;
  77. }
  78. //Fin
  79. return true;
  80. }
  81. bool Sounderer::fadePlay(std::string nom, int crescendoLenght, int repetition)
  82. {
  83. //Capture le canal et joue le son
  84. if (preLoad(nom))
  85. m_channel[nom] = Mix_FadeInChannel(m_channel[nom], m_paquet[nom], repetition, crescendoLenght);
  86. else return false;
  87. if(m_channel[nom] == -1) {
  88. std::cout <<"Impossible de jouer le son ''"<<nom<<"'' : "<<Mix_GetError()<< std::endl;
  89. return false;
  90. }
  91. //Fin
  92. return true;
  93. }
  94. bool Sounderer::stop(std::string nom)
  95. {
  96. if ( m_paquet.find(nom) != m_paquet.end() )
  97. if ( Mix_Playing(m_channel[nom]) )
  98. {
  99. Mix_HaltChannel(m_channel[nom]);
  100. return true;
  101. }
  102. return false;
  103. }
  104. void Sounderer::stopAll()
  105. {
  106. Mix_HaltChannel(-1);
  107. }
  108. void Sounderer::assignFolder(std::string folder)
  109. {
  110. m_folder = folder;
  111. }