2017-11-01 20 views
0

코어 오디오은 iOS 및 macOS 용 오디오 프레임 워크입니다. Apple's own documentation에서 구현에 차이가 있음을 알 수 있습니다. 가장 눈에 띄는 것은 표본 형식 (iOS 용 고정 점과 MacOS 용 32 비트 부동 소수점) 인 것으로 보이며 iOS는 Core Audio의 모든 측면을 지원하지 않습니다.코어 오디오를 사용하는 코드는 iOS 및 macOS에서 호환 될 수 있습니까?

두 플랫폼에서 모두 지원할 수있는 코드를 작성할 때 코드를 한 번 작성하고 실제로 이식 할 수 있습니까? 대답이 "예, 특정 측면에서만"인 경우 자세히 설명하십시오.

라이브 오디오 합성의 예를 들어 보겠습니다. 오디오 출력 스트림을 열고 콜백 메서드를 사용하여 샘플을 출력 버퍼에 배치하려고합니다. 나는 이것이 iOS와 macOS에서 모두 가능하다는 것을 알고 있지만 라이브러리를 찾으면 둘 다 지원하지 않는 것 같다. 이 라이브러리가 실제로 두 플랫폼을 모두 지원할 수 있습니까? 아니면이를 차단하는 근본적인 이유가 있습니까? 예를 들어

:

RTaudio이 라이브러리가 맥 OS가 아닌 아이폰 OS를 지원하는 제언 API notes에 대한
  • .
  • PortAudio 라이브러리 설명서는 macOS를 지원하지만 iOS에 대해서는 언급하지 않습니다.

답변

1

표준 샘플 형식은 이제 iOS에서도 스테레오 플로트 32입니다.

Mac OS는 맞춤 v3 및 v2 오디오 기기를 지원하지만 iOS는 맞춤 v3 오디오 기기를 지원하지만 시스템에서 제공하는 v2 오디오 기기 만 지원합니다.

AVAudioEngine 및 친구들은 Swift/ObjC에서 핵심 오디오 C API를 상당 부분 감쌌으며 플랫폼 차이가 거의 없다고 생각합니다. AVAudioEngine을 먼저 시도한 다음 필요에 맞지 않으면 C API를 사용하는 것이 좋습니다.

C API의 대부분은 크로스 플랫폼이지만 MacOS 또는 iOS에서만 지원되는 부분이 있습니다. 차이점을 확인하려면 헤더를 살펴볼 수 있습니다. 예를 들어, 다음은 출력 오디오 유닛 하위 유형에 대한 정의입니다 (문서가 제거 된 경우).

#if !TARGET_OS_IPHONE 

CF_ENUM(UInt32) { 
    kAudioUnitSubType_HALOutput    = 'ahal', 
    kAudioUnitSubType_DefaultOutput   = 'def ', 
    kAudioUnitSubType_SystemOutput   = 'sys ', 
}; 

#else 

CF_ENUM(UInt32) { 
    kAudioUnitSubType_RemoteIO    = 'rioc', 
}; 

#endif 

플랫폼 간 래퍼를 작성하려면 플랫폼 특성 전 처리기 지시문을 사용해야합니다. 다음은 플랫폼 관련 하위 유형을 사용하여 출력 오디오 유닛에 대한 AudioComponentDescription을 만드는 크로스 플랫폼 함수입니다.

AudioComponentDescription outputDescription() { 

    AudioComponentDescription description; 
    description.componentType = kAudioUnitType_Output; 
    description.componentManufacturer = kAudioUnitManufacturer_Apple; 
    description.componentFlags = 0; 
    description.componentFlagsMask = 0; 

#if TARGET_OS_IPHONE 
    description.componentSubType = kAudioUnitSubType_RemoteIO; 
#else 
    description.componentSubType = kAudioUnitSubType_DefaultOutput; 
#endif 

    return description; 
} 

는 iOS 또는 맥 OS에서 지원되는 다른 오디오 장치 및 관리하는 API가있다 "시스템"수준의 오디오 상호 작용은 완전히 다릅니다. MacOS는 C API를, iOS는 AVAudioSession을 사용합니다.

나는 몇 가지가 빠졌음을 확신합니다.

+0

고마워요, Dave. 너는 나의 의심도 확인했다. 새 문서 https://developer.apple.com/documentation/coreaudio는 최신 참조이지만 예제/샘플/설명이없는 반면 이전 문서는 https://developer.apple.com/library를 참조했습니다. /content/documentation/MusicAudio/Conceptual/CoreAudioOverview/WhatisCoreAudio/WawisCoreAudio.html에 설명이 있지만 오래된 것입니다. –