Рендеринг аудио из файла в аудиоустройство обработки голоса с использованием различных форматов - PullRequest
0 голосов
/ 12 октября 2018

Используя 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.И я не могу заполнить буфер.Мне интересно понять, что там происходит и как я могу решить эту проблему.

Спасибо!

...