Perso j'avais rien trouvé de mieux que de faire un nouveau sf::SoundBuffer et puis un sf::Sound::setBuffer avec.
Au départ je pensais qu'en chargeant les nouveaux samples dans le même SoundBuffer j'entendrais le nouveau son, mais non. Si je veux utiliser le même SoundBuffer il fallait que je fasse un buffer = sf::SoundBuffer(); (pourquoi
) avant de load les nouveaux samples (et de refaire un setBuffer ? je ne sais plus) et de relancer le son sinon il ne se passait rien.
Bon ensuite j'avais pas cherché plus que ça quoi, et j'y connaissais pas grand chose. Ça a l'air chelou tout ça, je ne sais pas quelle est la vraie bonne méthode.
Voilà mon code de départ de l'époque:
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
int main()
{
sf::RenderWindow win(sf::VideoMode(400, 300), "", sf::Style::Default);
const unsigned int samples = 44100 * 0.5;
const unsigned int sampleRate = 44100;
sf::Int16 raw[samples];
sf::SoundBuffer buffer[2];
sf::Sound sound;
int currentBuffer = 0;
unsigned int AMPLITUDE = 28000;
const double TWO_PI = 6.28318;
double frequency = 440;
double increment = frequency / sampleRate;
double pos = 0;
for (unsigned int i = 0; i < samples; ++i) {
raw[i] = AMPLITUDE * sin(pos * TWO_PI);
pos += increment;
}
if (!buffer[currentBuffer].loadFromSamples(raw, samples, 1, sampleRate)) {
return 1;
}
sound.setBuffer(buffer[currentBuffer]);
sound.setLoop(true);
sound.play();
bool newFrequency = false;
while (win.isOpen()) {
newFrequency = false;
sf::Event event;
while (win.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
win.close();
}
if (event.type == sf::Event::KeyReleased) {
if (event.key.code == sf::Keyboard::Escape) {
win.close();
}
if (event.key.code == sf::Keyboard::Left || event.key.code == sf::Keyboard::H) {
newFrequency = true;
frequency -= 25;
}
if (event.key.code == sf::Keyboard::Right || event.key.code == sf::Keyboard::J) {
newFrequency = true;
frequency += 25;
}
}
}
if (newFrequency) {
currentBuffer = (currentBuffer + 1) % 2;
increment = frequency / sampleRate;
pos = 0;
for (unsigned int i = 0; i < samples; ++i) {
raw[i] = AMPLITUDE * sin(pos * TWO_PI);
pos += increment;
}
if (!buffer[currentBuffer].loadFromSamples(raw, samples, 1, sampleRate)) {
return 1;
}
sound.setBuffer(buffer[currentBuffer]);
sound.play();
}
win.clear();
win.display();
}
return 0;
}