SDL之SDL_OpenAudioDevice与SDL_OpenAudio

本文解析了SDL2中SDL_OpenAudioDevice与SDL_OpenAudio函数的区别及兼容性问题,揭示了两者如何通过调用同一底层函数open_audio_device来操作音频设备,强调了SDL2为保持与SDL1.x版本兼容所做出的设计考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数原型:
SDL_AudioDeviceIDSDL_OpenAudioDevice(const char *device, int iscapture,
                    const SDL_AudioSpec * desired, SDL_AudioSpec * obtained,
                    int allowed_changes)
                    {    
                    return open_audio_device(device, iscapture, desired, obtained, allowed_changes, 2);
                    }

static SDL_AudioDeviceIDopen_audio_device(const char *devname, int iscapture,
                  const SDL_AudioSpec * desired, SDL_AudioSpec * obtained,
                  int allowed_changes, int min_id);


SDL_OpenAudioDevice和SDL_OpenAudio函数都是通过调用open_audio_device来实现打开Audio device的操作的,
所以SDL2为了与SDL1.x兼容,SDL_OpenAudioDevice函数只能用来打开AudioDeviceID大于等于2的设备,
而默认的设备,即AudioDeviceID等于1,只能用SDL_OpenAudio函数打开。

### SDL_OpenAudio 使用方法 `SDL_OpenAudio` 是用于初始化并打开音频设备的函数。此函数接受两个 `SDL_AudioSpec` 类型指针作为参数,第一个是指定期望配置的指针,第二个则是实际获得配置的指针[^3]。 ```cpp int SDLCALL SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); ``` 当调用该函数时,如果成功,则返回 0;如果有错误发生,则返回负数,并可通过 `SDL_GetError()` 获取具体的错误信息[^5]。 对于期望的音频规格 (`desired`) ,应指定频率(`freq`)、格式(`format`)、声道数量(`channels`)以及其他属性。而 `obtained` 参数则用来接收最终被使用的音频设置,在某些情况下可能请求的不同。这允许应用程序确认所得到的确切音频特性是否满足需求[^4]。 #### 设置音频结构体示例 下面展示了如何创建一个简单的音频规范实例: ```cpp SDL_AudioSpec wanted_spec; wanted_spec.freq = 44100; // 频率为44.1kHz wanted_spec.format = AUDIO_S16SYS; // 格式为16位有符号整数 wanted_spec.channels = 2; // 双声道立体声 wanted_spec.silence = 0; // 默认静音值 wanted_spec.samples = 1024; // 缓冲区大小设为1024样本点 wanted_spec.callback = NULL; // 不使用回调机制填充数据 wanted_spec.userdata = NULL; // 打开音频设备 if (SDL_OpenAudio(&wanted_spec, NULL) < 0) { fprintf(stderr, "Failed to open audio: %s\n", SDL_GetError()); } else { printf("Successfully opened the audio device.\n"); } // 开始播放声音流 SDL_PauseAudio(0); // 将暂停状态置为false以启动播放 ``` ### SDL_AudioFormat 支持的音频格式 关于支持的音频格式,`SDL_AudioFormat` 主要定义了几种常见的采样格式,包括但不限于以下几种[^1]: - **AUDIO_U8**: 无符号8位PCM编码。 - **AUDIO_S8**: 带符号8位PCM编码。 - **AUDIO_U16LSB / AUDIO_U16MSB**: 无符号16位PCM编码,分别表示小端序和大端序存储方式。 - **AUDIO_S16LSB / AUDIO_S16MSB**: 带符号16位PCM编码,同样区分小端序和大端序两种字节顺序。 - **AUDIO_S16SYS**: 当前平台默认的小/大端模式下的带符号16位PCM编码。 通常推荐使用 `AUDIO_S16SYS` 或者其他适合目标硬件架构的形式来确保最佳兼容性和性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值