调用函数

SDL_AudioDeviceID SDL_OpenAudioDevice(const char*          device,
                                      int                  iscapture,
                                      const SDL_AudioSpec* desired,
                                      SDL_AudioSpec*       obtained,
                                      int                  allowed_changes)

返回值SDL_AudioDeviceID,这个id不代表具体硬件设备,应该叫Session,即一个会话。

网上的帖子详细解析: 源码解析

多线程出现的问题

开启两个线程,同时调用函数,会导致返回会话id相同的情况或创建失败的情况。若对象封装后,在创建过程中出现相同id,在一个对象释放时close会导致崩溃的情况。

复现问题代码如下

std::thread t1([](){
  int device_id = SDL_AudioDeviceID(NULL, 0, &wanted_spec, NULL, 0);
});
std::thread t2([](){
  int device_id = SDL_AudioDeviceID(NULL, 0, &wanted_spec, NULL, 0);
});
t1.join();
t2.join();

两个线程同时开始,一般创建失败

std::thread t1([](){
  int device_id = SDL_AudioDeviceID(NULL, 0, &wanted_spec, NULL, 0);
});
std::thread t2([](){
  Sleep(100);
  int device_id = SDL_AudioDeviceID(NULL, 0, &wanted_spec, NULL, 0);
});
t1.join();
t2.join();

两个线程间隔300ms以下,一般创建出相同id。 间隔500ms以上,创建出两个id。

暂时的解决方法

暂时的解决办法是,错开创建时间。