Here's a suitable AudioStreamBasicDescription for mono SInt16:
mSampleRate 44100.000000 mFormatFlags kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsNonInterleaved mFormatID kAudioFormatLinearPCM mFramesPerPacket 1 mBytesPerFrame 2 mChannelsPerFrame 1 mBitsPerChannel 16 mBytesPerPacket 2 But, I think (not %100 sure) that the effect units want stereo floats: One way to get the right format is to do an AudioUnitGetProperty on the input of the "downstream" unit and then set the output of the upstream unit to that format; But here is a stere float one anyway: mSampleRate 44100.000000 mFormatFlags kAudioFormatFlagIsFloat | kAudioFormatFlagIsNonInterleaved | kAudioFormatFlagIsPacked mFormatID kAudioFormatLinearPCM mFramesPerPacket 1 mBytesPerFrame 4 mChannelsPerFrame 2 mBitsPerChannel 32 mBytesPerPacket 4 I was able to get an offline render going, I wasn't quite there in my current project but knew I would be soon so I'm in the same boat. I found a really good answer that sums it up on Stack Overflow: http://stackoverflow.com/questions/15297990/core-audio-offline-rendering-genericoutput but I'll paste in the most relevant section here in case the link dies: AudioUnitRenderActionFlags flags = 0; AudioTimeStamp inTimeStamp; memset(&inTimeStamp, 0, sizeof(AudioTimeStamp)); inTimeStamp.mFlags = kAudioTimeStampSampleTimeValid; UInt32 busNumber = 0; UInt32 numberFrames = 512; inTimeStamp.mSampleTime = 0; int channelCount = 2; int totFrms = MaxSampleTime; while (totFrms > 0) { if (totFrms < numberFrames) { numberFrames = totFrms; NSLog(@"Final numberFrames :%li",numberFrames); } else { totFrms -= numberFrames; } AudioBufferList *bufferList = (AudioBufferList*)malloc(sizeof(AudioBufferList)+sizeof(AudioBuffer)*(channelCount-1)); bufferList->mNumberBuffers = channelCount; for (int j=0; j<channelCount; j++) { AudioBuffer buffer = {0}; buffer.mNumberChannels = 1; buffer.mDataByteSize = numberFrames*sizeof(AudioUnitSampleType); buffer.mData = calloc(numberFrames, sizeof(AudioUnitSampleType)); bufferList->mBuffers[j] = buffer; } CheckError(AudioUnitRender(mGIO, &flags, &inTimeStamp, busNumber, numberFrames, bufferList), "AudioUnitRender mGIO"); } In my test demo I tried looping through some audio in multiple passes, if you are going to do this you must increment the mSampleTime of the AudioTimeStamp each render as per the documentation. Dave On Fri, Mar 20, 2015 at 8:55 PM, Patrick J. Collins < [email protected]> wrote: > Hi everyone, > > So a week or so has gone by, and I feel like I am getting nowhere (or at > least close to nowhere) with my goal of being able to simply to: > > input buffer -> low pass -> new buffer > > Can anyone please please please help me? > > I have read pretty much all of Apple's documentation on this subject and > I just do not understand so many things... > > At first I was trying to just use the default output so that I could at > least hear the low pass happening.. Unfortunately all I hear is > garbage... I figured it's because the asbd is wrong-- so I tried > setting the asbd on the lowpass unit, and I get "-10868" when trying to > set the stream format on the low pass unit's input scope or output > scope... > > Then I tried to set the asbd on the output unit, and then I get error > -50, which says a parameter is wrong-- but.. the parameters are not > wrong! > > AudioStreamBasicDescription asbd; > asbd.mSampleRate = 8000; > asbd.mFormatID = kAudioFormatLinearPCM; > asbd.mFormatFlags = kAudioFormatFlagIsSignedInteger; > asbd.mFramesPerPacket = 1; > asbd.mChannelsPerFrame = 1; > asbd.mBitsPerChannel = 16; > asbd.mBytesPerPacket = 2; > asbd.mBytesPerFrame = 2; > > There should be absolutely nothing wrong with those parameters, so I > don't understand why it's giving a -50 error... > > Regardless, I ultimately don't want to output to the hardward, I want to > do a quick offline render to lowpass filter my buffer... So, I change > my output description from kAudioUnitSubType_DefaultOutput to > kAudioUnitSubType_GenericOytput > > And then suddenly my lowpass input render proc is not getting called-- > which I assume is because I need to call AudioUnitRender... However, I > cannot find any documentation or examples anywhere about how to > correctly do this! > > Where do you call AudioUnitRender? I assume this needs to be in a loop, > but-- clearly I don't want to manually call this in a loop myself... I > tried adding a InputProc callback to my generic output unit, but it > doesn't get called either. > > Here is my code: > > https://gist.github.com/patrick99e99/9221d8d7165d610fd3e1 > > I keep asking myself: Why is this so difficult?? Why is there so > little information out on the internet about how to do this?? All I can > find are a bunch of people asking some-what similar questions on > stackoverflow that aren't similar enough to help answer my questions. > Core audio has been around for a long time, and there are tons of apps > doing this sort of thing, so I am just really surprised by the lack of > information and available help for what seems like should be a simple > thing to do.... > > How about if I try this: > > HELP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! > > Thank you! > > Patrick J. Collins > http://collinatorstudios.com > > _______________________________________________ > Do not post admin requests to the list. They will be ignored. > Coreaudio-api mailing list ([email protected]) > Help/Unsubscribe/Update your Subscription: > https://lists.apple.com/mailman/options/coreaudio-api/oneill707%40gmail.com > > This email sent to [email protected]
_______________________________________________ Do not post admin requests to the list. They will be ignored. Coreaudio-api mailing list ([email protected]) Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/coreaudio-api/archive%40mail-archive.com This email sent to [email protected]
