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;**
Related
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);
}
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.
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?
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.
I want to add to this http://www.cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html
example the recordCallBack:
i add:
recordingCallback:
static OSStatus recordingCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
NSlog(#"recordingCallback");
...
return noErr;
}
and add to the output audio unit (toneUnit) config.
// Set input callback
input.inputProc = recordingCallback;
input.inputProcRefCon = self;
err = AudioUnitSetProperty(toneUnit,
kAudioOutputUnitProperty_SetInputCallback,
kAudioUnitScope_Global,
1,
&input,
sizeof(input));
...
err = AudioUnitSetProperty (toneUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
1,
&streamFormat,
sizeof(AudioStreamBasicDescription));
iphone asked for permission to use microphone, but my recording callback is never called
update SOLUTION
AudioUnitAddRenderNotify(
iOUnit,
&recordingCallback,
self
);