2013-12-02 8 views
1

У меня есть приложение, которое выбирает песню из библиотеки iPod, а затем копирует эту песню в каталог приложения в виде файла .caf. Теперь мне нужно играть и в то же время читать этот файл в Apple FFT из ракурса Accelerate, чтобы я мог визуализировать данные, подобные спектрограмме. Вот код для FFT:Как играть и читать .caf PCM аудиофайл

void FFTAccelerate::doFFTReal(float samples[], float amp[], int numSamples) 
{ 
int i; 
vDSP_Length log2n = log2f(numSamples); 

//Convert float array of reals samples to COMPLEX_SPLIT array A 
vDSP_ctoz((COMPLEX*)samples,2,&A,1,numSamples/2); 

//Perform FFT using fftSetup and A 
//Results are returned in A 
vDSP_fft_zrip(fftSetup, &A, 1, log2n, FFT_FORWARD); 

//Convert COMPLEX_SPLIT A result to float array to be returned 
amp[0] = A.realp[0]/(numSamples*2); 
for(i=1;i<numSamples;i++) 
    amp[i]=sqrt(A.realp[i]*A.realp[i]+A.imagp[i]*A.imagp[i])/numSamples; 
} 

//Constructor 
FFTAccelerate::FFTAccelerate (int numSamples) 
{ 
vDSP_Length log2n = log2f(numSamples); 
fftSetup = vDSP_create_fftsetup(log2n, FFT_RADIX2); 
int nOver2 = numSamples/2; 
A.realp = (float *) malloc(nOver2*sizeof(float)); 
A.imagp = (float *) malloc(nOver2*sizeof(float)); 
} 

Мой вопрос заключается в том, как я через цикл «.caf» аудиофайла кормить FFT в то же время играет песню? Мне нужен только один канал. Я предполагаю, что мне нужно получить 1024 образца песни, процесс, который в FTT, а затем двигаться дальше по файлу и захватить еще 1024 образца. Но я не понимаю, как читать аудиофайл, чтобы сделать это. Файл имеет частоту дискретизации 44100,0 Гц, находится в линейном формате PCM, 16 бит, и я считаю, что чередуется, если это помогает ...

ответ

1

Попробуйте API ExtendedAudioFile (требуется AudioToolbox.framework).

#include <AudioToolbox/ExtendedAudioFile.h> 

NSURL *urlToCAF = ...; 

ExtAudioFileRef caf; 
OSStatus status; 

status = ExtAudioFileOpenURL((__bridge CFURLRef)urlToCAF, &caf); 
if(noErr == status) { 
    // request float format 
    const UInt32 NumFrames = 1024; 
    const int ChannelsPerFrame = 1; // Mono, 2 for Stereo 

    // request float format 
    AudioStreamBasicDescription clientFormat; 
    clientFormat.mChannelsPerFrame = ChannelsPerFrame; 
    clientFormat.mSampleRate = 44100; 

    clientFormat.mFormatID = kAudioFormatLinearPCM; 
    clientFormat.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsNonInterleaved; // float 
    int cmpSize = sizeof(float); 
    int frameSize = cmpSize*ChannelsPerFrame; 
    clientFormat.mBitsPerChannel = cmpSize*8; 
    clientFormat.mBytesPerPacket = frameSize; 
    clientFormat.mFramesPerPacket = 1; 
    clientFormat.mBytesPerFrame = frameSize; 

    status = ExtAudioFileSetProperty(caf, kExtAudioFileProperty_ClientDataFormat, sizeof(clientFormat), &clientFormat); 
    if(noErr != status) { /* handle it */ } 

    while(1) { 
     float buf[ChannelsPerFrame*NumFrames]; 
     AudioBuffer ab = { ChannelsPerFrame, sizeof(buf), buf }; 
     AudioBufferList abl; 
     abl.mNumberBuffers = 1; 
     abl.mBuffers[0] = ab; 

     UInt32 ioNumFrames = NumFrames; 
     status = ExtAudioFileRead(caf, &ioNumFrames, &abl); 

     if(noErr == status) { 
      // process ioNumFrames here in buf 
      if(0 == ioNumFrames) { 
       // EOF! 
       break; 
      } else if(ioNumFrames < NumFrames) { 
       // TODO: pad buf with zeroes out to NumFrames 
      } else { 
       float amp[NumFrames]; // scratch space 
       doFFTReal(buf, amp, NumFrames); 
      } 
     } 
    } 

    // later 
    status = ExtAudioFileDispose(caf); 
    if(noErr != status) { /* hmm */ } 
} 
+0

Спасибо ... это выглядит многообещающе! Как бы я обходил вокруг и получал следующие 1024 кадра? Как я могу одновременно воспроизводить аудио? – Snick

+0

добавлен цикл. просто понял, что вам нужны образцы с плавающей точкой. нужно исправить это. для одновременного воспроизведения звука, возможно, вы должны задать другой вопрос. есть много способов сделать это. –

+0

Я смущен, что такое ioNumFrames? Dont Я хочу массив образцов с плавающей точкой? Является ли «ab'what держать эту информацию?» – Snick

 Смежные вопросы

  • Нет связанных вопросов^_^