SlideShare une entreprise Scribd logo
1  sur  90
Core Audio in iOS 6
                          Chris Adamson • @invalidname
                                 CocoaConf DC
                                  March 23, 2013



                          Sides and code available on my blog:
                             http://www.subfurther.com/blog

Monday, March 25, 13
Plug!




Monday, March 25, 13
The Reviews Are In!




Monday, March 25, 13
The Reviews Are In!




Monday, March 25, 13
The Reviews Are In!




Monday, March 25, 13
The Reviews Are In!




Monday, March 25, 13
Legitimate copies!
                       •   Amazon (paper or Kindle)
                       •   Barnes & Noble (paper or Nook)
                       •   Apple (iBooks)
                       •   Direct from InformIT (paper, eBook [.epub
                           + .mobi + .pdf], or Bundle)
                           •   35% off with code COREAUDIO3174


Monday, March 25, 13
What You’ll Learn

                       •   What Core Audio does and doesn’t do
                       •   When to use and not use it
                       •   What’s new in Core Audio for iOS 6




Monday, March 25, 13
Monday, March 25, 13
Simple things should be simple,
                       complex things should be possible.
                                    –Alan Kay




Monday, March 25, 13
AV Foundation,
      Media Player

                         Simple things should be simple,
                       complex things should be possible.
                                    –Alan Kay




Monday, March 25, 13
AV Foundation,
      Media Player

                         Simple things should be simple,
                       complex things should be possible.
                                    –Alan Kay
                                                 Core Audio




Monday, March 25, 13
Core Audio

                       •   Low-level C framework for processing
                           audio
                           •   Capture, play-out, real-time or off-line
                               processing
                       •   The “complex things should be possible”
                           part of audio on OS X and iOS



Monday, March 25, 13
Chris’ CA Taxonomy
                       •   Engines: process streams of audio
                           •   Capture, play-out, mixing, effects
                               processing
                       •   Helpers: deal with formats, encodings, etc.
                           •   File I/O, stream I/O, format conversion,
                               iOS “session” management


Monday, March 25, 13
Helpers: Audio File

                       •   Read from / write to multiple audio file
                           types (.aiff, .wav, .caf, .m4a, .mp3) in a
                           content-agnostic way
                       •   Get metadata (data format, duration,
                           iTunes/ID3 info)




Monday, March 25, 13
Helpers: Audio File
                                 Stream

                       •   Read audio from non-random-access
                           source like a network stream
                       •   Discover encoding and encapsulation on
                           the fly, then deliver audio packets to client
                           application




Monday, March 25, 13
Helpers: Converters

                       •   Convert buffers of audio to and from
                           different encodings
                       •   One side must be in an uncompressed
                           format (i.e., Linear PCM)




Monday, March 25, 13
Helpers: ExtAudioFile

                       •   Combine file I/O and format conversion
                       •   Read a compressed file into PCM buffers
                       •   Write PCM buffers into a compressed file




Monday, March 25, 13
Helpers: Audio Session
                       •   iOS-only API to negotiate use of audio
                           resources with the rest of the system
                       •   Deetermine whether your app mixes with
                           other apps’ audio, honors ring/silent
                           switch, can play in background, etc.
                       •   Gets notified of audio interruptions
                       •   See also AVAudioSession


Monday, March 25, 13
Engines: Audio Units

                       •   Low-latency (~10ms) processing of
                           capture/play-out audio data
                       •   Effects, mixing, etc.
                       •   Connect units manually or via an AUGraph
                       •   Much more on this topic momentarily…



Monday, March 25, 13
Engines: Audio Queue
                       •   Convenience API for recording or play-out,
                           built atop audio units
                       •   Rather than processing on-demand and on
                           Core Audio’s thread, your callback provides
                           or receives buffers of audio (at whatever
                           size is convenient to you)
                       •   Higher latency, naturally
                       •   Supports compressed formats (MP3, AAC)


Monday, March 25, 13
Engines: Open AL

                       •   API for 3D spatialized audio, implemented
                           atop audio units
                       •   Set a source’s properties (x/y/z
                           coordinates, orientation, audio buffer, etc.),
                           OpenAL renders what it sounds like to the
                           listener from that location



Monday, March 25, 13
Engines and Helpers
                       •   Audio Units   •   Audio File

                       •   Audio Queue   •   Audio File Stream

                       •   Open AL       •   Audio Converter

                                         •   ExtAudioFile

                                         •   Audio Session




Monday, March 25, 13
Audio Units



Monday, March 25, 13
Audio Unit


                         AUSomething




Monday, March 25, 13
Types of Audio Units
                       •   Output (which also do input)
                       •   Generator
                       •   Converter
                       •   Effect
                       •   Mixer
                       •   Music


Monday, March 25, 13
Pull Model


                        AUSomething




Monday, March 25, 13
Pull Model


                        AUSomething
                                      AudioUnitRender()




Monday, March 25, 13
Pull Model



                       AUSomethingElse   AUSomething




Monday, March 25, 13
Buses (aka, Elements)

                          AUSomethingElse




                                            AUSomething




                          AUSomethingElse




Monday, March 25, 13
AUGraph

                       AUSomethingElse




                                         AUSomething




                       AUSomethingElse




Monday, March 25, 13
Render Callbacks
                OSStatus converterInputRenderCallback (void *inRefCon,
                                                        AudioUnitRenderActionFlags *ioActionFlags,
                                                        const AudioTimeStamp *inTimeStamp,
                                                        UInt32 inBusNumber,
                                                        UInt32 inNumberFrames,
                                                        AudioBufferList * ioData) {
                       CCFWebRadioPlayer *player = (__bridge CCFWebRadioPlayer*) inRefCon;

                       // read from buffer
                       ioData->mBuffers[0].mData = player.preRenderData;

                       return noErr;
                }



                                                                                                     AUSomething




                                                                           AUSomethingElse




Monday, March 25, 13
AURemoteIO
                       •   Output unit used for play-out, capture
                       •   A Core Audio thread repeatedly and
                           automatically calls AudioUnitRender()
                       •   Must set EnableIO property to explicitly
                           enable capture and/or play-out
                           •   Capture requires setting appropriate
                               AudioSession category


Monday, March 25, 13
Create AURemoteIO
      CheckError(NewAUGraph(&_auGraph),
      ! !     "couldn't create au graph");
      !
      CheckError(AUGraphOpen(_auGraph),
      ! !     "couldn't open au graph");
      !
      AudioComponentDescription componentDesc;
      componentDesc.componentType = kAudioUnitType_Output;
      componentDesc.componentSubType = kAudioUnitSubType_RemoteIO;
      componentDesc.componentManufacturer =
                   kAudioUnitManufacturer_Apple;
      !
      AUNode remoteIONode;
      CheckError(AUGraphAddNode(_auGraph,
      ! ! ! ! ! !      &componentDesc,
      ! ! ! ! ! !      &remoteIONode),
      ! !     "couldn't add remote io node");



Monday, March 25, 13
Getting an AudioUnit
                           from AUNode

                !      CheckError(AUGraphNodeInfo(self.auGraph,
                !      ! ! ! ! ! !       remoteIONode,
                !      ! ! ! ! ! !       NULL,
                !      ! ! ! ! ! !       &_remoteIOUnit),
                !      ! !     "couldn't get remote io unit from node");




Monday, March 25, 13
AURemoteIO Buses


                            AURemoteIO




Monday, March 25, 13
AURemoteIO Buses


                            AURemoteIO
                                              bus 0
                                         to output H/W




Monday, March 25, 13
AURemoteIO Buses


                            AURemoteIO
        bus 0                                 bus 0
      from app                           to output H/W




Monday, March 25, 13
AURemoteIO Buses

     bus 1
from input H/W
                            AURemoteIO
        bus 0                                 bus 0
      from app                           to output H/W




Monday, March 25, 13
AURemoteIO Buses

     bus 1                                   bus 1
from input H/W                              to app
                            AURemoteIO
        bus 0                                 bus 0
      from app                           to output H/W




Monday, March 25, 13
EnableIO
         !    UInt32 oneFlag = 1;
         !    UInt32 busZero = 0;
         !    CheckError(AudioUnitSetProperty(self.remoteIOUnit,
         !    ! ! ! ! ! ! ! ! kAudioOutputUnitProperty_EnableIO,
         !    ! ! ! ! ! ! ! ! kAudioUnitScope_Output,
         !    ! ! ! ! ! ! ! ! busZero,
         !    ! ! ! ! ! ! ! ! &oneFlag,
         !    ! ! ! ! ! ! ! ! sizeof(oneFlag)),
         !    ! !     "couldn't enable remote io output");
         !    UInt32 busOne = 1;
         !    CheckError(AudioUnitSetProperty(self.remoteIOUnit,
         !    ! ! ! ! ! ! ! ! kAudioOutputUnitProperty_EnableIO,
         !    ! ! ! ! ! ! ! ! kAudioUnitScope_Input,
         !    ! ! ! ! ! ! ! ! busOne,
         !    ! ! ! ! ! ! ! ! &oneFlag,
         !    ! ! ! ! ! ! ! ! sizeof(oneFlag)),
         !    ! !     "couldn't enable remote io input");



Monday, March 25, 13
Pass Through

                            bus 1
                       from input H/W
                                        AURemoteIO
                                                          bus 0
                                                     to output H/W




Monday, March 25, 13
Connect In to Out
            !    UInt32 busZero = 0;
            !    UInt32 busOne = 1;
            !    CheckError(AUGraphConnectNodeInput(self.auGraph,
            !    ! ! ! ! ! ! ! !        remoteIONode,
            !    ! ! ! ! ! ! ! !        busOne,
            !    ! ! ! ! ! ! ! !        remoteIONode,
            !    ! ! ! ! ! ! ! !        busZero),
            !    ! !     "couldn't connect remote io bus 1 to 0");




Monday, March 25, 13
Pass-Through with Effect

                                         AUEffect




                            bus 1
                       from input H/W
                                        AURemoteIO
                                                          bus 0
                                                     to output H/W



Monday, March 25, 13
Demo: Delay Effect
                             New in iOS 6!




Monday, March 25, 13
Creating the AUDelay
      ! componentDesc.componentType = kAudioUnitType_Effect;
      ! componentDesc.componentSubType = kAudioUnitSubType_Delay;
      ! componentDesc.componentManufacturer =
                 kAudioUnitManufacturer_Apple;
      !
      ! AUNode effectNode;
      ! CheckError(AUGraphAddNode(self.auGraph,
      ! ! ! ! ! ! !      &componentDesc,
      ! ! ! ! ! ! !      &effectNode),
      ! ! !     "couldn't create effect node");
      ! AudioUnit effectUnit;
      ! CheckError(AUGraphNodeInfo(self.auGraph,
      ! ! ! ! ! ! !        effectNode,
      ! ! ! ! ! ! !        NULL,
      ! ! ! ! ! ! !        &effectUnit),
      ! ! !     "couldn't get effect unit from node");



Monday, March 25, 13
The problem with effect
                           units
                       •   Audio Units available since iPhone OS 2.0
                           prefer int formats
                       •   Effect units arrived with iOS 5 (arm7 era)
                           and only work with float format
                       •   Have to set the AUEffect unit’s format on
                           AURemoteIO



Monday, March 25, 13
Setting formats
       !    AudioStreamBasicDescription effectDataFormat;
       !    UInt32 propSize = sizeof (effectDataFormat);
       !    CheckError(AudioUnitGetProperty(effectUnit,
       !    ! ! ! ! ! ! ! ! kAudioUnitProperty_StreamFormat,
       !    ! ! ! ! ! ! ! ! kAudioUnitScope_Output,
       !    ! ! ! ! ! ! ! ! busZero,
       !    ! ! ! ! ! ! ! ! &effectDataFormat,
       !    ! ! ! ! ! ! ! ! &propSize),
       !    ! !     "couldn't read effect format");
       !    CheckError(AudioUnitSetProperty(self.remoteIOUnit,
       !    ! ! ! ! ! ! ! ! kAudioUnitProperty_StreamFormat,
       !    ! ! ! ! ! ! ! ! kAudioUnitScope_Output,
       !    ! ! ! ! ! ! ! ! busOne,
       !    ! ! ! ! ! ! ! ! &effectDataFormat,
       !    ! ! ! ! ! ! ! ! propSize),
       !    ! !     "couldn't set bus one output format");

           Then repeat AudioUnitSetProperty() for input scope / bus 0
Monday, March 25, 13
AUNewTimePitch

                       •   New in iOS 6!
                       •   Allows you to change pitch independent of
                           time, or time independent of pitch
                       •   How do you use it?




Monday, March 25, 13
AUTimePitch
   !   AudioComponentDescription effectcd = {0};
   !   effectcd.componentType = kAudioUnitType_FormatConverter;
   !   effectcd.componentSubType = kAudioUnitSubType_NewTimePitch;
   !   effectcd.componentManufacturer = kAudioUnitManufacturer_Apple;
   !
   !   AUNode effectNode;
   !   CheckError(AUGraphAddNode(self.auGraph,
   !   ! ! ! ! ! !       &effectcd,
   !   ! ! ! ! ! !       &effectNode),
   !   ! !      "couldn't get effect node [time/pitch]");




        Notice the type is AUFormatConverter, not AUEffect
Monday, March 25, 13
AudioUnitParameters.h
                   // Parameters for AUNewTimePitch
                   enum {
                   ! ! // Global, rate, 1/32 -> 32.0, 1.0
                   ! kNewTimePitchParam_Rate! ! ! ! ! ! =
                                            !                  0,
                   ! ! // Global, Cents, -2400 -> 2400, 1.0
                   ! kNewTimePitchParam_Pitch! ! ! ! ! ! =     1,
                   ! ! // Global, generic, 3.0 -> 32.0, 8.0
                   ! kNewTimePitchParam_Overlap! ! ! ! ! !     = 4,
                   ! ! // Global, Boolean, 0->1, 1
                   ! kNewTimePitchParam_EnablePeakLocking! !   ! = 6
                   };



  This is the entire documentation for the AUNewTimePitch parameters


Monday, March 25, 13
AUNewTimePitch
                                 parameters
                       •   Rate: kNewTimePitchParam_Rate takes a
                           Float32 rate from 1/32 speed to 32x
                           speed.
                           •   Use powers of 2: 1/32, 1/16, …, 2, 4, 8…
                       •   Pitch: kNewTimePitchParam_Pitch takes
                           a Float32 representing cents, meaning
                           1/100 of a musical semitone


Monday, March 25, 13
Pitch shifting


                       •   Pitch can vary, time does not
                       •   Suitable for real-time sources, such as
                           audio capture




Monday, March 25, 13
Demo: Pitch Shift
                            New in iOS 6!




Monday, March 25, 13
Rate shifting
                       •   Rate can vary, pitch does not
                           •   Think of 1.5x and 2x speed modes in
                               Podcasts app
                       •   Not suitable for real-time sources, as data
                           will be consumed faster. Files work well.
                           •   Sources must be able to map time
                               systems with
                               kAudioUnitProperty_InputSamplesInOutput


Monday, March 25, 13
Demo: Rate Shift
                            New in iOS 6!




Monday, March 25, 13
AUSplitter

                                          AUSomethingElse




                       AUSplitter



                                          AUSomethingElse




                                New in iOS 6!
Monday, March 25, 13
AUMatrixMixer
                       AUSomethingElse



                                                            AUSomethingElse




                       AUSomethingElse      AUMatrixMixer



                                                            AUSomethingElse




                       AUSomethingElse




                                         New in iOS 6!
Monday, March 25, 13
Audio Queues
                       (and the APIs that help them)




Monday, March 25, 13
AudioQueue
                       •   Easier than AURemoteIO - provide data
                           when you want to, less time pressure, can
                           accept or provide compressed formats
                           (MP3, AAC)
                       •   Recording queue - receive buffers of
                           captured audio in a callback
                       •   Play-out queue - enqueue buffers of audio
                           to play, optionally refill in a callback


Monday, March 25, 13
AudioQueue


                          2   1   0




Monday, March 25, 13
Common AQ scenarios
                       •   File player - Read from file and “prime”
                           queue buffers, start queue, when called
                           back with used buffer, refill from next part
                           of file
                       •   Synthesis - Maintain state in your own
                           code, write raw samples into buffers during
                           callbacks


Monday, March 25, 13
Web Radio
                       •   Project from CocoaConfs Columbus,
                           Portland, and Raleigh
                       •   Use Audio File Stream Services to pick out
                           audio data from a network stream
                       •   Enqueue these packets as new AQ buffers
                       •   Dispose used buffers in callback


Monday, March 25, 13
Parsing web radio




Monday, March 25, 13
Parsing web radio
   NSURLConnection delivers
   NSData buffers, containing audio
   and framing info. We pass it to              NSData                 NSData
   Audio File Services.               Packets      Packets   Packets   Packets   Packets




Monday, March 25, 13
Parsing web radio
   NSURLConnection delivers
   NSData buffers, containing audio
   and framing info. We pass it to                NSData                         NSData
   Audio File Services.                 Packets        Packets         Packets   Packets   Packets




                                        Packets   Packets
   Audio File Services calls us back
   with parsed packets of audio data.   Packets   Packets    Packets




Monday, March 25, 13
Parsing web radio
   NSURLConnection delivers
   NSData buffers, containing audio
   and framing info. We pass it to                NSData                                  NSData
   Audio File Services.                 Packets        Packets              Packets       Packets   Packets




                                        Packets   Packets
   Audio File Services calls us back
   with parsed packets of audio data.   Packets   Packets       Packets




 We create an AudioQueueBuffer
                                                   Packets                      Packets
 with those packets and enqueue it                   Packets
                                                       2          Packets
                                                                    1              0
 for play-out.
                                                      Packets                   Packets




Monday, March 25, 13
A complex thing!

                       •   What if we want to see that data after it’s
                           been decoded to PCM and is about to be
                           played?
                           •   e.g., spectrum analysis, effects, visualizers
                       •   AudioQueue design is “fire-and-forget”



Monday, March 25, 13
AudioQueue Tap!




                       http://www.last.fm/music/Spinal+Tap
Monday, March 25, 13
AudioQueueProcessingTap

                       •   Set as a property on the Audio Queue
                       •   Calls back to your function with decoded
                           (PCM) audio data
                       •   Three types: pre- or post- effects (that the
                           AQ performs), or siphon. First two can
                           modify the data.
                       •   Only documentation is in AudioQueue.h


Monday, March 25, 13
Creating an AQ Tap
   !    !      // create the tap
   !    !      UInt32 maxFrames = 0;
   !    !      AudioStreamBasicDescription tapFormat = {0};
   !    !      AudioQueueProcessingTapRef tapRef;
   !    !      CheckError(AudioQueueProcessingTapNew(audioQueue,
   !    !      ! ! ! ! ! ! ! ! !       tapProc,
   !    !      ! ! ! ! ! ! ! ! !       (__bridge void *)(player),
   !    !      ! ! ! ! ! ! ! ! !       kAudioQueueProcessingTap_PreEffects,
   !    !      ! ! ! ! ! ! ! ! !       &maxFrames,
   !    !      ! ! ! ! ! ! ! ! !       &tapFormat,
   !    !      ! ! ! ! ! ! ! ! !       &tapRef),
   !    !      ! !     "couldn't create AQ tap");



            Notice that you receive maxFrames and tapFormat. These do not appear to be settable.


Monday, March 25, 13
AQ Tap Proc
       void tapProc (void *                            inClientData,
       ! ! !     AudioQueueProcessingTapRef       inAQTap,
       ! ! !     UInt32                           inNumberFrames,
       ! ! !     AudioTimeStamp *                 ioTimeStamp,
       ! ! !     UInt32 *                         ioFlags,
       ! ! !     UInt32 *                         outNumberFrames,
       ! ! !     AudioBufferList *                ioData) {
       ! CCFWebRadioPlayer *player =
               (__bridge CCFWebRadioPlayer*) inClientData;
       ! UInt32 getSourceFlags = 0;
       ! UInt32 getSourceFrames = 0;
       ! AudioQueueProcessingTapGetSourceAudio(inAQTap,
       ! ! ! ! ! ! ! ! ! !         inNumberFrames,
       ! ! ! ! ! ! ! ! ! !         ioTimeStamp,
       ! ! ! ! ! ! ! ! ! !         &getSourceFlags,
       ! ! ! ! ! ! ! ! ! !         &getSourceFrames,
       ! ! ! ! ! ! ! ! ! !         ioData);
         // then do something with ioData
         // ...
Monday, March 25, 13
So what should we do
                          with the audio?




Monday, March 25, 13
So what should we do
                          with the audio?


                         Let’s apply our pitch-shift effect




Monday, March 25, 13
Shouldn’t this work?


                              AUEffect




Monday, March 25, 13
Shouldn’t this work?


                              AUEffect
                                         AudioUnitRender()




Monday, March 25, 13
AudioUnitRender()
                       •   Last argument is an AudioBufferList, whose
                           AudioBuffer members have mData pointers
                           •   If mData != NULL, audio unit does its
                               thing with those samples
                           •   If mData == NULL, audio data pulls from
                               whatever it’s connected to
                       •   So we just call with AudioBufferList ioData
                           we got from tap callback, right?


Monday, March 25, 13
Psych!

                       •   AQ tap provides data as signed ints
                       •   Effect units only work with floating point
                       •   We need to do an on-the-spot format
                           conversion




Monday, March 25, 13
invalidname’s convert-
                          and-effect recipe
                        OSStatus converterInputRenderCallback (void *inRefCon,
                                                                AudioUnitRenderActionFlags *ioActionFlags,
                                                                const AudioTimeStamp *inTimeStamp,
                                                                UInt32 inBusNumber,
                                                                UInt32 inNumberFrames,
                                                                AudioBufferList * ioData) {
                               CCFWebRadioPlayer *player = (__bridge CCFWebRadioPlayer*) inRefCon;

                              // read from buffer
                              ioData->mBuffers[0].mData = player.preRenderData;

                              return noErr;
                        }




                                 AUConverter                               AUEffect                          AUConverter   AUGenericOutput




               Note: red arrows are float format, yellow arrows are int

Monday, March 25, 13
How it works

                       •   AUGraph: AUConverter → AUEffect →
                           AUConverter → AUGenericOutput
                       •   Top AUConverter is connected to a render
                           callback function




Monday, March 25, 13
The trick!
                       •   Copy mData pointer to a state variable and
                           NULL it in ioData
                       •   Call AudioQueueRender() on output unit.
                           The NULL makes it pull from the graph.
                       •   Top of the graph pulls on render callback,
                           which gives it back the mData we copied
                           off.


Monday, March 25, 13
Yes, really
                          This is the rest of tapProc()
                ! // copy off the ioData so the graph can read from it
                  // in render callback
                ! player.preRenderData = ioData->mBuffers[0].mData;
                ! ioData->mBuffers[0].mData = NULL;
                !
                ! OSStatus renderErr = noErr;
                ! AudioUnitRenderActionFlags actionFlags = 0;
                ! renderErr = AudioUnitRender(player.genericOutputUnit,
                ! ! ! ! ! ! ! ! &actionFlags,
                ! ! ! ! ! ! ! ! player.renderTimeStamp,
                ! ! ! ! ! ! ! ! 0,
                ! ! ! ! ! ! ! ! inNumberFrames,
                ! ! ! ! ! ! ! ! ioData);
                ! NSLog (@"AudioUnitRender, renderErr = %ld",renderErr);
                }
Monday, March 25, 13
Yes, really
           This is the render callback that supplies data to the int→float converter

    OSStatus converterInputRenderCallback (void *inRefCon,
    ! ! ! ! ! ! ! ! !        AudioUnitRenderActionFlags *ioActionFlags,
    ! ! ! ! ! ! ! ! !        const AudioTimeStamp *inTimeStamp,
    ! ! ! ! ! ! ! ! !        UInt32 inBusNumber,
    ! ! ! ! ! ! ! ! !        UInt32 inNumberFrames,
    ! ! ! ! ! ! ! ! !        AudioBufferList * ioData) {
    ! CCFWebRadioPlayer *player =
                   (__bridge CCFWebRadioPlayer*) inRefCon;
    !
    ! // read from buffer
    ! ioData->mBuffers[0].mData = player.preRenderData;

    ! return noErr;
    }


Monday, March 25, 13
Demo: AQ Tap +
                       AUNewTimePitch
                            New in iOS 6!




Monday, March 25, 13
Monday, March 25, 13
Other new stuff



Monday, March 25, 13
Multi-Route
                       •   Ordinarily, one input or output is active:
                           earpiece, speaker, headphones, dock-
                           connected device
                           •   “Last in wins”
                       •   With AV Session “multi-route” category,
                           you can use several at once
                       •   WWDC 2012 session 505


Monday, March 25, 13
Utility classes moved
                                   again
                       •   C++ utilities, including the CARingBuffer
                           •   < Xcode 4.3, installed into /Developer
                           •   Xcode 4.3-4.4, optional download from
                               developer.apple.com
                           •   ≧ Xcode 4.5, sample code project “Core
                               Audio Utility Classes”


Monday, March 25, 13
Takeaways
                       •   Core Audio fundamentals never change
                       •   New stuff is added as properties, typedefs,
                           enums, etc.
                       •   Watch the SDK API diffs document to find
                           the new stuff
                       •   Hope you like header files and
                           experimentation


Monday, March 25, 13
Q&A
                       •   Slides will be posted to slideshare.net/
                           invalidname
                       •   Code will be linked from there and my blog
                       •   Watch CocoaConf glassboard,
                           @invalidname on Twitter/ADN, or [Time
                           code]; blog for announcement
                       •   Thanks!


Monday, March 25, 13

Contenu connexe

Tendances

Get On The Audiobus (CocoaConf Boston, October 2013)
Get On The Audiobus (CocoaConf Boston, October 2013)Get On The Audiobus (CocoaConf Boston, October 2013)
Get On The Audiobus (CocoaConf Boston, October 2013)Chris Adamson
 
Lua and adaptive audio - Don Veca (Activision)
Lua and adaptive audio - Don Veca (Activision)Lua and adaptive audio - Don Veca (Activision)
Lua and adaptive audio - Don Veca (Activision)Kore VM
 
How To Do A Podcast - Bsides RI 2013
How To Do A Podcast - Bsides RI 2013How To Do A Podcast - Bsides RI 2013
How To Do A Podcast - Bsides RI 2013Security Weekly
 
ALA Alex
ALA AlexALA Alex
ALA Alexabelden
 
Media hardware
Media hardwareMedia hardware
Media hardwarecoralprout
 

Tendances (6)

Get On The Audiobus (CocoaConf Boston, October 2013)
Get On The Audiobus (CocoaConf Boston, October 2013)Get On The Audiobus (CocoaConf Boston, October 2013)
Get On The Audiobus (CocoaConf Boston, October 2013)
 
Lua and adaptive audio - Don Veca (Activision)
Lua and adaptive audio - Don Veca (Activision)Lua and adaptive audio - Don Veca (Activision)
Lua and adaptive audio - Don Veca (Activision)
 
How To Do A Podcast - Bsides RI 2013
How To Do A Podcast - Bsides RI 2013How To Do A Podcast - Bsides RI 2013
How To Do A Podcast - Bsides RI 2013
 
ALA Alex
ALA AlexALA Alex
ALA Alex
 
Media hardware
Media hardwareMedia hardware
Media hardware
 
Now all can shuffle
Now all can shuffleNow all can shuffle
Now all can shuffle
 

Similaire à Core Audio in iOS 6 - What You'll Learn

Core Audio in iOS 6 (CocoaConf Raleigh, Dec. '12)
Core Audio in iOS 6 (CocoaConf Raleigh, Dec. '12)Core Audio in iOS 6 (CocoaConf Raleigh, Dec. '12)
Core Audio in iOS 6 (CocoaConf Raleigh, Dec. '12)Chris Adamson
 
Core Audio Cranks It Up
Core Audio Cranks It UpCore Audio Cranks It Up
Core Audio Cranks It UpChris Adamson
 
Integrating Voice Through Adhearsion
Integrating Voice Through AdhearsionIntegrating Voice Through Adhearsion
Integrating Voice Through AdhearsionMojo Lingo
 
Introduction to AV Foundation (CocoaConf, Aug '11)
Introduction to AV Foundation (CocoaConf, Aug '11)Introduction to AV Foundation (CocoaConf, Aug '11)
Introduction to AV Foundation (CocoaConf, Aug '11)Chris Adamson
 
Audio file format in computer graphic
Audio file format in computer graphicAudio file format in computer graphic
Audio file format in computer graphicIrfan Khan
 
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)Chris Adamson
 
Confrontation Audio GDC 2009
Confrontation Audio GDC 2009Confrontation Audio GDC 2009
Confrontation Audio GDC 2009slantsixgames
 
IG2 Task 1 Work Sheet
IG2 Task 1 Work SheetIG2 Task 1 Work Sheet
IG2 Task 1 Work Sheetwallinplanet
 
introduction to audio formats - Multimedia Students
introduction to audio formats - Multimedia Studentsintroduction to audio formats - Multimedia Students
introduction to audio formats - Multimedia StudentsSEO SKills
 
U9 p2-elena and lucía.doc
U9 p2-elena and lucía.docU9 p2-elena and lucía.doc
U9 p2-elena and lucía.doclusss
 
Jordan smith ig2 task 1 revisited v2
Jordan smith ig2 task 1 revisited v2Jordan smith ig2 task 1 revisited v2
Jordan smith ig2 task 1 revisited v2JordanSmith96
 
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)Chris Adamson
 
SCA Accessioning Born-Digital Materials Workshop, Nov. 8, 2012
SCA Accessioning Born-Digital Materials Workshop, Nov. 8, 2012SCA Accessioning Born-Digital Materials Workshop, Nov. 8, 2012
SCA Accessioning Born-Digital Materials Workshop, Nov. 8, 2012peterchanws
 
Accessioning Born-Digital Materials
Accessioning Born-Digital MaterialsAccessioning Born-Digital Materials
Accessioning Born-Digital Materialspeterchanws
 
Using Audio & Video in the Library
Using Audio & Video in the LibraryUsing Audio & Video in the Library
Using Audio & Video in the LibraryMichael Sauers
 

Similaire à Core Audio in iOS 6 - What You'll Learn (20)

Core Audio in iOS 6 (CocoaConf Raleigh, Dec. '12)
Core Audio in iOS 6 (CocoaConf Raleigh, Dec. '12)Core Audio in iOS 6 (CocoaConf Raleigh, Dec. '12)
Core Audio in iOS 6 (CocoaConf Raleigh, Dec. '12)
 
Core Audio Cranks It Up
Core Audio Cranks It UpCore Audio Cranks It Up
Core Audio Cranks It Up
 
Integrating Voice Through Adhearsion
Integrating Voice Through AdhearsionIntegrating Voice Through Adhearsion
Integrating Voice Through Adhearsion
 
Introduction to AV Foundation (CocoaConf, Aug '11)
Introduction to AV Foundation (CocoaConf, Aug '11)Introduction to AV Foundation (CocoaConf, Aug '11)
Introduction to AV Foundation (CocoaConf, Aug '11)
 
Audio file format in computer graphic
Audio file format in computer graphicAudio file format in computer graphic
Audio file format in computer graphic
 
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
 
Processing
ProcessingProcessing
Processing
 
Confrontation Audio GDC 2009
Confrontation Audio GDC 2009Confrontation Audio GDC 2009
Confrontation Audio GDC 2009
 
IG2 Task 1 Work Sheet
IG2 Task 1 Work SheetIG2 Task 1 Work Sheet
IG2 Task 1 Work Sheet
 
introduction to audio formats - Multimedia Students
introduction to audio formats - Multimedia Studentsintroduction to audio formats - Multimedia Students
introduction to audio formats - Multimedia Students
 
Call audio
Call audioCall audio
Call audio
 
Sound recording glossary
Sound recording glossarySound recording glossary
Sound recording glossary
 
Sound recording glossary
Sound recording glossarySound recording glossary
Sound recording glossary
 
U9 p2-elena and lucía.doc
U9 p2-elena and lucía.docU9 p2-elena and lucía.doc
U9 p2-elena and lucía.doc
 
Psa podcasting video_2014
Psa podcasting video_2014Psa podcasting video_2014
Psa podcasting video_2014
 
Jordan smith ig2 task 1 revisited v2
Jordan smith ig2 task 1 revisited v2Jordan smith ig2 task 1 revisited v2
Jordan smith ig2 task 1 revisited v2
 
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
 
SCA Accessioning Born-Digital Materials Workshop, Nov. 8, 2012
SCA Accessioning Born-Digital Materials Workshop, Nov. 8, 2012SCA Accessioning Born-Digital Materials Workshop, Nov. 8, 2012
SCA Accessioning Born-Digital Materials Workshop, Nov. 8, 2012
 
Accessioning Born-Digital Materials
Accessioning Born-Digital MaterialsAccessioning Born-Digital Materials
Accessioning Born-Digital Materials
 
Using Audio & Video in the Library
Using Audio & Video in the LibraryUsing Audio & Video in the Library
Using Audio & Video in the Library
 

Plus de Chris Adamson

Whatever Happened to Visual Novel Anime? (AWA/Youmacon 2018)
Whatever Happened to Visual Novel Anime? (AWA/Youmacon 2018)Whatever Happened to Visual Novel Anime? (AWA/Youmacon 2018)
Whatever Happened to Visual Novel Anime? (AWA/Youmacon 2018)Chris Adamson
 
Whatever Happened to Visual Novel Anime? (JAFAX 2018)
Whatever Happened to Visual Novel Anime? (JAFAX 2018)Whatever Happened to Visual Novel Anime? (JAFAX 2018)
Whatever Happened to Visual Novel Anime? (JAFAX 2018)Chris Adamson
 
Media Frameworks Versus Swift (Swift by Northwest, October 2017)
Media Frameworks Versus Swift (Swift by Northwest, October 2017)Media Frameworks Versus Swift (Swift by Northwest, October 2017)
Media Frameworks Versus Swift (Swift by Northwest, October 2017)Chris Adamson
 
Fall Premieres: Media Frameworks in iOS 11, macOS 10.13, and tvOS 11 (CocoaCo...
Fall Premieres: Media Frameworks in iOS 11, macOS 10.13, and tvOS 11 (CocoaCo...Fall Premieres: Media Frameworks in iOS 11, macOS 10.13, and tvOS 11 (CocoaCo...
Fall Premieres: Media Frameworks in iOS 11, macOS 10.13, and tvOS 11 (CocoaCo...Chris Adamson
 
CocoaConf Chicago 2017: Media Frameworks and Swift: This Is Fine
CocoaConf Chicago 2017: Media Frameworks and Swift: This Is FineCocoaConf Chicago 2017: Media Frameworks and Swift: This Is Fine
CocoaConf Chicago 2017: Media Frameworks and Swift: This Is FineChris Adamson
 
Forward Swift 2017: Media Frameworks and Swift: This Is Fine
Forward Swift 2017: Media Frameworks and Swift: This Is FineForward Swift 2017: Media Frameworks and Swift: This Is Fine
Forward Swift 2017: Media Frameworks and Swift: This Is FineChris Adamson
 
Firebase: Totally Not Parse All Over Again (Unless It Is) (CocoaConf San Jose...
Firebase: Totally Not Parse All Over Again (Unless It Is) (CocoaConf San Jose...Firebase: Totally Not Parse All Over Again (Unless It Is) (CocoaConf San Jose...
Firebase: Totally Not Parse All Over Again (Unless It Is) (CocoaConf San Jose...Chris Adamson
 
Building A Streaming Apple TV App (CocoaConf San Jose, Nov 2016)
Building A Streaming Apple TV App (CocoaConf San Jose, Nov 2016)Building A Streaming Apple TV App (CocoaConf San Jose, Nov 2016)
Building A Streaming Apple TV App (CocoaConf San Jose, Nov 2016)Chris Adamson
 
Firebase: Totally Not Parse All Over Again (Unless It Is)
Firebase: Totally Not Parse All Over Again (Unless It Is)Firebase: Totally Not Parse All Over Again (Unless It Is)
Firebase: Totally Not Parse All Over Again (Unless It Is)Chris Adamson
 
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)Chris Adamson
 
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)Chris Adamson
 
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)Chris Adamson
 
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...Chris Adamson
 
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014Chris Adamson
 
Stupid Video Tricks, CocoaConf Seattle 2014
Stupid Video Tricks, CocoaConf Seattle 2014Stupid Video Tricks, CocoaConf Seattle 2014
Stupid Video Tricks, CocoaConf Seattle 2014Chris Adamson
 
Stupid Video Tricks, CocoaConf Las Vegas
Stupid Video Tricks, CocoaConf Las VegasStupid Video Tricks, CocoaConf Las Vegas
Stupid Video Tricks, CocoaConf Las VegasChris Adamson
 
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)Chris Adamson
 
Stupid Video Tricks (CocoaConf DC, March 2014)
Stupid Video Tricks (CocoaConf DC, March 2014)Stupid Video Tricks (CocoaConf DC, March 2014)
Stupid Video Tricks (CocoaConf DC, March 2014)Chris Adamson
 
Introduction to the Roku SDK
Introduction to the Roku SDKIntroduction to the Roku SDK
Introduction to the Roku SDKChris Adamson
 

Plus de Chris Adamson (20)

Whatever Happened to Visual Novel Anime? (AWA/Youmacon 2018)
Whatever Happened to Visual Novel Anime? (AWA/Youmacon 2018)Whatever Happened to Visual Novel Anime? (AWA/Youmacon 2018)
Whatever Happened to Visual Novel Anime? (AWA/Youmacon 2018)
 
Whatever Happened to Visual Novel Anime? (JAFAX 2018)
Whatever Happened to Visual Novel Anime? (JAFAX 2018)Whatever Happened to Visual Novel Anime? (JAFAX 2018)
Whatever Happened to Visual Novel Anime? (JAFAX 2018)
 
Media Frameworks Versus Swift (Swift by Northwest, October 2017)
Media Frameworks Versus Swift (Swift by Northwest, October 2017)Media Frameworks Versus Swift (Swift by Northwest, October 2017)
Media Frameworks Versus Swift (Swift by Northwest, October 2017)
 
Fall Premieres: Media Frameworks in iOS 11, macOS 10.13, and tvOS 11 (CocoaCo...
Fall Premieres: Media Frameworks in iOS 11, macOS 10.13, and tvOS 11 (CocoaCo...Fall Premieres: Media Frameworks in iOS 11, macOS 10.13, and tvOS 11 (CocoaCo...
Fall Premieres: Media Frameworks in iOS 11, macOS 10.13, and tvOS 11 (CocoaCo...
 
CocoaConf Chicago 2017: Media Frameworks and Swift: This Is Fine
CocoaConf Chicago 2017: Media Frameworks and Swift: This Is FineCocoaConf Chicago 2017: Media Frameworks and Swift: This Is Fine
CocoaConf Chicago 2017: Media Frameworks and Swift: This Is Fine
 
Forward Swift 2017: Media Frameworks and Swift: This Is Fine
Forward Swift 2017: Media Frameworks and Swift: This Is FineForward Swift 2017: Media Frameworks and Swift: This Is Fine
Forward Swift 2017: Media Frameworks and Swift: This Is Fine
 
Firebase: Totally Not Parse All Over Again (Unless It Is) (CocoaConf San Jose...
Firebase: Totally Not Parse All Over Again (Unless It Is) (CocoaConf San Jose...Firebase: Totally Not Parse All Over Again (Unless It Is) (CocoaConf San Jose...
Firebase: Totally Not Parse All Over Again (Unless It Is) (CocoaConf San Jose...
 
Building A Streaming Apple TV App (CocoaConf San Jose, Nov 2016)
Building A Streaming Apple TV App (CocoaConf San Jose, Nov 2016)Building A Streaming Apple TV App (CocoaConf San Jose, Nov 2016)
Building A Streaming Apple TV App (CocoaConf San Jose, Nov 2016)
 
Firebase: Totally Not Parse All Over Again (Unless It Is)
Firebase: Totally Not Parse All Over Again (Unless It Is)Firebase: Totally Not Parse All Over Again (Unless It Is)
Firebase: Totally Not Parse All Over Again (Unless It Is)
 
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
 
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
 
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
 
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
 
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
 
Stupid Video Tricks, CocoaConf Seattle 2014
Stupid Video Tricks, CocoaConf Seattle 2014Stupid Video Tricks, CocoaConf Seattle 2014
Stupid Video Tricks, CocoaConf Seattle 2014
 
Stupid Video Tricks, CocoaConf Las Vegas
Stupid Video Tricks, CocoaConf Las VegasStupid Video Tricks, CocoaConf Las Vegas
Stupid Video Tricks, CocoaConf Las Vegas
 
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
 
Stupid Video Tricks (CocoaConf DC, March 2014)
Stupid Video Tricks (CocoaConf DC, March 2014)Stupid Video Tricks (CocoaConf DC, March 2014)
Stupid Video Tricks (CocoaConf DC, March 2014)
 
Stupid Video Tricks
Stupid Video TricksStupid Video Tricks
Stupid Video Tricks
 
Introduction to the Roku SDK
Introduction to the Roku SDKIntroduction to the Roku SDK
Introduction to the Roku SDK
 

Dernier

What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 

Dernier (20)

What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 

Core Audio in iOS 6 - What You'll Learn

  • 1. Core Audio in iOS 6 Chris Adamson • @invalidname CocoaConf DC March 23, 2013 Sides and code available on my blog: http://www.subfurther.com/blog Monday, March 25, 13
  • 3. The Reviews Are In! Monday, March 25, 13
  • 4. The Reviews Are In! Monday, March 25, 13
  • 5. The Reviews Are In! Monday, March 25, 13
  • 6. The Reviews Are In! Monday, March 25, 13
  • 7. Legitimate copies! • Amazon (paper or Kindle) • Barnes & Noble (paper or Nook) • Apple (iBooks) • Direct from InformIT (paper, eBook [.epub + .mobi + .pdf], or Bundle) • 35% off with code COREAUDIO3174 Monday, March 25, 13
  • 8. What You’ll Learn • What Core Audio does and doesn’t do • When to use and not use it • What’s new in Core Audio for iOS 6 Monday, March 25, 13
  • 10. Simple things should be simple, complex things should be possible. –Alan Kay Monday, March 25, 13
  • 11. AV Foundation, Media Player Simple things should be simple, complex things should be possible. –Alan Kay Monday, March 25, 13
  • 12. AV Foundation, Media Player Simple things should be simple, complex things should be possible. –Alan Kay Core Audio Monday, March 25, 13
  • 13. Core Audio • Low-level C framework for processing audio • Capture, play-out, real-time or off-line processing • The “complex things should be possible” part of audio on OS X and iOS Monday, March 25, 13
  • 14. Chris’ CA Taxonomy • Engines: process streams of audio • Capture, play-out, mixing, effects processing • Helpers: deal with formats, encodings, etc. • File I/O, stream I/O, format conversion, iOS “session” management Monday, March 25, 13
  • 15. Helpers: Audio File • Read from / write to multiple audio file types (.aiff, .wav, .caf, .m4a, .mp3) in a content-agnostic way • Get metadata (data format, duration, iTunes/ID3 info) Monday, March 25, 13
  • 16. Helpers: Audio File Stream • Read audio from non-random-access source like a network stream • Discover encoding and encapsulation on the fly, then deliver audio packets to client application Monday, March 25, 13
  • 17. Helpers: Converters • Convert buffers of audio to and from different encodings • One side must be in an uncompressed format (i.e., Linear PCM) Monday, March 25, 13
  • 18. Helpers: ExtAudioFile • Combine file I/O and format conversion • Read a compressed file into PCM buffers • Write PCM buffers into a compressed file Monday, March 25, 13
  • 19. Helpers: Audio Session • iOS-only API to negotiate use of audio resources with the rest of the system • Deetermine whether your app mixes with other apps’ audio, honors ring/silent switch, can play in background, etc. • Gets notified of audio interruptions • See also AVAudioSession Monday, March 25, 13
  • 20. Engines: Audio Units • Low-latency (~10ms) processing of capture/play-out audio data • Effects, mixing, etc. • Connect units manually or via an AUGraph • Much more on this topic momentarily… Monday, March 25, 13
  • 21. Engines: Audio Queue • Convenience API for recording or play-out, built atop audio units • Rather than processing on-demand and on Core Audio’s thread, your callback provides or receives buffers of audio (at whatever size is convenient to you) • Higher latency, naturally • Supports compressed formats (MP3, AAC) Monday, March 25, 13
  • 22. Engines: Open AL • API for 3D spatialized audio, implemented atop audio units • Set a source’s properties (x/y/z coordinates, orientation, audio buffer, etc.), OpenAL renders what it sounds like to the listener from that location Monday, March 25, 13
  • 23. Engines and Helpers • Audio Units • Audio File • Audio Queue • Audio File Stream • Open AL • Audio Converter • ExtAudioFile • Audio Session Monday, March 25, 13
  • 25. Audio Unit AUSomething Monday, March 25, 13
  • 26. Types of Audio Units • Output (which also do input) • Generator • Converter • Effect • Mixer • Music Monday, March 25, 13
  • 27. Pull Model AUSomething Monday, March 25, 13
  • 28. Pull Model AUSomething AudioUnitRender() Monday, March 25, 13
  • 29. Pull Model AUSomethingElse AUSomething Monday, March 25, 13
  • 30. Buses (aka, Elements) AUSomethingElse AUSomething AUSomethingElse Monday, March 25, 13
  • 31. AUGraph AUSomethingElse AUSomething AUSomethingElse Monday, March 25, 13
  • 32. Render Callbacks OSStatus converterInputRenderCallback (void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData) { CCFWebRadioPlayer *player = (__bridge CCFWebRadioPlayer*) inRefCon; // read from buffer ioData->mBuffers[0].mData = player.preRenderData; return noErr; } AUSomething AUSomethingElse Monday, March 25, 13
  • 33. AURemoteIO • Output unit used for play-out, capture • A Core Audio thread repeatedly and automatically calls AudioUnitRender() • Must set EnableIO property to explicitly enable capture and/or play-out • Capture requires setting appropriate AudioSession category Monday, March 25, 13
  • 34. Create AURemoteIO CheckError(NewAUGraph(&_auGraph), ! ! "couldn't create au graph"); ! CheckError(AUGraphOpen(_auGraph), ! ! "couldn't open au graph"); ! AudioComponentDescription componentDesc; componentDesc.componentType = kAudioUnitType_Output; componentDesc.componentSubType = kAudioUnitSubType_RemoteIO; componentDesc.componentManufacturer = kAudioUnitManufacturer_Apple; ! AUNode remoteIONode; CheckError(AUGraphAddNode(_auGraph, ! ! ! ! ! ! &componentDesc, ! ! ! ! ! ! &remoteIONode), ! ! "couldn't add remote io node"); Monday, March 25, 13
  • 35. Getting an AudioUnit from AUNode ! CheckError(AUGraphNodeInfo(self.auGraph, ! ! ! ! ! ! ! remoteIONode, ! ! ! ! ! ! ! NULL, ! ! ! ! ! ! ! &_remoteIOUnit), ! ! ! "couldn't get remote io unit from node"); Monday, March 25, 13
  • 36. AURemoteIO Buses AURemoteIO Monday, March 25, 13
  • 37. AURemoteIO Buses AURemoteIO bus 0 to output H/W Monday, March 25, 13
  • 38. AURemoteIO Buses AURemoteIO bus 0 bus 0 from app to output H/W Monday, March 25, 13
  • 39. AURemoteIO Buses bus 1 from input H/W AURemoteIO bus 0 bus 0 from app to output H/W Monday, March 25, 13
  • 40. AURemoteIO Buses bus 1 bus 1 from input H/W to app AURemoteIO bus 0 bus 0 from app to output H/W Monday, March 25, 13
  • 41. EnableIO ! UInt32 oneFlag = 1; ! UInt32 busZero = 0; ! CheckError(AudioUnitSetProperty(self.remoteIOUnit, ! ! ! ! ! ! ! ! ! kAudioOutputUnitProperty_EnableIO, ! ! ! ! ! ! ! ! ! kAudioUnitScope_Output, ! ! ! ! ! ! ! ! ! busZero, ! ! ! ! ! ! ! ! ! &oneFlag, ! ! ! ! ! ! ! ! ! sizeof(oneFlag)), ! ! ! "couldn't enable remote io output"); ! UInt32 busOne = 1; ! CheckError(AudioUnitSetProperty(self.remoteIOUnit, ! ! ! ! ! ! ! ! ! kAudioOutputUnitProperty_EnableIO, ! ! ! ! ! ! ! ! ! kAudioUnitScope_Input, ! ! ! ! ! ! ! ! ! busOne, ! ! ! ! ! ! ! ! ! &oneFlag, ! ! ! ! ! ! ! ! ! sizeof(oneFlag)), ! ! ! "couldn't enable remote io input"); Monday, March 25, 13
  • 42. Pass Through bus 1 from input H/W AURemoteIO bus 0 to output H/W Monday, March 25, 13
  • 43. Connect In to Out ! UInt32 busZero = 0; ! UInt32 busOne = 1; ! CheckError(AUGraphConnectNodeInput(self.auGraph, ! ! ! ! ! ! ! ! ! remoteIONode, ! ! ! ! ! ! ! ! ! busOne, ! ! ! ! ! ! ! ! ! remoteIONode, ! ! ! ! ! ! ! ! ! busZero), ! ! ! "couldn't connect remote io bus 1 to 0"); Monday, March 25, 13
  • 44. Pass-Through with Effect AUEffect bus 1 from input H/W AURemoteIO bus 0 to output H/W Monday, March 25, 13
  • 45. Demo: Delay Effect New in iOS 6! Monday, March 25, 13
  • 46. Creating the AUDelay ! componentDesc.componentType = kAudioUnitType_Effect; ! componentDesc.componentSubType = kAudioUnitSubType_Delay; ! componentDesc.componentManufacturer = kAudioUnitManufacturer_Apple; ! ! AUNode effectNode; ! CheckError(AUGraphAddNode(self.auGraph, ! ! ! ! ! ! ! &componentDesc, ! ! ! ! ! ! ! &effectNode), ! ! ! "couldn't create effect node"); ! AudioUnit effectUnit; ! CheckError(AUGraphNodeInfo(self.auGraph, ! ! ! ! ! ! ! effectNode, ! ! ! ! ! ! ! NULL, ! ! ! ! ! ! ! &effectUnit), ! ! ! "couldn't get effect unit from node"); Monday, March 25, 13
  • 47. The problem with effect units • Audio Units available since iPhone OS 2.0 prefer int formats • Effect units arrived with iOS 5 (arm7 era) and only work with float format • Have to set the AUEffect unit’s format on AURemoteIO Monday, March 25, 13
  • 48. Setting formats ! AudioStreamBasicDescription effectDataFormat; ! UInt32 propSize = sizeof (effectDataFormat); ! CheckError(AudioUnitGetProperty(effectUnit, ! ! ! ! ! ! ! ! ! kAudioUnitProperty_StreamFormat, ! ! ! ! ! ! ! ! ! kAudioUnitScope_Output, ! ! ! ! ! ! ! ! ! busZero, ! ! ! ! ! ! ! ! ! &effectDataFormat, ! ! ! ! ! ! ! ! ! &propSize), ! ! ! "couldn't read effect format"); ! CheckError(AudioUnitSetProperty(self.remoteIOUnit, ! ! ! ! ! ! ! ! ! kAudioUnitProperty_StreamFormat, ! ! ! ! ! ! ! ! ! kAudioUnitScope_Output, ! ! ! ! ! ! ! ! ! busOne, ! ! ! ! ! ! ! ! ! &effectDataFormat, ! ! ! ! ! ! ! ! ! propSize), ! ! ! "couldn't set bus one output format"); Then repeat AudioUnitSetProperty() for input scope / bus 0 Monday, March 25, 13
  • 49. AUNewTimePitch • New in iOS 6! • Allows you to change pitch independent of time, or time independent of pitch • How do you use it? Monday, March 25, 13
  • 50. AUTimePitch ! AudioComponentDescription effectcd = {0}; ! effectcd.componentType = kAudioUnitType_FormatConverter; ! effectcd.componentSubType = kAudioUnitSubType_NewTimePitch; ! effectcd.componentManufacturer = kAudioUnitManufacturer_Apple; ! ! AUNode effectNode; ! CheckError(AUGraphAddNode(self.auGraph, ! ! ! ! ! ! ! &effectcd, ! ! ! ! ! ! ! &effectNode), ! ! ! "couldn't get effect node [time/pitch]"); Notice the type is AUFormatConverter, not AUEffect Monday, March 25, 13
  • 51. AudioUnitParameters.h // Parameters for AUNewTimePitch enum { ! ! // Global, rate, 1/32 -> 32.0, 1.0 ! kNewTimePitchParam_Rate! ! ! ! ! ! = ! 0, ! ! // Global, Cents, -2400 -> 2400, 1.0 ! kNewTimePitchParam_Pitch! ! ! ! ! ! = 1, ! ! // Global, generic, 3.0 -> 32.0, 8.0 ! kNewTimePitchParam_Overlap! ! ! ! ! ! = 4, ! ! // Global, Boolean, 0->1, 1 ! kNewTimePitchParam_EnablePeakLocking! ! ! = 6 }; This is the entire documentation for the AUNewTimePitch parameters Monday, March 25, 13
  • 52. AUNewTimePitch parameters • Rate: kNewTimePitchParam_Rate takes a Float32 rate from 1/32 speed to 32x speed. • Use powers of 2: 1/32, 1/16, …, 2, 4, 8… • Pitch: kNewTimePitchParam_Pitch takes a Float32 representing cents, meaning 1/100 of a musical semitone Monday, March 25, 13
  • 53. Pitch shifting • Pitch can vary, time does not • Suitable for real-time sources, such as audio capture Monday, March 25, 13
  • 54. Demo: Pitch Shift New in iOS 6! Monday, March 25, 13
  • 55. Rate shifting • Rate can vary, pitch does not • Think of 1.5x and 2x speed modes in Podcasts app • Not suitable for real-time sources, as data will be consumed faster. Files work well. • Sources must be able to map time systems with kAudioUnitProperty_InputSamplesInOutput Monday, March 25, 13
  • 56. Demo: Rate Shift New in iOS 6! Monday, March 25, 13
  • 57. AUSplitter AUSomethingElse AUSplitter AUSomethingElse New in iOS 6! Monday, March 25, 13
  • 58. AUMatrixMixer AUSomethingElse AUSomethingElse AUSomethingElse AUMatrixMixer AUSomethingElse AUSomethingElse New in iOS 6! Monday, March 25, 13
  • 59. Audio Queues (and the APIs that help them) Monday, March 25, 13
  • 60. AudioQueue • Easier than AURemoteIO - provide data when you want to, less time pressure, can accept or provide compressed formats (MP3, AAC) • Recording queue - receive buffers of captured audio in a callback • Play-out queue - enqueue buffers of audio to play, optionally refill in a callback Monday, March 25, 13
  • 61. AudioQueue 2 1 0 Monday, March 25, 13
  • 62. Common AQ scenarios • File player - Read from file and “prime” queue buffers, start queue, when called back with used buffer, refill from next part of file • Synthesis - Maintain state in your own code, write raw samples into buffers during callbacks Monday, March 25, 13
  • 63. Web Radio • Project from CocoaConfs Columbus, Portland, and Raleigh • Use Audio File Stream Services to pick out audio data from a network stream • Enqueue these packets as new AQ buffers • Dispose used buffers in callback Monday, March 25, 13
  • 65. Parsing web radio NSURLConnection delivers NSData buffers, containing audio and framing info. We pass it to NSData NSData Audio File Services. Packets Packets Packets Packets Packets Monday, March 25, 13
  • 66. Parsing web radio NSURLConnection delivers NSData buffers, containing audio and framing info. We pass it to NSData NSData Audio File Services. Packets Packets Packets Packets Packets Packets Packets Audio File Services calls us back with parsed packets of audio data. Packets Packets Packets Monday, March 25, 13
  • 67. Parsing web radio NSURLConnection delivers NSData buffers, containing audio and framing info. We pass it to NSData NSData Audio File Services. Packets Packets Packets Packets Packets Packets Packets Audio File Services calls us back with parsed packets of audio data. Packets Packets Packets We create an AudioQueueBuffer Packets Packets with those packets and enqueue it Packets 2 Packets 1 0 for play-out. Packets Packets Monday, March 25, 13
  • 68. A complex thing! • What if we want to see that data after it’s been decoded to PCM and is about to be played? • e.g., spectrum analysis, effects, visualizers • AudioQueue design is “fire-and-forget” Monday, March 25, 13
  • 69. AudioQueue Tap! http://www.last.fm/music/Spinal+Tap Monday, March 25, 13
  • 70. AudioQueueProcessingTap • Set as a property on the Audio Queue • Calls back to your function with decoded (PCM) audio data • Three types: pre- or post- effects (that the AQ performs), or siphon. First two can modify the data. • Only documentation is in AudioQueue.h Monday, March 25, 13
  • 71. Creating an AQ Tap ! ! // create the tap ! ! UInt32 maxFrames = 0; ! ! AudioStreamBasicDescription tapFormat = {0}; ! ! AudioQueueProcessingTapRef tapRef; ! ! CheckError(AudioQueueProcessingTapNew(audioQueue, ! ! ! ! ! ! ! ! ! ! ! tapProc, ! ! ! ! ! ! ! ! ! ! ! (__bridge void *)(player), ! ! ! ! ! ! ! ! ! ! ! kAudioQueueProcessingTap_PreEffects, ! ! ! ! ! ! ! ! ! ! ! &maxFrames, ! ! ! ! ! ! ! ! ! ! ! &tapFormat, ! ! ! ! ! ! ! ! ! ! ! &tapRef), ! ! ! ! "couldn't create AQ tap"); Notice that you receive maxFrames and tapFormat. These do not appear to be settable. Monday, March 25, 13
  • 72. AQ Tap Proc void tapProc (void * inClientData, ! ! ! AudioQueueProcessingTapRef inAQTap, ! ! ! UInt32 inNumberFrames, ! ! ! AudioTimeStamp * ioTimeStamp, ! ! ! UInt32 * ioFlags, ! ! ! UInt32 * outNumberFrames, ! ! ! AudioBufferList * ioData) { ! CCFWebRadioPlayer *player = (__bridge CCFWebRadioPlayer*) inClientData; ! UInt32 getSourceFlags = 0; ! UInt32 getSourceFrames = 0; ! AudioQueueProcessingTapGetSourceAudio(inAQTap, ! ! ! ! ! ! ! ! ! ! inNumberFrames, ! ! ! ! ! ! ! ! ! ! ioTimeStamp, ! ! ! ! ! ! ! ! ! ! &getSourceFlags, ! ! ! ! ! ! ! ! ! ! &getSourceFrames, ! ! ! ! ! ! ! ! ! ! ioData); // then do something with ioData // ... Monday, March 25, 13
  • 73. So what should we do with the audio? Monday, March 25, 13
  • 74. So what should we do with the audio? Let’s apply our pitch-shift effect Monday, March 25, 13
  • 75. Shouldn’t this work? AUEffect Monday, March 25, 13
  • 76. Shouldn’t this work? AUEffect AudioUnitRender() Monday, March 25, 13
  • 77. AudioUnitRender() • Last argument is an AudioBufferList, whose AudioBuffer members have mData pointers • If mData != NULL, audio unit does its thing with those samples • If mData == NULL, audio data pulls from whatever it’s connected to • So we just call with AudioBufferList ioData we got from tap callback, right? Monday, March 25, 13
  • 78. Psych! • AQ tap provides data as signed ints • Effect units only work with floating point • We need to do an on-the-spot format conversion Monday, March 25, 13
  • 79. invalidname’s convert- and-effect recipe OSStatus converterInputRenderCallback (void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData) { CCFWebRadioPlayer *player = (__bridge CCFWebRadioPlayer*) inRefCon; // read from buffer ioData->mBuffers[0].mData = player.preRenderData; return noErr; } AUConverter AUEffect AUConverter AUGenericOutput Note: red arrows are float format, yellow arrows are int Monday, March 25, 13
  • 80. How it works • AUGraph: AUConverter → AUEffect → AUConverter → AUGenericOutput • Top AUConverter is connected to a render callback function Monday, March 25, 13
  • 81. The trick! • Copy mData pointer to a state variable and NULL it in ioData • Call AudioQueueRender() on output unit. The NULL makes it pull from the graph. • Top of the graph pulls on render callback, which gives it back the mData we copied off. Monday, March 25, 13
  • 82. Yes, really This is the rest of tapProc() ! // copy off the ioData so the graph can read from it // in render callback ! player.preRenderData = ioData->mBuffers[0].mData; ! ioData->mBuffers[0].mData = NULL; ! ! OSStatus renderErr = noErr; ! AudioUnitRenderActionFlags actionFlags = 0; ! renderErr = AudioUnitRender(player.genericOutputUnit, ! ! ! ! ! ! ! ! &actionFlags, ! ! ! ! ! ! ! ! player.renderTimeStamp, ! ! ! ! ! ! ! ! 0, ! ! ! ! ! ! ! ! inNumberFrames, ! ! ! ! ! ! ! ! ioData); ! NSLog (@"AudioUnitRender, renderErr = %ld",renderErr); } Monday, March 25, 13
  • 83. Yes, really This is the render callback that supplies data to the int→float converter OSStatus converterInputRenderCallback (void *inRefCon, ! ! ! ! ! ! ! ! ! AudioUnitRenderActionFlags *ioActionFlags, ! ! ! ! ! ! ! ! ! const AudioTimeStamp *inTimeStamp, ! ! ! ! ! ! ! ! ! UInt32 inBusNumber, ! ! ! ! ! ! ! ! ! UInt32 inNumberFrames, ! ! ! ! ! ! ! ! ! AudioBufferList * ioData) { ! CCFWebRadioPlayer *player = (__bridge CCFWebRadioPlayer*) inRefCon; ! ! // read from buffer ! ioData->mBuffers[0].mData = player.preRenderData; ! return noErr; } Monday, March 25, 13
  • 84. Demo: AQ Tap + AUNewTimePitch New in iOS 6! Monday, March 25, 13
  • 86. Other new stuff Monday, March 25, 13
  • 87. Multi-Route • Ordinarily, one input or output is active: earpiece, speaker, headphones, dock- connected device • “Last in wins” • With AV Session “multi-route” category, you can use several at once • WWDC 2012 session 505 Monday, March 25, 13
  • 88. Utility classes moved again • C++ utilities, including the CARingBuffer • < Xcode 4.3, installed into /Developer • Xcode 4.3-4.4, optional download from developer.apple.com • ≧ Xcode 4.5, sample code project “Core Audio Utility Classes” Monday, March 25, 13
  • 89. Takeaways • Core Audio fundamentals never change • New stuff is added as properties, typedefs, enums, etc. • Watch the SDK API diffs document to find the new stuff • Hope you like header files and experimentation Monday, March 25, 13
  • 90. Q&A • Slides will be posted to slideshare.net/ invalidname • Code will be linked from there and my blog • Watch CocoaConf glassboard, @invalidname on Twitter/ADN, or [Time code]; blog for announcement • Thanks! Monday, March 25, 13