title: Getting level values from PCM raw data using Core Audio
body: <p>I am trying to extract level data from a PCM audio file using core audio. I have gotten as far as (I believe) getting the raw data into a byte array (UInt8) but it is 16 bit PCM data and I am having trouble reading the data out. The input is from the iPhone microphone, which I have set as:</p>
  
  <pre><code>[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
  [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
  [recordSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
  
  [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
  [recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
  [recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
  </code></pre>
  
  <p>which is obviously 16 bits. I am then trying to just print out a few values to see if they look reasonable for debug purposes below, and they do not look reasonable (many 0's).</p>
  
  <p>ExtAudioFileRef inputFile = NULL;
      ExtAudioFileOpenURL(track.location, &amp;inputFile);</p>
  
  <pre><code>AudioStreamBasicDescription inputFileFormat;
  UInt32 dataSize = (UInt32)sizeof(inputFileFormat);
  ExtAudioFileGetProperty(inputFile, kExtAudioFileProperty_FileDataFormat, &amp;dataSize, &amp;inputFileFormat);
  
  UInt8 *buffer = malloc(BUFFER_SIZE);
  AudioBufferList bufferList;
  bufferList.mNumberBuffers = 1;
  bufferList.mBuffers[0].mNumberChannels = 1;
  bufferList.mBuffers[0].mData = buffer; //pointer to buffer of audio data
  bufferList.mBuffers[0].mDataByteSize = BUFFER_SIZE; //number of bytes in the buffer
  
  while(true) {
  
      UInt32 frameCount = (bufferList.mBuffers[0].mDataByteSize / inputFileFormat.mBytesPerFrame);
  
      // Read a chunk of input
      OSStatus status = ExtAudioFileRead(inputFile, &amp;frameCount, &amp;bufferList);
  
      // If no frames were returned, conversion is finished
      if(0 == frameCount)
          break;
  
      NSLog(@"---");
  
      int16_t *bufferl = &amp;buffer;
      for(int i=0;i&lt;100;i++){
          //const int16_t *bufferl = bufferl[i];
          NSLog(@"%d",bufferl[i]);
      }
  
  }
  </code></pre>
  
  <p>Not sure what I am doing wrong, I think it has to do with reading the byte array. Sorry for the long code post...</p>