Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Can you playback the caf file ?</p> <p>If you only want to record a sound from microphone to an aac file, you can use Audio Queue Services (I can post some code)</p> <p>Edit : it's an implementation from Apple dev tutorial, there might be some errors since I modified it to fit your question</p> <pre><code>//AudioQ.mm @implementation AudioQ static const int nBuffer = 3; struct AQRecorderState{ AudioStreamBasicDescription mDataFormat; AudioQueueRef mQueue; AudioQueueBufferRef mBuffers[nBuffer]; AudioFileID mAudioFile; UInt32 bufferByteSize; SInt64 mCurrentPacket; bool mIsRunning; }; AQRecorderState aqData; CFURLRef url; static OSStatus BufferFilledHandler( void * inUserData, SInt64 inPosition, UInt32 requestCount, const void * buffer, UInt32 * actualCount ){ // callback when you write to the file // you can handle audio packet and send them for broadcasting return 0; } static void HandleInputBuffer( void *aqData, AudioQueueRef inAq, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription *inPacketDesc ) { AQRecorderState *pAqData = (AQRecorderState*) aqData; if (AudioFileWritePackets ( pAqData-&gt;mAudioFile, false, inBuffer-&gt;mAudioDataByteSize, inPacketDesc, pAqData-&gt;mCurrentPacket, &amp;inNumPackets, inBuffer-&gt;mAudioData ) == noErr) { pAqData-&gt;mCurrentPacket += inNumPackets; } else { NSLog(@"err writing packet"); } if (pAqData-&gt;mIsRunning == 0) return; AudioQueueEnqueueBuffer(pAqData-&gt;mQueue,inBuffer,0,NULL); } -(OSStatus) initializeAQ{ //--- set the output format ---// aqData.mDataFormat.mSampleRate = 22050; aqData.mDataFormat.mFormatID = kAudioFormatMPEG4AAC; aqData.mDataFormat.mFormatFlags = kMPEG4Object_AAC_Main; aqData.mDataFormat.mBytesPerPacket = 0; aqData.mDataFormat.mFramesPerPacket = 1024; aqData.mDataFormat.mBytesPerFrame = 0; aqData.mDataFormat.mChannelsPerFrame = 1; aqData.mDataFormat.mBitsPerChannel = 0; AudioFileTypeID fileType = kAudioFileAAC_ADTSType; aqData.bufferByteSize = 0x5000; // ?? AudioQueueNewInput(&amp;aqData.mDataFormat, HandleInputBuffer, &amp;aqData, CFRunLoopGetMain(), kCFRunLoopCommonModes, 0, &amp;aqData.mQueue); aqData.mCurrentPacket = 0; aqData.mIsRunning = true; //--- record in a file get the callback when writing ---// AQRecorderState *pAqData = &amp;aqData; AudioFileInitializeWithCallbacks((void*)&amp;pAqData, nil, BufferFilledHandler, nil, nil, fileType, &amp;aqData.mDataFormat, kAudioFileFlags_EraseFile, &amp;aqData.mAudioFile); //--- prepare set of audio queue buffers ---// for(int i = 0 ; i &lt; nBuffer ; i++){ AudioQueueAllocateBuffer(aqData.mQueue, aqData.bufferByteSize, &amp;aqData.mBuffers[i]); AudioQueueEnqueueBuffer(aqData.mQueue, aqData.mBuffers[i], 0, NULL); } return 0; } -(void) start{ AudioQueueStart(aqData.mQueue, NULL); } -(void) stop{ NSLog(@"stoping"); AudioQueueStop(aqData.mQueue, true); aqData.mIsRunning = false; AudioQueueDispose (aqData.mQueue,true); AudioFileClose (aqData.mAudioFile); } @end </code></pre> <p>AudioQ.h</p> <pre><code>static void HandleInputBuffer( void *aqData, AudioQueueRef inAq, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription *inPacketDesc ); static OSStatus BufferFilledHandler( void * inUserData, SInt64 inPosition, UInt32 requestCount, const void * buffer, UInt32 * actualCount ); -(OSStatus)initializeAQ; -(void)stop; -(void)start; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload