Используя Core Audio, я пытаюсь вручную воспроизвести музыку в качестве упражнения, чтобы поиграть с CoreAudio и изучить.Поскольку моей целью является изучение, я хотел бы понять, почему не работает следующее:
Все работает нормально, когда я просто создаю эти два модуля, не соединяя их вместе (ни вручную, ни с помощью AUGraph):
- outputAU (kAudioUnitSubType_VoiceProcessingIO)
- fileGeneratorUnit (kAudioUnitType_Generator)
Вместо этого я настроил обратный вызов рендеринга в outputAU, чтобы изнутри я мог вручную вызвать вызовioData.
var err = AudioUnitRender(outputAU,&flags,&ts,inBusNumber,inNumberFrames,&ioData!.pointee)
Это хорошо работает, мой outputUnit может воспроизводить песню.
Однако он перестает работать, если я изменяю формат моего outputUnit на этот:
var format = AudioStreamBasicDescription(mSampleRate: 44100,
mFormatID: kAudioFormatLinearPCM,
mFormatFlags: kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked,
mBytesPerPacket: bytePerSample, // bytePerSample = 2
mFramesPerPacket: 1,
mBytesPerFrame: bytePerSample,
mChannelsPerFrame: 1,
mBitsPerChannel: 8 * bytePerSample,
mReserved: 0)
Я установил этот формат для выходной и входной областей следующим образом:
error = AudioUnitSetProperty(outputAU,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
input,
&format,
UInt32(MemoryLayout<AudioStreamBasicDescription>.size))
guard error == noErr else {
print("An error occured \(error)")
return
}
error = AudioUnitSetProperty(outputAU,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
output,
&format,
UInt32(MemoryLayout<AudioStreamBasicDescription>.size))
guard error == noErr else {
print("An error occured \(error)")
return
}
Мой вызов AudioUnitRender теперь постоянно возвращает мне -50.И я не могу заполнить буфер.Мне интересно понять, что там происходит и как я могу решить эту проблему.
Спасибо!