Cocos2D 2.1: “Delegate” deprecated in iOS 6. How do I set the delegate for this AVAudioSession?

后端 未结 4 1483
一整个雨季
一整个雨季 2021-02-05 19:17

Started a Cocos2D 2.1 template (with no physics engine) in Xcode 4.5, targeted for iOS 6 and iPad. In the CDAudioManager.m file, the following code...

AVAudioSe         


        
相关标签:
4条回答
  • 2021-02-05 19:41

    I found a poast about this on the Cocos2D-iPhone.org forums. While I don't fully understand it--but I'm working on it--it did seem to take care of the problem, at least temporarily. What he did was write this method in the CDAudioManger.m file:

    -(void) releaseBufferForFile:(NSString *) filePath {
        int bufferId = [self bufferForFile:filePath create:NO];
        if (bufferId != kCDNoBuffer) {
            [soundEngine unloadBuffer:bufferId];
            [loadedBuffers removeObjectForKey:filePath];
            NSNumber *freedBufferId = [[NSNumber alloc] initWithInt:bufferId];
            [freedBufferId autorelease];
            [freedBuffers addObject:freedBufferId];
        }
    }
    @end
    
    - (void) interruption:(NSNotification*)notification
    {
        NSDictionary *interuptionDict = notification.userInfo;
                NSNumber* interuptionTypeValue = [dict valueForKey:AVAudioSessionInterruptionTypeKey];
        NSUInteger interuptionType = [interuptionTypeValue intValue];
    
        if (interuptionType == AVAudioSessionInterruptionTypeBegan)
            [self beginInterruption];
    #if __CC_PLATFORM_IOS >= 40000
        else if (interuptionType == AVAudioSessionInterruptionTypeEnded)
            [self endInterruptionWithFlags:(NSUInteger)[interuptionDict valueForKey:AVAudioSessionInterruptionOptionKey]];
    #else
        else if (interuptionType == AVAudioSessionInterruptionTypeEnded)
            [self endInterruption];
    #endif
    }
    

    Then he replaced:

    AVAudioSession *session = [AVAudioSession sharedInstance];
    session.delegate = self;
    

    with this:

    [AVAudioSession sharedInstance];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruption:) name:AVAudioSessionInterruptionNotification object:nil];
    

    Here's the link: http://www.cocos2d-iphone.org/forum/topic/49956

    If and when I develop a better understand of what this code is doing, I'll be sure to edit this post.

    0 讨论(0)
  • 2021-02-05 19:42

    I haven't tested this but according to this post: http://www.cocos2d-iphone.org/forums/topic/cdaudiomanager-line-402-delegate-is-deprecated/#post-390211

    float osVersion = [[UIDevice currentDevice].systemVersion floatValue];
    if (osVersion >=6.0)
    {
    [AVAudioSession sharedInstance];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruption:) name:AVAudioSessionInterruptionNotification object:nil];
    }
    else
    {
    AVAudioSession* session = [AVAudioSession sharedInstance];
    session.delegate = self;
    }
    

    I.e. throw different code runtime depending on iOS version.

    Now, my app is iOS 6.0+ only anyway so I'll just go with:

    [AVAudioSession sharedInstance];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruption:) name:AVAudioSessionInterruptionNotification object:nil];
    

    And cross my thumbs.

    0 讨论(0)
  • 2021-02-05 19:46

    Instead of using delegate use notification for handling as follows

    [AVAudioSession sharedInstance];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruption:) name:AVAudioSessionInterruptionNotification object:nil];
    
     - (void) interruption:(NSNotification*)notification
       {
        NSDictionary *interuptionDict = notification.userInfo;
    
        NSUInteger interuptionType = (NSUInteger)[interuptionDict valueForKey:AVAudioSessionInterruptionTypeKey];
    
       if (interuptionType == AVAudioSessionInterruptionTypeBegan)
            [self beginInterruption];
    
        else if (interuptionType == AVAudioSessionInterruptionTypeEnded)
            [self endInterruption];
    }
    
    0 讨论(0)
  • 2021-02-05 19:55

    The error you are running into is in this block of code

    AVAudioSession* session = [AVAudioSession sharedInstance];
    session.delegate = self;// <-------- DEPRECATED IN IOS 6.0
    

    To silence the warning change those 2 lines to this:

    [[AVAudioSession sharedInstance] setActive:YES error:nil];
    

    Hope this helps.

    0 讨论(0)
提交回复
热议问题