在 C++/Linux 中使用 SDL_Mixer 时没有声音
No sound when using SDL_Mixer in C++/Linux
我试图在 Linux 下的 C++ 中使用 SDL_mixer 来异步播放声音,但不知何故不起作用。当我执行它时,根本没有声音在播放。不过,我对 SDL 和 类 不太熟悉,所以如果有人能检测到我的代码中的错误所在,那将非常有帮助。
我的头文件(sample.h):
#pragma once
#include <string>
#include <memory>
#include "SDL_mixer.h"
class sample {
public:
sample(const std::string &path, int volume);
void play();
void play(int times);
void set_volume(int volume);
private:
std::unique_ptr<Mix_Chunk, void (*)(Mix_Chunk *)> chunk;
};
我的主程序(.cpp):
#include "sample.h"
#include <iostream>
sample::sample(const std::string &path, int volume) : chunk(Mix_LoadWAV(path.c_str()), Mix_FreeChunk) {
if (!chunk.get()) {
std::cout << "Could not load audio sample: " << path << std::endl;
}
Mix_VolumeChunk(chunk.get(), volume);
}
void sample::play() {
Mix_PlayChannel(-1, chunk.get(), 0);
}
void sample::play(int times) {
Mix_PlayChannel(-1, chunk.get(), times - 1);
}
void sample::set_volume(int volume) {
Mix_VolumeChunk(chunk.get(), volume);
}
int main() {
if (Mix_Init(MIX_INIT_FLAC | MIX_INIT_MP3 | MIX_INIT_OGG) < 0) {
return -1;
}
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) < 0) {
std::cout << "Can not initialize mixer!" << std::endl;
return -1;
}
// Amount of channels (Max amount of sounds playing at the same time)
Mix_AllocateChannels(32);
sample s("Snare-Drum-1.wav", MIX_MAX_VOLUME / 2);
s.play();
Mix_Quit();
return 0;
}
你的二进制文件运行并完成,然后再胡扯足够长的时间来渲染音频,所以解决方案是让代码保持 运行 更长的时间......我通过添加这个
让你的代码工作
s.play();
std::chrono::milliseconds timespan(2000); // or whatever
std::this_thread::sleep_for(timespan);
在你的header中替换
#include "SDL_mixer.h"
与
#include <SDL2/SDL_mixer.h>
#include <chrono>
#include <thread>
所以现在它是使用 SDL2 而不是 SDL 编译的
g++ -o sample sample.cpp -lSDL2 -lSDL2_mixer
那么....真正的 SDL2 解决方案是什么?好吧,我会说一个典型的用例是 SDL2 是游戏的一部分,它仍然是 运行 因此代码库有一个事件循环,它保持活跃足够长的时间来听到音频被渲染。除了显式使用睡眠或 gui 之外的另一种解决方案是将代码放入服务器中......SDL2 api 本身也必须有它们的 one-liner
我试图在 Linux 下的 C++ 中使用 SDL_mixer 来异步播放声音,但不知何故不起作用。当我执行它时,根本没有声音在播放。不过,我对 SDL 和 类 不太熟悉,所以如果有人能检测到我的代码中的错误所在,那将非常有帮助。
我的头文件(sample.h):
#pragma once
#include <string>
#include <memory>
#include "SDL_mixer.h"
class sample {
public:
sample(const std::string &path, int volume);
void play();
void play(int times);
void set_volume(int volume);
private:
std::unique_ptr<Mix_Chunk, void (*)(Mix_Chunk *)> chunk;
};
我的主程序(.cpp):
#include "sample.h"
#include <iostream>
sample::sample(const std::string &path, int volume) : chunk(Mix_LoadWAV(path.c_str()), Mix_FreeChunk) {
if (!chunk.get()) {
std::cout << "Could not load audio sample: " << path << std::endl;
}
Mix_VolumeChunk(chunk.get(), volume);
}
void sample::play() {
Mix_PlayChannel(-1, chunk.get(), 0);
}
void sample::play(int times) {
Mix_PlayChannel(-1, chunk.get(), times - 1);
}
void sample::set_volume(int volume) {
Mix_VolumeChunk(chunk.get(), volume);
}
int main() {
if (Mix_Init(MIX_INIT_FLAC | MIX_INIT_MP3 | MIX_INIT_OGG) < 0) {
return -1;
}
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) < 0) {
std::cout << "Can not initialize mixer!" << std::endl;
return -1;
}
// Amount of channels (Max amount of sounds playing at the same time)
Mix_AllocateChannels(32);
sample s("Snare-Drum-1.wav", MIX_MAX_VOLUME / 2);
s.play();
Mix_Quit();
return 0;
}
你的二进制文件运行并完成,然后再胡扯足够长的时间来渲染音频,所以解决方案是让代码保持 运行 更长的时间......我通过添加这个
让你的代码工作s.play();
std::chrono::milliseconds timespan(2000); // or whatever
std::this_thread::sleep_for(timespan);
在你的header中替换
#include "SDL_mixer.h"
与
#include <SDL2/SDL_mixer.h>
#include <chrono>
#include <thread>
所以现在它是使用 SDL2 而不是 SDL 编译的
g++ -o sample sample.cpp -lSDL2 -lSDL2_mixer
那么....真正的 SDL2 解决方案是什么?好吧,我会说一个典型的用例是 SDL2 是游戏的一部分,它仍然是 运行 因此代码库有一个事件循环,它保持活跃足够长的时间来听到音频被渲染。除了显式使用睡眠或 gui 之外的另一种解决方案是将代码放入服务器中......SDL2 api 本身也必须有它们的 one-liner