SDL音频播放

与很多教程是一样的

第一步初始化:SDL_Init(SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS);

第二步,配置音频参数 SDL_AudioSpec audioSpec;创建设备ID:SDL_OpenAudioDevice(SDL_AUDIO_ALLOW_ANY_CHANGE)

 

 

第三步:拿到大于0的ID后,启动设备播放SDL_PauseAudioDevice(audioDeviceID, 0);

第四步:音频数据过来后,如果是push进去的,就直接入队就好SDL_QueueAudio(audioDeviceID,data,size)

入队后,还可以查看当当前有多少数据未播放,auto size = SDL_GetQueuedAudioSize(audioDeviceID);

  送数据过快,auto size = SDL_GetQueuedAudioSize(audioDeviceID);这里就会很快累积的很多,因为我们也不知道底层音频缓冲容量有多少,所以不知道什么时候送满了,数据溢出了;如果送数据比较慢,比如上一帧据本帧延迟的时间足以播放完当前缓冲的音频了,那就是静音,根据目前的测试情况看并不会因为数据断流,就停止SDL工作;什么时候接着送数据,还是会继续播放声音;


 对于pull方案,就是靠底层触发回调来要数据:

1 设置回调函数

SDL_AudioSpec Spec;
   Spec.format = AUDIO_S16;
    Spec.freq = samplerate;
   Spec.channels = channels;
    Spec.samples = N;//你希望每次底层触发回调要多少数据,这里就写多少采样点数
    Spec.silence = 0;
   Spec.callback = class::audio_callback;
    Spec.userdata = this;
  audioDevice = SDL_OpenAudioDevice(nullptr, 0, &Spec, nullptr, SDL_AUDIO_ALLOW_ANY_CHANGE);
audio_callback(void *userdata, Uint8 *stream, int len)这个函数会触发,你把数据拷贝到这个里边:stream;它需要的长度数len;

posted on 2022-12-07 16:50  邗影  阅读(273)  评论(0编辑  收藏  举报

导航