2015-01-21 3 views
1

Я пытаюсь воспроизвести звуковой файл в SFML, но он не воспроизводится. Это звук (предупреждение: громкий громкость): http://freesound.org/people/thanvannispen/sounds/9550/. Я использовал онлайн-конвертер, чтобы преобразовать его в wav (http://audio.online-convert.com/convert-to-wav), но звук отлично воспроизводится в окнах, так что это не должно быть проблемой.SFML Звук не играет

SoundManager.h

#pragma once 

#include <SFML\Audio.hpp> 
#include <map> 

class SoundManager 
{ 
public: 
    SoundManager(); 
    ~SoundManager(); 

    static bool load(); 

    static std::map<std::string, sf::Sound> sound; 
}; 

SoundManager.cpp

#include "SoundManager.h" 
#include <SFML\Audio.hpp> 
#include <map> 

std::map<std::string, sf::Sound> SoundManager::sound = std::map<std::string, sf::Sound>(); 

SoundManager::SoundManager() 
{ 
} 

SoundManager::~SoundManager() 
{ 
} 

bool SoundManager::load() { 
    sf::SoundBuffer laughterBuffer; 
    if (!laughterBuffer.loadFromFile("data/sound/laughter.wav")) { 
     return false; 
    } 
    sf::Sound laughter; 
    laughter.setBuffer(laughterBuffer); 
    SoundManager::sound["laughter"] = laughter; 
} 

Здесь я загружаю звук:

Logger::print("Loading sound..."); 
if (!SoundManager::load()) { 
    Logger::error("Failed to load sound! Exiting..."); 
    exit(); 
} 
Logger::print("Sound loaded."); 

И я играю, как это только перед входом в цикл игры (Я пробовал называть его из нескольких мест, никто не работает)

SoundManager::sound["laughter"].play(); 

Когда я впервые попытался импортировать SFML \ Audio.hpp, он дал мне ошибку в том, что не нашел libsndfile-1.dll, поэтому я копирую/вставляю его в папку и теперь это работает, но я не уверен почему это произошло, так как я связываю статически. Может ли это иметь какое-то отношение к тому, как я связываюсь с SFML?

sfml-main.lib 
sfml-network-s.lib 
ws2_32.lib 
sfml-audio-s.lib 
sndfile.lib 
openal32.lib 
sfml-window-s.lib 
sfml-system-s.lib 
opengl32.lib 
gdi32.lib 
winmm.lib 
sfml-graphics-s.lib 
glew.lib 
freetype.lib 
jpeg.lib 

ответ

1

От SFML документации о sf::Sound::setBuffer():

Важно отметить, что звуковой буфер не копируется, таким образом, экземпляр SF :: SoundBuffer должен остаться в живых до тех пор, пока он подключен к звук.

, который не относится к laughterBuffer.

Предлагаю взглянуть на Thor resources или sftools resources.

0

Не только sf :: SoundBuffer, но и sf :: Звук также необходим для жизни.

Вы можете установить их как переменную класса или глобальную переменную (но не переменную в функции, потому что она будет убита после выполнения).

Например:

.h файл

#pragma once 
#include <SFML/Audio.hpp> 
class SoundManager 
{ 
private: 
    sf::SoundBuffer missile_launch_buff; 
    sf::Sound fire_sound; 
public: 
    SoundManager(); 
    void playMissileLaunch(); 

}; 

.cpp файл

#include "SoundManager.h" 
#include <iostream> 
using namespace std; 


SoundManager::SoundManager() 
{ 

    missile_launch_buff.loadFromFile("sound/missile_launch.wav"); 

} 

void SoundManager::playMissileLaunch() 
{ 

    fire_sound.setBuffer(missile_launch_buff); 
    fire_sound.play(); 
    cout << "Missile launch sound \n"; 
}