Skip to content

Instantly share code, notes, and snippets.

@guidoschmidt
Forked from gcatlin/core-audio-sine-wave.c
Created May 23, 2025 19:27
Show Gist options
  • Select an option

  • Save guidoschmidt/7ce46c0368d6d7eebad49d28835b5904 to your computer and use it in GitHub Desktop.

Select an option

Save guidoschmidt/7ce46c0368d6d7eebad49d28835b5904 to your computer and use it in GitHub Desktop.
Core Audio sine wave example
// To run:
// clang core-audio-sine-wave.c -framework AudioUnit && ./a.out
#include <AudioUnit/AudioUnit.h>
#define SAMPLING_RATE 48000
#define TONE_FREQUENCY 440
#define M_TAU 2 * M_PI
OSStatus RenderSineWave(
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
static float theta;
float *channel = (float *)ioData->mBuffers[0].mData;
for (UInt32 frame = 0; frame < inNumberFrames; ++frame) {
channel[frame] = sin(theta);
theta += M_TAU * TONE_FREQUENCY / SAMPLING_RATE;
if (theta > M_TAU) {
theta -= M_TAU;
}
}
return noErr;
}
int main() {
OSErr err;
AudioComponentDescription acd;
acd.componentType = kAudioUnitType_Output;
acd.componentSubType = kAudioUnitSubType_DefaultOutput;
acd.componentManufacturer = kAudioUnitManufacturer_Apple;
acd.componentFlags = 0;
acd.componentFlagsMask = 0;
AudioComponent output = AudioComponentFindNext(NULL, &acd);
if (!output) printf("Can't find default output\n");
AudioUnit toneUnit;
err = AudioComponentInstanceNew(output, &toneUnit);
if (err) fprintf(stderr, "Error creating unit: %d\n", err);
AURenderCallbackStruct input;
input.inputProc = RenderSineWave;
input.inputProcRefCon = NULL;
err = AudioUnitSetProperty(toneUnit, kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input, 0, &input, sizeof(input));
if (err) printf("Error setting callback: %d\n", err);
AudioStreamBasicDescription asbd;
asbd.mFormatID = kAudioFormatLinearPCM;
asbd.mFormatFlags = kAudioFormatFlagsNativeFloatPacked;
asbd.mSampleRate = SAMPLING_RATE;
asbd.mBitsPerChannel = 32;
asbd.mChannelsPerFrame = 1;
asbd.mFramesPerPacket = 1;
asbd.mBytesPerFrame = asbd.mBitsPerChannel / 8 * asbd.mChannelsPerFrame;
asbd.mBytesPerPacket = asbd.mBytesPerFrame * asbd.mFramesPerPacket;
err = AudioUnitSetProperty(toneUnit, kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input, 0, &asbd, sizeof(asbd));
if (err) printf("Error setting stream format: %d\n", err);
err = AudioUnitInitialize(toneUnit);
if (err) printf("Error initializing unit: %d\n", err);
err = AudioOutputUnitStart(toneUnit);
if (err) printf("Error starting unit: %d\n", err);
usleep(2000000);
AudioOutputUnitStop(toneUnit);
AudioUnitUninitialize(toneUnit);
AudioComponentInstanceDispose(toneUnit);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment