AURemoteIO::IOThread(18):EXE_BAD_ACCESS (Code1, address 0X20) - ios

I am using following function to render the incoming audio.
static OSStatus audioUnitRenderCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberOfFrames,
AudioBufferList *ioData{
// App is crashing at this :
AudioUnitIO *SELF = (__bridge AudioUnitIO *)inRefCon;
// MICROPHONE: take the sound received, render it into bytes and hand them to the delegate
AudioUnitRender(SELF->g_audioUnit,
ioActionFlags,
inTimeStamp,
g_inputBus,
inNumberOfFrames,
ioData);
if (!SELF->recordingAudio) {
memset(ioData->mBuffers[0].mData, 0, ioData->mBuffers[0].mDataByteSize);
// Some other code goes here
}
I am getting the crash as mentioned in question. Am I missing something?

Related

How to merge two Audio Units into AudioBufferList for AURenderCallback

Please see code below. All I want to, is to merge bufflist1 and bufflist2, then inset to ioData. But I don't know how.
OSStatus PlayCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
ALNPlayer *player = (__bridge ALNPlayer *)inRefCon;
OSStatus status;
player->buffList->mBuffers[0].mDataByteSize = CONST_BUFFER_SIZEV3;
//read audio1 data to bufflist1
status = AudioConverterFillComplexBuffer(player->audioConverter1, lyInInputDataProcV1, inRefCon, &inNumberFrames, player->buffList1, NULL);
//read audio2 data to bufflist2
status = AudioConverterFillComplexBuffer(player->audioConverter2, lyInInputDataProcV2, inRefCon, &inNumberFrames, player->buffList2, NULL);
//below is copy bufferlist1 to ioData
//and now i want to merge bufflist1 and buflist2,then inset to iodata. But I don't know how.
memcpy(ioData->mBuffers[0].mData, player->buffList->mBuffers[0].mData, player->buffList->mBuffers[0].mDataByteSize);
}

iOS - How to solve echo problems with speex?

My App call to the intercom has an echo, I have used the native method, but it is useless, I want to use the echo cancellation of speex, but I have encountered some problems, in the echo cancellation of speex, need three parameters, ref, echo and End, I only have the bufferList.mBuffers[0].mData variable, I don't know what the other two parameters are to be substituted for?
OSStatus recordingCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimestamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) {
AudioProcessor *audioProcessor = (__bridge AudioProcessor *)inRefCon;
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mData = NULL;
OSStatus status = AudioUnitRender(audioProcessor.audioUnit, ioActionFlags, inTimestamp, inBusNumber, inNumberFrames, &bufferList);
if (status != noErr) {
return status;
}
SpeexEchoState *echo_state = speex_echo_state_init(bufferList.mBuffers[0].mDataByteSize, 882);
SpeexPreprocessState *den = speex_preprocess_state_init(bufferList.mBuffers[0].mDataByteSize, 44100);
short *ref_buf = (short*)bufferList.mBuffers[0].mData;
short *echo_buf = (short*)malloc(bufferList.mBuffers[0].mDataByteSize);
short *endbuf = (short*)malloc(bufferList.mBuffers[0].mDataByteSize);
speex_echo_cancellation(echo_state,
(spx_int16_t*)ref_buf,
(spx_int16_t*)echo_buf,
(spx_int16_t*)endbuf);
speex_preprocess_run(den, (spx_int16_t*)endbuf);
[audioProcessor.delegate processAudioData:endbuf dataSize:bufferList.mBuffers[0].mDataByteSize];
free(ref_buf);
free(echo_buf);
free(endbuf);
return noErr;
}
If you build-in AEC is not working, it means that there is a good chance that your echo behavior is not trivial and you should look for more robust solutions than Speex. Google for echo cancellation software to find few alternatives.

AURemoteIO::IOThread EXC_BAD_ACCESS

I am using AudioGraph.eqRenderInput is a callback function.
static OSStatus eqRenderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
#autoreleasepool {
NSLog(#"--method = %s--current thread:%#",__func__,[NSThread currentThread]);
MyAudioController *mycon = (__bridge MyAudioController *)inRefCon;
AudioUnit mixUNIT = mycon->mixUnit;
AudioUnitRender(mixUNIT, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
int bufferCount = ioData->mNumberBuffers;
NSLog(#"current thread:%#----bufferCount=%d",[NSThread currentThread],bufferCount);
// Fill the provided AudioBufferList with the data from the AudioBufferList output by the audio data output
for (int bufferIndex = 0; bufferIndex < bufferCount; bufferIndex++) {
NSData *tmpData = [NSData dataWithBytes:ioData->mBuffers[bufferIndex].mData length:ioData->mBuffers[bufferIndex].mDataByteSize];
[mycon->mixMArray addObject:tmpData]; // this line carsh
NSLog(#"mchannel = %d---bufferIndex = %d",ioData->mBuffers[bufferIndex].mNumberChannels,bufferIndex);
}
}
}
mixMArray class is NSMutableArray,
[mycon->mixMArray addObject:tmpData];this line crash,
error message is exec bad access code = 1 adddress = 0xf42e8.

Remote IO AudioBufferList Crash

Why would the following bolded line crash??? Any suggestions?
static OSStatus AudioInputCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
AudioUnitRender(audioUnitIn, ioActionFlags, inTimeStamp,
inBusNumber, inNumberFrames, inputBufferList);
AudioSampleType is a signed short
**AudioSampleType (pointer)data = inputBufferList->mBuffers[0].mData;**

How do I stop RemoteIO when file is finished?

I'm using the following to play audio:
OSStatus PlayRenderCallback (
void * inRefCon,
AudioUnitRenderActionFlags * ioActionFlags,
const AudioTimeStamp * inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList * ioData)
{
EffectState *effectState = (EffectState*) inRefCon;
if(effectState->play)
{
XThrowIfError(ExtAudioFileRead(effectState->sourceFile, &inNumberFrames, ioData), "Read failed!");
if(inNumberFrames == 0)
{
return noErr;
}
Then I process the audio and send it to the buffer.
What I want to know is what do I put in the return to stop playback? I tried:
AudioOutputUnitStop(remoteIOUnit);
And that works, once. I can't start the unit again.
Thanks all,
Jim
It seems you cannot stop a copy of a remote io. Rather than copying I used only the rio in my struct and now it works.

Resources