2012-01-31 75 views
6

在iOS的5.0文檔中指出,規範的音頻數據的類型是16位的符號的int(link)類型:什麼是規範的音頻樣本數據在IOS 5

的規範的音頻數據樣本類型爲輸入和輸出。

typedef SInt16 AudioSampleType;

討論

在iPhone OS的輸入和輸出的規範音頻樣本類型是 與16位整數標本線性PCM。

但是,如果我用鼠標右鍵單擊「跳轉到」上AudioSampleType我看到下面的定義,在CoreAudioTypes.h

#if !CA_PREFER_FIXED_POINT 
typedef Float32  AudioSampleType; 
typedef Float32  AudioUnitSampleType; 
#else 
typedef SInt16  AudioSampleType; 
typedef SInt32  AudioUnitSampleType; 
#define kAudioUnitSampleFractionBits 24 
#endif 

時再跳躍到DEF爲CA_PREFER_FIXED_POINT我看到:

#if !defined(CA_PREFER_FIXED_POINT) 
    #if TARGET_OS_IPHONE 
     #if (TARGET_CPU_X86 || TARGET_CPU_X86_64 || TARGET_CPU_PPC || TARGET_CPU_PPC64) && !TARGET_IPHONE_SIMULATOR 
      #define CA_PREFER_FIXED_POINT 0 
     #else 
      #define CA_PREFER_FIXED_POINT 1 
     #endif 
    #else 
     #define CA_PREFER_FIXED_POINT 0 
    #endif 
#endif 

在運行時檢查我的代碼,我看到CA_PREFER_FIXED_POINT被定義爲1,無論是在模擬器上還是在我的iPod上。

所以,我的問題:

  • 什麼所述規範類型?是否總是SInt16在設備上?
  • 上面的第三行評估爲「真」的是什麼情況?我的意思是,哪個設備運行iPhone OS並使用某個列出的CPU?
  • 有沒有一個用例,我應該重新定義CA_PREFER_FIXED_POINT爲0(當爲iPhone編程時)?

回答

7

再次閱讀鏈接的內容,而這條線在你的頭:

#define kAudioUnitSampleFractionBits 24 

的規範型音頻輸入輸出相當於SInt16。

其他音頻處理的規範類型,例如新的iOS 5濾波器音頻單元,是8.24帶符號的定點。

如果您自己的DSP代碼用於接近實時的iOS音頻處理,請使用不同的類型進行基準測試,例如在某些最新的ARM內核中,32位浮點的序列通常比使用任何一種以上規範類型,並且在NEON asm代碼中編碼更快。

3

在其Core Audio Essentials蘋果澄清有關規範的音頻數據格式

規範的音頻數據格式根據不同的平臺,核心音頻有 一個或兩個「規範」的音頻數據格式,在這個意義上,這些 格式可以是:

  • 要求像在轉化
  • 格式F側中間格式或 在覈心音頻服務進行了優化
  • 默認,或承擔的格式,當您沒有另行指定ASBD

的規範格式的Core Audio如下:

  • iOS輸入輸出帶16位整數採樣的線性PCM
  • iOS音頻單元和其他音頻處理具有8.24位定點採樣的非交織線性PCM
  • Mac輸入和輸出線性PCM具有32位浮點樣本
  • 蘋果音響單位和32位浮點樣本

但其它音頻處理非交叉存取的線性PCM:如果你看看到CoreAudioTypes.h在iOS 8,你會發現一個討論:

「canonical」標誌已被棄用。 CA_PREFER_FIXED_POINT是 不鼓勵,因爲iOS上的浮點性能使得 定點不再是真正的首選。所有Apple提供的 AudioUnits支持浮點。更換應該做的與所指定的或預期 格式的慎重考慮,但 往往kAudioFormatFlagsCanonical可以 kAudioFormatFlagsNativeFloatPacked取代, kAudioFormatFlagsAudioUnitCanonicalkAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved