iOS: Deprecation of AudioSessionInitialize and AudioSessionSetProperty

Henry F picture Henry F · Jan 30, 2014 · Viewed 14.4k times · Source

I'm very new to Objective-C, and am trying to update some code that's about 3 years old to work with iOS 7. There are two or two instances of AudioSessionSetProperty and AudioSessionInitialize appearing in the code:

1:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    AudioSessionInitialize(NULL,NULL,NULL,NULL);
    [[SCListener sharedListener] listen];
    timer = [NSTimer scheduledTimerWithTimeInterval: 0.5 target: self selector: @selector(tick:) userInfo:nil repeats: YES];

    // Override point for customization after app launch    
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}

And 2:

- (id)init {
    if ([super init] == nil){
        return nil;
    }

    AudioSessionInitialize(NULL,NULL,NULL,NULL);
    Float64 rate=kSAMPLERATE;
    UInt32 size = sizeof(rate); 
    AudioSessionSetProperty (kAudioSessionProperty_PreferredHardwareSampleRate, size, &rate); 
    return self;
}

For some reason this code works on iOS7 in the simulator but not a device running iOS7, and I suspect that these deprecations are the cause. I've been reading through the Docs and related questions on this website, and it appears that I need to use AVAudioSession instead. I've been trying to update the code for a long time now, and I'm unsure of how to properly switch over to AVAudioSession. Does anyone know how these two methods above need to look?

Side note: I've managed to hunt down an article that outlines the transition: https://github.com/software-mariodiana/AudioBufferPlayer/wiki/Replacing-C-functions-deprecated-in-iOS-7 But I can't seem to apply this to the code above.

The code I'm trying to update is a small frequency detection app from git: https://github.com/jkells/sc_listener

Alternatively, if someone could point me to a sample demo app that can detect frequencies on iOS devices, that would be awesome.

Answer

foundry picture foundry · Jan 31, 2014

As you have observed, pretty much all of the old Core Audio AudioSession functions have been deprecated in favour of AVAudioSession.

The AVAudioSession is a singleton object which will get initialised when you first call it:

[AVAudioSession sharedInstance]

There is no separate initialize method. But you will want to activate the audio session:

BOOL activated = [[AVAudioSession sharedInstance] setActive:YES error:&error];

As regards setting the hardware sample rate using AVAudioSession, please refer to my answer here:
How can I obtain the native (hardware-supported) audio sampling rates in order to avoid internal sample rate conversion?

For other compares & contrasts between Core Audio audioSession and AVFoundation's AVAudioSession here are some of my other answers around the same topic:

How Do I Route Audio to Speaker without using AudioSessionSetProperty?

use rear microphone of iphone 5

Play audio through upper (phone call) speaker

How to control hardware mic input gain/level on iPhone?