Hi all,
I've developed an audio DSP application in C++ using AudioToolbox and CoreAudio on MacOS 14.4.1 with Xcode 15. I use an AudioQueue for input and another for output. This works great.
I'm now adding real-time audio analysis eg spectral analysis. I want this to run independently of my audio processing so it can not interfere with audio playback. Taps on AudioQueues seem to be a good way of doing this...
Since the analytics won't modify the audio data, I am using a Siphon Tap by setting the AudioQueueProcessingTapFlags to kAudioQueueProcessingTap_PreEffects | kAudioQueueProcessingTap_Siphon;
This works fine on my output queue. However, on my input queue the Tap callback is called once and then a EXC_BAD_ACCESS occurs - screen shot below.
NB: I believe that a callback should only call AudioQueueProcessingTapGetSourceAudio when not using a Siphon, so I don't call it.
Relevant code:
AudioQueueProcessingTapCallback tap_callback) {
// Makes an audio tap for a queue
void * tap_data_ptr = NULL;
AudioQueueProcessingTapFlags tap_flags =
kAudioQueueProcessingTap_PostEffects
| kAudioQueueProcessingTap_Siphon;
uint32_t max_frames = 0;
AudioStreamBasicDescription asbd;
AudioQueueProcessingTapRef tap_ref;
OSStatus status = AudioQueueProcessingTapNew(queue_ref,
tap_callback,
tap_data_ptr,
tap_flags,
&max_frames,
&asbd,
&tap_ref);
if (status != noErr) printf("Error while making Tap\n");
else printf("Successfully made tap\n");
}
void tapper(void * tap_data,
AudioQueueProcessingTapRef tap_ref,
uint32_t number_of_frames_in,
AudioTimeStamp * ts_ptr,
AudioQueueProcessingTapFlags * tap_flags_ptr,
uint32_t * number_of_frames_out_ptr,
AudioBufferList * buf_list) {
// Callback function for audio queue tap
printf("Tap callback");
}```
Image of exception stack provided by Xcode:

What have I missed?
Appreciate any help you learned folks may be able to provide.
Best,
Geoff.