在 C++/Linux 中使用 SDL_Mixer 时没有声音

Posted

技术标签:

【中文标题】在 C++/Linux 中使用 SDL_Mixer 时没有声音【英文标题】:No sound when using SDL_Mixer in C++/Linux 【发布时间】:2020-04-19 13:43:47 【问题描述】:

我正在尝试在 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;

【问题讨论】:

【参考方案1】:

您的二进制文件在足够长的时间以呈现音频之前运行并完成,因此解决方案是使代码保持运行更长时间......我通过添加此代码让您的代码正常工作

s.play();

std::chrono::milliseconds timespan(2000); // or whatever
std::this_thread::sleep_for(timespan);

在你的标题替换

#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 本身也必须有它们的单行代码

【讨论】:

谢谢,这确实解决了我的问题!所以很遗憾,声音只能在程序运行时播放,但没关系。使用 SDL_mixer 是我找到的用于异步播放音频样本的唯一可行解决方案。

以上是关于在 C++/Linux 中使用 SDL_Mixer 时没有声音的主要内容,如果未能解决你的问题,请参考以下文章

SDL_Mixer 声音问题

在 Edge 和 Safari (emscripten) 中使用 SDL_mixer 播放 .ogg 文件

SDL_Mixer 无法处理部分代码

为啥 SDL_Mixer 不能播放某些 mp3 的音乐?

c++ SDL_mixer 错误,Mix_LoadWAV_RW with NULL src

SDL_Mixer 设置声音位置