Browse Source

Import source code from simple sound project

DricomDragon 4 years ago
parent
commit
7dad229c43
3 changed files with 321 additions and 0 deletions
  1. 135 0
      sdl1/soundSimple/Sounderer.cpp
  2. 47 0
      sdl1/soundSimple/Sounderer.h
  3. 139 0
      sdl1/soundSimple/main.cpp

+ 135 - 0
sdl1/soundSimple/Sounderer.cpp

@@ -0,0 +1,135 @@
+#include "Sounderer.h"
+
+Sounderer::Sounderer() : m_lastCanal(-1), m_folder("")
+{}
+
+Sounderer::Sounderer(std::string folder) : m_lastCanal(-1), m_folder(folder)
+{}
+
+Sounderer::~Sounderer()
+{
+    for( m_it = m_paquet.begin(); m_it != m_paquet.end(); m_it++ )
+        if (m_it->second != 0x0)
+        {
+            //Libération mémoire
+            Mix_FreeChunk(m_it->second);
+            m_it->second = 0x0;
+        }
+    Mix_Quit();
+}
+
+bool Sounderer::init()
+{
+    ///SDL extend init
+    SDL_InitSubSystem(SDL_INIT_AUDIO);
+    Mix_Init(MIX_INIT_MOD | MIX_INIT_OGG);
+
+    ///Implémentation des paramètres
+    m_rate = 22050;
+	m_format = AUDIO_S16SYS;
+	m_nbChannels = 2;
+	m_bufferSize = 4096;
+
+	///Démarrage du mixer avec les paramètres désirés
+	if ( Mix_OpenAudio(m_rate, m_format, m_nbChannels, m_bufferSize) != 0 ) {
+		std::cout <<"Impossible d'initialiser le système audio SDL_mixer avec les paramètres définis : "<<Mix_GetError()<< std::endl;
+		return false;
+	}
+
+	///Initialisation terminée
+    return true;
+}
+
+bool Sounderer::preLoad(std::string nom, short extension)
+{
+	/// Cherche le son dans le tableau
+    m_it = m_paquet.find(nom);
+
+    /// Si le son est déjà chargé, pas beson de le refaire
+    if (m_it != m_paquet.end())
+    {
+        if (m_paquet[nom] == 0x0) return false;
+        else return true;
+    }
+
+    /// Sinon on le charge
+    else
+    {
+        //Définit l'extension
+        std::string ext;
+        if (extension == EXT_OGG) ext = ".ogg";
+        else ext = ".wav";
+
+        //Compose le source puis le charge
+        std::string source(m_folder + nom + ext);
+        m_paquet[nom] = Mix_LoadWAV(source.c_str());
+
+        //Teste une erreur
+        if (m_paquet[nom] == 0x0)
+        {
+            std::cout << "Le son " <<nom<< ".wav n'a pas pu être chargé : " << Mix_GetError() << std::endl << std::endl;
+            return false;
+        }
+
+        //Attribut canal libre et réservé
+        m_lastCanal++;
+        m_channel[nom] = m_lastCanal;
+    }
+
+    // Fonction terminée
+    return true;
+}
+
+bool Sounderer::play(std::string nom, int repetition)
+{
+    //Capture le canal et joue le son
+    if (preLoad(nom))
+        m_channel[nom] = Mix_PlayChannel(m_channel[nom], m_paquet[nom], repetition);
+    else return false;
+
+	if(m_channel[nom] == -1) {
+		std::cout <<"Impossible de jouer le son ''"<<nom<<"'' : "<<Mix_GetError()<< std::endl;
+		return false;
+	}
+
+	//Fin
+	return true;
+}
+
+bool Sounderer::fadePlay(std::string nom, int crescendoLenght, int repetition)
+{
+    //Capture le canal et joue le son
+    if (preLoad(nom))
+        m_channel[nom] = Mix_FadeInChannel(m_channel[nom], m_paquet[nom], repetition, crescendoLenght);
+    else return false;
+
+	if(m_channel[nom] == -1) {
+		std::cout <<"Impossible de jouer le son ''"<<nom<<"'' : "<<Mix_GetError()<< std::endl;
+		return false;
+	}
+
+	//Fin
+	return true;
+}
+
+bool Sounderer::stop(std::string nom)
+{
+    if ( m_paquet.find(nom) != m_paquet.end() )
+        if ( Mix_Playing(m_channel[nom]) )
+        {
+            Mix_HaltChannel(m_channel[nom]);
+            return true;
+        }
+    return false;
+}
+
+void Sounderer::stopAll()
+{
+    Mix_HaltChannel(-1);
+}
+
+void Sounderer::assignFolder(std::string folder)
+{
+    m_folder = folder;
+}
+

+ 47 - 0
sdl1/soundSimple/Sounderer.h

@@ -0,0 +1,47 @@
+#ifndef SOUNDERER_H_INCLUDED
+#define SOUNDERER_H_INCLUDED
+
+#include <iostream>
+#include <string>
+#include <map>
+#include <SDL.h>
+#include <SDL_mixer.h>
+
+#define EXT_WAV 0
+#define EXT_OGG 1
+#define INFINITY_LOOP -1
+
+class Sounderer
+{
+public:
+
+    Sounderer();
+    Sounderer(std::string folder);
+    ~Sounderer();
+
+    bool init();// à appeler avant utilisation
+
+    bool preLoad(std::string nom, short extension = EXT_WAV);// Précharge le son pour accélerer sa premièrer lecture [!] Dossier et extension auto
+    bool play(std::string nom, int repetition = 0);// Joue le son choisi, le charge automatiquement si pas encore chargé
+    bool fadePlay(std::string nom, int crescendoLenght, int repetition = 0);// Démarre le son par un crescendo d'une longueur voulue
+    bool stop(std::string nom);// Stoppe le son choisi
+    void stopAll();
+    void assignFolder(std::string folder);// Situe le dossier où sont contenus les sons
+
+private:
+
+    int m_lastCanal;
+    std::string m_folder;
+
+	std::map<std::string, int> m_channel;//Channel on which our sound is played
+    std::map<std::string, Mix_Chunk*>::iterator m_it;
+    std::map<std::string, Mix_Chunk*> m_paquet;
+
+	int m_rate;// = 22050 : Frequency of audio playback
+	Uint16 m_format;// = AUDIO_S16SYS : Format of the audio we're playing
+	int m_nbChannels;// = 2 : 2 channels = stereo
+	int m_bufferSize;// = 4096 : Size of the audio buffers in memory
+
+};
+
+#endif // SOUNDERER_H_INCLUDED

+ 139 - 0
sdl1/soundSimple/main.cpp

@@ -0,0 +1,139 @@
+#include <iostream>
+#include <SDL.h>
+
+#include "Sounderer.h"
+
+int main ( int argc, char** argv )
+{
+    /// [1] Démarrage
+    // [1.1] Démarrages SDL
+    if ( SDL_Init( SDL_INIT_VIDEO ) < 0)
+    {
+        std::cout << "Impossible d'initialiser la SDL: " << SDL_GetError() << std::endl;
+        return 1;
+    }
+
+    // [1.2] Préparation de fermeture
+    atexit(SDL_Quit);
+    bool done = false;
+
+    // [1.3] Para-fenêtre
+    SDL_WM_SetCaption("Tests du son", 0);
+
+    /// [2] Préparation des composants
+    // [2.1] Préparation de la fenêtre
+    SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32,
+                                           SDL_HWSURFACE|SDL_DOUBLEBUF);
+    if ( !screen )
+    {
+        std::cout << "Impossible de crée la fenêtre : " << SDL_GetError() << std::endl;
+        return 1;
+    }
+
+    // [2.2] Préparation du son
+    Sounderer soundPlayer("Sons/");
+    if (soundPlayer.init() == false) done = true;
+    else
+    {
+        soundPlayer.preLoad("growl1", EXT_OGG);
+        soundPlayer.preLoad("breathe1", EXT_OGG);
+        soundPlayer.preLoad("fire", EXT_OGG);
+        soundPlayer.preLoad("metal1", EXT_OGG);
+    }
+
+    // [2.3] Mesures de performance
+    /*Uint32 tempsDepart, difference, moyenne, nbTests(100000);
+    tempsDepart = SDL_GetTicks();
+    for (unsigned int i(0); i<nbTests; i++)
+    {
+        //quelque chose à mesurer
+    }
+    difference = SDL_GetTicks() - tempsDepart;
+    moyenne = difference / nbTests;
+    std::cout << "L'appel de play() a duré " <<difference<<" / "<<nbTests<<" soit "<<moyenne<<"ms en moyenne."<<std::endl;*/
+
+    /// [3] Boucle principale
+    while (!done)
+    {
+        // [3.1] Gestion évènements
+        SDL_Event event;
+        while (SDL_PollEvent(&event))
+        {
+            switch (event.type)
+            {
+            case SDL_QUIT:
+                done = true;
+                break;
+            case SDL_KEYDOWN:
+                switch (event.key.keysym.sym)
+                {
+                case SDLK_ESCAPE:
+                    done = true;
+                    break;
+                case SDLK_b:
+                    soundPlayer.play("breathe1");
+                    break;
+                case SDLK_e:
+                    soundPlayer.fadePlay("effect", 3692, INFINITY_LOOP);
+                    break;
+                case SDLK_f:
+                    soundPlayer.play("fire");
+                    break;
+                case SDLK_g:
+                    soundPlayer.play("growl1");
+                    break;
+                case SDLK_h:
+                    soundPlayer.play("hou", 2);
+                    break;
+                default:
+                    soundPlayer.play("metal1", INFINITY_LOOP);
+                    break;
+                }
+                break;
+            case SDL_KEYUP:
+                switch (event.key.keysym.sym)
+                {
+                case SDLK_ESCAPE:
+                    done = true;
+                    break;
+                case SDLK_b:
+                    soundPlayer.stop("breathe1");
+                    break;
+                case SDLK_e:
+                    soundPlayer.stop("effect");
+                    break;
+                case SDLK_f:
+                    soundPlayer.stop("fire");
+                    break;
+                case SDLK_g:
+                    soundPlayer.stop("growl1");
+                    break;
+                case SDLK_h:
+                    soundPlayer.stop("hou");
+                    break;
+                default:
+                    soundPlayer.stop("metal1");
+                    break;
+                }
+                break;
+            } // end switch event type
+        } // end of message processing
+
+        // [3.2] Calculs
+
+
+        // [3.3] Dessin des composants
+        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 150, 55, 12));
+
+        //
+
+        SDL_Flip(screen);
+    } //fin bcl principale
+
+    ///[4] Destruction des composants
+    SDL_FreeSurface(screen);
+
+
+    std::cout << "Aucune erreur détectée." << std::endl;
+    return 0;
+}