mirror of
https://github.com/libSDL2pp/libSDL2pp.git
synced 2025-08-03 10:55:57 -04:00
Add buildin effects support
This commit is contained in:
parent
01a537218a
commit
326378c59c
@ -242,4 +242,44 @@ void Mixer::SetMusicHook(MusicHook&& hook) {
|
||||
}, current_music_hook_.get());
|
||||
}
|
||||
|
||||
void Mixer::SetPanning(int channel, int left, int right) {
|
||||
if (Mix_SetPanning(channel, left, right) == 0)
|
||||
throw Exception("Mix_SetPanning");
|
||||
}
|
||||
|
||||
void Mixer::UnsetPanning(int channel) {
|
||||
if (Mix_SetPanning(channel, 255, 255) == 0)
|
||||
throw Exception("Mix_SetPanning");
|
||||
}
|
||||
|
||||
void Mixer::SetDistance(int channel, int distance) {
|
||||
if (Mix_SetDistance(channel, distance) == 0)
|
||||
throw Exception("Mix_SetDistance");
|
||||
}
|
||||
|
||||
void Mixer::UnsetDistance(int channel) {
|
||||
if (Mix_SetDistance(channel, 0) == 0)
|
||||
throw Exception("Mix_SetDistance");
|
||||
}
|
||||
|
||||
void Mixer::SetPosition(int channel, int angle, int distance) {
|
||||
if (Mix_SetPosition(channel, angle, distance) == 0)
|
||||
throw Exception("Mix_SetPosition");
|
||||
}
|
||||
|
||||
void Mixer::UnsetPosition(int channel) {
|
||||
if (Mix_SetPosition(channel, 0, 0) == 0)
|
||||
throw Exception("Mix_SetPosition");
|
||||
}
|
||||
|
||||
void Mixer::SetReverseStereo(int channel) {
|
||||
if (Mix_SetReverseStereo(channel, 1) == 0)
|
||||
throw Exception("Mix_SetReverseStereo");
|
||||
}
|
||||
|
||||
void Mixer::UnsetReverseStereo(int channel) {
|
||||
if (Mix_SetReverseStereo(channel, 0) == 0)
|
||||
throw Exception("Mix_SetReverseStereo");
|
||||
}
|
||||
|
||||
}
|
||||
|
118
SDL2pp/Mixer.hh
118
SDL2pp/Mixer.hh
@ -652,7 +652,123 @@ public:
|
||||
////////////////////////////////////////////////////////////
|
||||
void SetMusicHook(MusicHook&& hook);
|
||||
|
||||
// TODO: Effects
|
||||
// TODO: custom effects
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Stereo panning
|
||||
///
|
||||
/// \param[in] channel Channel number to register this effect on or
|
||||
/// MIX_CHANNEL_POST to process the postmix stream
|
||||
/// \param[in] left Volume for the left channel, range is 0 (silence)
|
||||
/// to 255 (loud)
|
||||
/// \param[in] right Volume for the right channel, range is 0 (silence)
|
||||
/// to 255 (loud)
|
||||
///
|
||||
/// \throws SDL2pp::Exception
|
||||
///
|
||||
/// \see https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html#SEC80
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
void SetPanning(int channel, int left, int right);
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Disable stereo panning
|
||||
///
|
||||
/// \param[in] channel Channel number to unregister this effect from or
|
||||
/// MIX_CHANNEL_POST to unregister from the postmix stream
|
||||
///
|
||||
/// \throws SDL2pp::Exception
|
||||
///
|
||||
/// \see https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html#SEC80
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
void UnsetPanning(int channel);
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Distance attenuation (volume)
|
||||
///
|
||||
/// \param[in] channel Channel number to register this effect on or
|
||||
/// MIX_CHANNEL_POST to process the postmix stream
|
||||
/// \param[in] distance Specify the distance from the listener,
|
||||
/// from 0 (close/loud) to 255 (far/quiet)
|
||||
///
|
||||
/// \throws SDL2pp::Exception
|
||||
///
|
||||
/// \see https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html#SEC81
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
void SetDistance(int channel, int distance);
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Disable distance attenuation
|
||||
///
|
||||
/// \param[in] channel Channel number to unregister this effect from or
|
||||
/// MIX_CHANNEL_POST to unregister from the postmix stream
|
||||
///
|
||||
/// \throws SDL2pp::Exception
|
||||
///
|
||||
/// \see https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html#SEC81
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
void UnsetDistance(int channel);
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Panning (angular) and distance
|
||||
///
|
||||
/// \param[in] channel Channel number to register this effect on or
|
||||
/// MIX_CHANNEL_POST to process the postmix stream
|
||||
/// \param[in] angle Direction in relation to forward from 0 to 360 degrees.
|
||||
/// Larger angles will be reduced to this range using angles
|
||||
/// % 360. 0 = directly in front, 90 = directly to the right
|
||||
/// etc.
|
||||
/// \param[in] distance Specify the distance from the listener,
|
||||
/// from 0 (close/loud) to 255 (far/quiet)
|
||||
///
|
||||
/// \throws SDL2pp::Exception
|
||||
///
|
||||
/// \see https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html#SEC82
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
void SetPosition(int channel, int angle, int distance);
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Disable panning and distance
|
||||
///
|
||||
/// \param[in] channel Channel number to unregister this effect from or
|
||||
/// MIX_CHANNEL_POST to unregister from the postmix stream
|
||||
///
|
||||
/// \throws SDL2pp::Exception
|
||||
///
|
||||
/// \see https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html#SEC82
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
void UnsetPosition(int channel);
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Swap stereo left and right
|
||||
///
|
||||
/// \param[in] channel Channel number to register this effect on or
|
||||
/// MIX_CHANNEL_POST to process the postmix stream
|
||||
///
|
||||
/// \throws SDL2pp::Exception
|
||||
///
|
||||
/// \see https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html#SEC83
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
void SetReverseStereo(int channel);
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Disable stereo swapping
|
||||
///
|
||||
/// \param[in] channel Channel number to unregister this effect from or
|
||||
/// MIX_CHANNEL_POST to unregister from the postmix stream
|
||||
///
|
||||
/// \throws SDL2pp::Exception
|
||||
///
|
||||
/// \see https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html#SEC83
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
void UnsetReverseStereo(int channel);
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -37,4 +37,7 @@ IF(SDL2PP_WITH_MIXER)
|
||||
|
||||
ADD_EXECUTABLE(mixer_music_sine mixer_music_sine.cc)
|
||||
TARGET_LINK_LIBRARIES(mixer_music_sine SDL2pp)
|
||||
|
||||
ADD_EXECUTABLE(mixer_effects mixer_effects.cc)
|
||||
TARGET_LINK_LIBRARIES(mixer_effects SDL2pp)
|
||||
ENDIF(SDL2PP_WITH_MIXER)
|
||||
|
120
examples/mixer_effects.cc
Normal file
120
examples/mixer_effects.cc
Normal file
@ -0,0 +1,120 @@
|
||||
/*
|
||||
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||
Copyright (C) 2015 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <SDL2/SDL.h>
|
||||
#include <SDL2/SDL_mixer.h>
|
||||
|
||||
#include <SDL2pp/SDL.hh>
|
||||
#include <SDL2pp/SDLMixer.hh>
|
||||
#include <SDL2pp/Mixer.hh>
|
||||
#include <SDL2pp/Chunk.hh>
|
||||
|
||||
using namespace SDL2pp;
|
||||
|
||||
int main() try {
|
||||
SDL sdl(SDL_INIT_AUDIO);
|
||||
SDLMixer mixerlib(MIX_INIT_OGG);
|
||||
Mixer mixer(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 4096);
|
||||
|
||||
Chunk sound(TESTDATA_DIR "/test.ogg");
|
||||
|
||||
int chan;
|
||||
|
||||
// Panning
|
||||
std::cerr << "Panning: left" << std::endl;
|
||||
mixer.SetPanning(MIX_CHANNEL_POST, 255, 0);
|
||||
chan = mixer.PlayChannel(-1, sound);
|
||||
SDL_Delay(2000);
|
||||
mixer.HaltChannel(-1);
|
||||
|
||||
std::cerr << "Panning: right" << std::endl;
|
||||
mixer.SetPanning(MIX_CHANNEL_POST, 0, 255);
|
||||
chan = mixer.PlayChannel(-1, sound);
|
||||
SDL_Delay(2000);
|
||||
mixer.HaltChannel(-1);
|
||||
|
||||
mixer.UnsetPanning(MIX_CHANNEL_POST);
|
||||
|
||||
// Distance
|
||||
std::cerr << "Distance: somewhat far" << std::endl;
|
||||
mixer.SetDistance(MIX_CHANNEL_POST, 128);
|
||||
chan = mixer.PlayChannel(-1, sound);
|
||||
SDL_Delay(2000);
|
||||
mixer.HaltChannel(-1);
|
||||
|
||||
std::cerr << "Distance: further" << std::endl;
|
||||
mixer.SetDistance(MIX_CHANNEL_POST, 192);
|
||||
chan = mixer.PlayChannel(-1, sound);
|
||||
SDL_Delay(2000);
|
||||
mixer.HaltChannel(-1);
|
||||
|
||||
std::cerr << "Distance: even further" << std::endl;
|
||||
mixer.SetDistance(MIX_CHANNEL_POST, 224);
|
||||
chan = mixer.PlayChannel(-1, sound);
|
||||
SDL_Delay(2000);
|
||||
mixer.HaltChannel(-1);
|
||||
|
||||
mixer.UnsetDistance(MIX_CHANNEL_POST);
|
||||
|
||||
// Position
|
||||
std::cerr << "Position: closest left" << std::endl;
|
||||
mixer.SetPosition(MIX_CHANNEL_POST, 270, 0);
|
||||
chan = mixer.PlayChannel(-1, sound);
|
||||
SDL_Delay(2000);
|
||||
mixer.HaltChannel(-1);
|
||||
|
||||
std::cerr << "Position: somewhat far front" << std::endl;
|
||||
mixer.SetPosition(MIX_CHANNEL_POST, 0, 128);
|
||||
chan = mixer.PlayChannel(-1, sound);
|
||||
SDL_Delay(2000);
|
||||
mixer.HaltChannel(-1);
|
||||
|
||||
std::cerr << "Position: further right" << std::endl;
|
||||
mixer.SetPosition(MIX_CHANNEL_POST, 90, 192);
|
||||
chan = mixer.PlayChannel(-1, sound);
|
||||
SDL_Delay(2000);
|
||||
mixer.HaltChannel(-1);
|
||||
|
||||
std::cerr << "Position: even further back" << std::endl;
|
||||
mixer.SetPosition(MIX_CHANNEL_POST, 180, 224);
|
||||
chan = mixer.PlayChannel(-1, sound);
|
||||
SDL_Delay(2000);
|
||||
mixer.HaltChannel(-1);
|
||||
|
||||
mixer.UnsetPosition(MIX_CHANNEL_POST);
|
||||
|
||||
// Position
|
||||
std::cerr << "Reverse stereo" << std::endl;
|
||||
|
||||
mixer.SetReverseStereo(MIX_CHANNEL_POST);
|
||||
chan = mixer.PlayChannel(-1, sound);
|
||||
SDL_Delay(2000);
|
||||
mixer.HaltChannel(-1);
|
||||
|
||||
mixer.UnsetReverseStereo(MIX_CHANNEL_POST);
|
||||
|
||||
return 0;
|
||||
} catch (std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
return 1;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user