/* SoLoud audio engine Copyright (c) 2013-2020 Jari Komppa This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef SOLOUD_BUS_H #define SOLOUD_BUS_H #include "soloud.h" namespace SoLoud { class Bus; class BusInstance : public AudioSourceInstance { Bus *mParent; unsigned int mScratchSize; AlignedFloatBuffer mScratch; public: // Approximate volume for channels. float mVisualizationChannelVolume[MAX_CHANNELS]; // Mono-mixed wave data for visualization and for visualization FFT input float mVisualizationWaveData[256]; BusInstance(Bus *aParent); virtual unsigned int getAudio(float *aBuffer, unsigned int aSamplesToRead, unsigned int aBufferSize); virtual bool hasEnded(); virtual ~BusInstance(); }; class Bus : public AudioSource { public: Bus(); virtual BusInstance *createInstance(); // Set filter. Set to NULL to clear the filter. virtual void setFilter(unsigned int aFilterId, Filter *aFilter); // Play sound through the bus handle play(AudioSource &aSound, float aVolume = 1.0f, float aPan = 0.0f, bool aPaused = 0); // Play sound through the bus, delayed in relation to other sounds called via this function. handle playClocked(time aSoundTime, AudioSource &aSound, float aVolume = 1.0f, float aPan = 0.0f); // Start playing a 3d audio source through the bus handle play3d(AudioSource &aSound, float aPosX, float aPosY, float aPosZ, float aVelX = 0.0f, float aVelY = 0.0f, float aVelZ = 0.0f, float aVolume = 1.0f, bool aPaused = 0); // Start playing a 3d audio source through the bus, delayed in relation to other sounds called via this function. handle play3dClocked(time aSoundTime, AudioSource &aSound, float aPosX, float aPosY, float aPosZ, float aVelX = 0.0f, float aVelY = 0.0f, float aVelZ = 0.0f, float aVolume = 1.0f); // Set number of channels for the bus (default 2) result setChannels(unsigned int aChannels); // Enable or disable visualization data gathering void setVisualizationEnable(bool aEnable); // Move a live sound to this bus void annexSound(handle aVoiceHandle); // Calculate and get 256 floats of FFT data for visualization. Visualization has to be enabled before use. float *calcFFT(); // Get 256 floats of wave data for visualization. Visualization has to be enabled before use. float *getWave(); // Get approximate volume for output channel for visualization. Visualization has to be enabled before use. float getApproximateVolume(unsigned int aChannel); // Get number of immediate child voices to this bus unsigned int getActiveVoiceCount(); public: BusInstance *mInstance; unsigned int mChannelHandle; // FFT output data float mFFTData[256]; // Snapshot of wave data for visualization float mWaveData[256]; // Internal: find the bus' channel void findBusHandle(); }; }; #endif