1 /******************************************************************************* 2 * Copyright 2015-2016 Juan Francisco Crespo Galán 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 ******************************************************************************/ 16 17 #pragma once 18 19 /** 20 * @file SoundList.h 21 * @ingroup fx 22 * The SoundList class. 23 */ 24 25 #include "ISound.h" 26 27 #include <vector> 28 #include <memory> 29 #include <mutex> 30 31 AUD_NAMESPACE_BEGIN 32 33 /** 34 * This class allows to have a list of sound that will play sequentially or randomly with each playback. 35 */ 36 class AUD_API SoundList : public ISound 37 { 38 private: 39 /** 40 * The list of sounds that will play. 41 */ 42 std::vector<std::shared_ptr<ISound>> m_list; 43 44 /** 45 * Flag for random playback 46 */ 47 bool m_random = false; 48 49 /** 50 * Current sound index. -1 if no reader has been created. 51 */ 52 int m_index = -1; 53 54 /** 55 * Mutex to prevent multithreading crashes. 56 */ 57 std::recursive_mutex m_mutex; 58 59 // delete copy constructor and operator= 60 SoundList(const SoundList&) = delete; 61 SoundList& operator=(const SoundList&) = delete; 62 63 public: 64 /** 65 * Creates a new, empty sound list. 66 * Sounds must be added to the list using the addSound() method. 67 * \param random False if the sounds int he list must be played sequentially. True if random. 68 */ 69 SoundList(bool random = false); 70 71 /** 72 * Creates a new sound list and initializes it. 73 * \param list A vector with sounds to initialize the list. 74 * \param random False if the sounds int he list must be played sequentially. True if random. 75 */ 76 SoundList(std::vector<std::shared_ptr<ISound>>& list, bool random = false); 77 78 virtual std::shared_ptr<IReader> createReader(); 79 80 /** 81 * Adds a sound to the list. 82 * The added sounds can be played sequentially or randomly dependig 83 * on the m_random flag 84 * \param sound A shared_ptr to the sound. 85 */ 86 void addSound(std::shared_ptr<ISound> sound); 87 88 /** 89 * Sets the playback mode of the sound list. 90 * There are two posible modes, random and sequential. 91 * \param random True to activate the random mode, false to activate sequential mode. 92 */ 93 void setRandomMode(bool random); 94 95 /** 96 * Returns the playback mode of the sound list. 97 * The two posible modes are random and sequential. 98 * \return True if the random mode is activated, false otherwise. 99 */ 100 bool getRandomMode(); 101 102 /** 103 * Returns the amount of sounds in the list. 104 * \return The amount of sounds in the list. 105 */ 106 int getSize(); 107 108 }; 109 110 AUD_NAMESPACE_END 111