SDL音频回调Swift实现中的噪声和失真



我目前正在Swift中为Mac OS构建一个游戏音乐播放器,使用GME生成声音缓冲区,使用SDL进行音频播放。我以前(并成功地(使用过SDL_QueueAudio进行播放,但我需要对缓冲区处理进行更精细的控制,以确定歌曲进度、歌曲结尾等。因此,这让我在SDL_AudioSpec API中使用SDL_AudioCallback。

我能听到这首歌的播放,但它伴随着噪音和失真(有时会根据我的尝试产生回声(。

设置

var desiredSpec = SDL_AudioSpec()
desiredSpec.freq = Int32(44100)
desiredSpec.format = SDL_AudioFormat(AUDIO_U8)
desiredSpec.samples = 512
desiredSpec.channels = 2
desiredSpec.callback = { callback(userData: $0, stream: $1, length: $2) }
SDL_OpenAudio(&desiredSpec, nil)

回调

func callback(userData: UnsafeMutableRawPointer?, stream: UnsafeMutablePointer<UInt8>?, length: Int32) {
// Half sample length to compensate for double byte Int16.
var output = Array<Int16>.init(repeating: 0, count: Int(length / 2))
// Generates stereo signed Int16 audio samples.
gme_play(emulator, Int32(output.count), &output)
// Converts Int16 samples to UInt8 samples expected by the mixer below. Then adds to buffer.
var buffer = [UInt8]()
for i in 0 ..< (output.count) {
let uIntVal = UInt16(bitPattern: output[i])
buffer.append(UInt8(uIntVal & 0xff))
buffer.append(UInt8((uIntVal >> 8) & 0xff))
}
SDL_MixAudio(stream, buffer, Uint32(length), SDL_MIX_MAXVOLUME)
}

已解决!最终,这足以让它发挥作用:

desiredSpec.format = SDL_AudioFormat(AUDIO_S16)
var buffer = Array<Int16>(repeating: 0, count: Int(length / 2))
gme_play(emulator, Int32(output.count), &output)
SDL_memcpy(stream, buffer, Int(length))

最新更新