Nick
Nick

Reputation: 3435

AudioQueueStart returns 561015905 (AVAudioSessionErrorCodeCannotStartPlaying)

My app uses Audio Queue Services to play sounds. On app start, I set audio session category to solo ambient:

`[[AVAudioSession sharedInstance] setCategory:AVAudioSEssionCategorySoloAmbient error:&error];`

When my app delegate gets applicationWillResignActive notification, I call AudioQueuePause(queue); for all playing sounds. And when the app delegate gets applicationDidBecomeActive, I call

OSStatus status = AudioQueueStart(queue, 0);

Sometimes (and it's hard to reproduce) status equals to 561015905. This value does not belong to Audio Queue Result Codes. It is AVAudioSessionErrorCodeCannotStartPlaying, and docs say

"The app is not allowed to start recording and/or playing, usually because of a lack of audio key in its Info.plist. This could also happen if the app has this key but uses a category that can't record
and/or play in the background (AVAudioSessionCategoryAmbient, AVAudioSessionCategorySoloAmbient, etc.)."

I definitely do not want to play the sound in background (that's why I am pausing audio queues when app resigns active). So, what am I doing wrong?

Upvotes: 4

Views: 2309

Answers (1)

Joe Hallenbeck
Joe Hallenbeck

Reputation: 1450

I had a similar problem, but I made a little in a different way...There was musical app in which background music was necessary, but under certain conditions she has to howled to play in background mode. For me, i use this code:

#import "ViewController.h"
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVAudioPlayer.h>
#import <AVFoundation/AVAudioSession.h>

@interface ViewController ()
{
  AVAudioPlayer *audioPlayer;
}

@property (assign) SystemSoundID pewPewSound;

@end

@implementation ViewController

- (void)viewDidLoad 
{
  [super viewDidLoad];

  NSURL * pewPewURL = [[NSBundle mainBundle]URLForResource:@"Calypso" withExtension:@"caf"];
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:pewPewURL error:nil];

     if (audioPlayer)
     {
          [audioPlayer setNumberOfLoops:100];
          [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
          [[AVAudioSession sharedInstance] setActive: YES error: nil];
          [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
          [audioPlayer prepareToPlay];
          [audioPlayer play];
     }

}

@end

If u don't touch any Xcode setting, this code play looping melody, only in foreground, and if u go to background, player is stopped.

if u do this:

enter image description here

melody will continue to play in background, and in my case i can stop and play melody in background and foreground when i want. And I add system sound to call then u stop player, system sound stopped then U continue play music.

-(void)stopPlaying
{
    [audioPlayer pause];

    NSURL * pewPewURL;
    pewPewURL = [[NSBundle mainBundle]URLForResource:@"Calypso" withExtension:@"caf"];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)pewPewURL, &_pewPewSound);
    AudioServicesPlaySystemSound(self.pewPewSound);
}

-(void)continueToPlay
{
    if ([audioPlayer prepareToPlay])
    {
        [audioPlayer play];
        AudioServicesRemoveSystemSoundCompletion(self.pewPewSound);
        AudioServicesDisposeSystemSoundID(self.pewPewSound);
    }
}

I hope it will help to solve yours problems, If there are questions, set I will answer everything.

Upvotes: 2

Related Questions