• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
struggling with the audio unit graph...
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

struggling with the audio unit graph...


  • Subject: struggling with the audio unit graph...
  • From: "Patrick J. Collins" <email@hidden>
  • Date: Mon, 16 Mar 2015 01:07:01 -0700 (PDT)

Hi everyone,

I am trying to implement a simple audio unit graph that goes:

  buffer of samples->low pass filter->generic output

Where the generic output would be copied into a new buffer that could then be
processed further, saved to disk, etc.

All of the examples I can find online having to do with setting up an audio
unit graph involve using a generator with the kAudioUnitSubType_AudioFilePlayer
as the input source...  I am dealing with a buffer of samples already acquired,
so those examples do not help...  Based on looking around in the
AudioUnitProperties.h file, it looks like I should be using using is
kAudioUnitSubType_ScheduledSoundPlayer?

I can't seem to much documentation on how to hook this up, so I am quite stuck
and am hoping someone here can help me out.

To simplify things, I just started out by trying to get my buffer of samples to
go straight to the system output.  I get no errors, but I also get no audio.  Here is my code:

  #import "EffectMachine.h"
  #import <AudioToolbox/AudioToolbox.h>
  #import "AudioHelpers.h"
  #import "Buffer.h"

  @interface EffectMachine ()
  @property (nonatomic, strong) Buffer *buffer;
  @end

  typedef struct EffectMachineGraph {
      AUGraph   graph;
      AudioUnit input;
      AudioUnit lowpass;
      AudioUnit output;
  } EffectMachineGraph;

  @implementation EffectMachine {
      EffectMachineGraph machine;
  }

  -(instancetype)initWithBuffer:(Buffer *)buffer {
      if (self = [super init]) {
          self.buffer = buffer;

          // buffer is a simple wrapper object that holds two properties:
          // a pointer to the array of samples (as doubles) and the size (number of samples)

      }
      return self;
  }

  -(void)process {
      struct EffectMachineGraph initialized = {0};
      machine = initialized;

      CheckError(NewAUGraph(&machine.graph),
                 "NewAUGraph failed");

      AudioComponentDescription outputCD = {0};
      outputCD.componentType = kAudioUnitType_Output;
      outputCD.componentSubType = kAudioUnitSubType_DefaultOutput;
      outputCD.componentManufacturer = kAudioUnitManufacturer_Apple;

      AUNode outputNode;
      CheckError(AUGraphAddNode(machine.graph,
                                &outputCD,
                                &outputNode),
                 "AUGraphAddNode[kAudioUnitSubType_GenericOutput] failed");

      AudioComponentDescription inputCD = {0};
      inputCD.componentType = kAudioUnitType_Generator;
      inputCD.componentSubType = kAudioUnitSubType_ScheduledSoundPlayer;
      inputCD.componentManufacturer = kAudioUnitManufacturer_Apple;

      AUNode inputNode;
      CheckError(AUGraphAddNode(machine.graph,
                                &inputCD,
                                &inputNode),
                 "AUGraphAddNode[kAudioUnitSubType_ScheduledSoundPlayer] failed");

      CheckError(AUGraphOpen(machine.graph),
                 "AUGraphOpen failed");

      CheckError(AUGraphNodeInfo(machine.graph,
                                 inputNode,
                                 NULL,
                                 &machine.input),
                 "AUGraphNodeInfo failed");

      CheckError(AUGraphConnectNodeInput(machine.graph,
                                         inputNode,
                                         0,
                                         outputNode,
                                         0),
                 "AUGraphConnectNodeInput");

      CheckError(AUGraphInitialize(machine.graph),
                 "AUGraphInitialize failed");

      // prepare input

      AudioBufferList ioData = {0};
      ioData.mNumberBuffers = 1;
      ioData.mBuffers[0].mNumberChannels = 1;
      ioData.mBuffers[0].mDataByteSize = (UInt32)(2 * self.buffer.size);
      ioData.mBuffers[0].mData = self.buffer.samples;

      ScheduledAudioSlice slice = {0};
      AudioTimeStamp timeStamp  = {0};

      slice.mTimeStamp    = timeStamp;
      slice.mNumberFrames = (UInt32)self.buffer.size;
      slice.mBufferList   = &ioData;

      CheckError(AudioUnitSetProperty(machine.input,
                                      kAudioUnitProperty_ScheduleAudioSlice,
                                      kAudioUnitScope_Global,
                                      0,
                                      &slice,
                                      sizeof(slice)),
                 "AudioUnitSetProperty[kAudioUnitProperty_ScheduleStartTimeStamp] failed");

      AudioTimeStamp startTimeStamp = {0};
      timeStamp.mFlags = kAudioTimeStampSampleTimeValid;
      timeStamp.mSampleTime = -1;

      CheckError(AudioUnitSetProperty(machine.input,
                                      kAudioUnitProperty_ScheduleStartTimeStamp,
                                      kAudioUnitScope_Global,
                                      0,
                                      &startTimeStamp,
                                      sizeof(startTimeStamp)),
                 "AudioUnitSetProperty[kAudioUnitProperty_ScheduleStartTimeStamp] failed");

      CheckError(AUGraphStart(machine.graph),
                 "AUGraphStart failed");

  //    AUGraphStop(machine.graph);  <-- commented out to make sure it wasn't stopping before playing.
  //    AUGraphUninitialize(machine.graph);
  //    AUGraphClose(machine.graph);

  }

Does anyone know what I am doing wrong here?

Patrick J. Collins
http://collinatorstudios.com

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden


  • Follow-Ups:
    • Re: struggling with the audio unit graph...
      • From: Douglas Scott <email@hidden>
  • Prev by Date: Re: large scale (audio) file I/O on OS X : help or insight requested
  • Next by Date: Re: struggling with the audio unit graph...
  • Previous by thread: another question regarding processing with audio units
  • Next by thread: Re: struggling with the audio unit graph...
  • Index(es):
    • Date
    • Thread