Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图找出核心音频与iPhone后台执行之间的问题_Iphone_Core Audio_Multitasking - Fatal编程技术网

试图找出核心音频与iPhone后台执行之间的问题

试图找出核心音频与iPhone后台执行之间的问题,iphone,core-audio,multitasking,Iphone,Core Audio,Multitasking,我在商店里有一个音频应用程序。它适用于iOS 4.0之前的iPhone操作系统版本。我正在开发一个新版本,首先是让应用程序符合新的iOS多任务功能。(我在iPhone上安装了iOS 4.0,并已升级到最新的xCode和SDK。) 结果是一场精彩的比赛 o当我在iPhone上安装应用程序并在调试器中运行时,或者在iPhone关机后启动应用程序时,应用程序的行为很好-在我按下按钮时播放音频,或者从上次运行应用程序时保存的“状态”重新启动音频 o如果我尝试按下Home(主页)按钮,然后从后台重新启动应

我在商店里有一个音频应用程序。它适用于iOS 4.0之前的iPhone操作系统版本。我正在开发一个新版本,首先是让应用程序符合新的iOS多任务功能。(我在iPhone上安装了iOS 4.0,并已升级到最新的xCode和SDK。)

结果是一场精彩的比赛

o当我在iPhone上安装应用程序并在调试器中运行时,或者在iPhone关机后启动应用程序时,应用程序的行为很好-在我按下按钮时播放音频,或者从上次运行应用程序时保存的“状态”重新启动音频

o如果我尝试按下Home(主页)按钮,然后从后台重新启动应用程序,音频(a和1-n音频流的混合)会发出只有我才能识别的口吃声

o如果-当音频干净时-我呼叫iPhone,我可以接听或拒绝呼叫。在这两种情况下,应用程序都会干净地返回,按其应有的方式运行

请注意,在后台模式下,我不会尝试播放任何内容。我只是想把东西关掉,当被问到的时候再拿回来

技术:所有音频逻辑都使用RemoteIO。(我计划有一天做一些相当复杂的信号处理。)

请原谅伪代码的叙述-一些真正的代码是相当广泛的

主视图控制器:

(void)willResignActive:(NSNotification *)note {
    [ self saveState ];
    [ [ NaturePlayer getInstance ] stopAllSounds ];
    [ [ NaturePlayer getInstance ] stop ];
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: NO error: &activationError]; 
    [NaturePlayer destroy];

}

- (void)didBecomeActive:(NSNotification *)note {
    [ self setupAudioSession ];

    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; 
    [ self restartSounds ];
    [ self setViewState ];
}

- (void)didEnterBackground:(NSNotification *)note {
    int xxx = 1;
}

- (void)willEnterForeground:(NSNotification *)note {
    int xxx = 1;
}

- (void) applicationWillTerminate: (NSNotification*) notification {
    int xxx = 1;
}
o viewDidLoad-无特殊情况

你变得活跃了 将self设置为音频会话委托; 将AudioSessionCategory设置为MediaPlayback; 将音频会话设置为活动状态; 创建一个玩家(见下文); 重新启动之前播放的所有声音

o意志消沉 保存正在播放的内容的状态; 停止所有声音; 阻止玩家; 将音频会话设置为非活动状态

o dienterbackground-无(方法已注册,但没有内容。)

o willEnterForeground-无(方法已注册,但没有内容。)

播放器概述-我的班级: 这个运动员是单身汉。我确保在didBecomeActive中销毁singleton实例,并创建一个新实例。实例化singleton实际上启动AudioUnit

建造师 设置远程IO; 开始 音频输出单元启动; 停止 音频输出单元停止; 播放器回调 平常的东西

>

以下是我的MainViewController中的一些方法:

(void)willResignActive:(NSNotification *)note {
    [ self saveState ];
    [ [ NaturePlayer getInstance ] stopAllSounds ];
    [ [ NaturePlayer getInstance ] stop ];
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: NO error: &activationError]; 
    [NaturePlayer destroy];

}

- (void)didBecomeActive:(NSNotification *)note {
    [ self setupAudioSession ];

    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; 
    [ self restartSounds ];
    [ self setViewState ];
}

- (void)didEnterBackground:(NSNotification *)note {
    int xxx = 1;
}

- (void)willEnterForeground:(NSNotification *)note {
    int xxx = 1;
}

- (void) applicationWillTerminate: (NSNotification*) notification {
    int xxx = 1;
}
以下是NaturePlayer提供的方法:

/**
 * Stop the playback process.
 */
void NaturePlayerDelegate::stop() {
    if (isPlaying_) {
        AudioOutputUnitStop(outputUnit_);
        isPlaying_ = FALSE ;        
    }
}

我检查:正在调用stop(),然后依次调用AudioOutputUnitStop();
还检查了:AudioOutputUnitStop上的文档说它会一直阻止,直到所有活动都完成。

如果没有音频代码的详细信息,很难说。但我建议您在发布内容之前检查播放器对象拆卸代码,以确保音频单元和音频会话完全停止(缓冲区回调线程耗尽)。

如果没有音频代码的详细信息,很难说。但我建议您在发布内容之前,检查播放器对象拆卸代码,确保音频单元和音频会话完全停止(缓冲区回调线程耗尽)。

您是否在代码中初始化和取消初始化音频单元?我最近发现一个问题,音频单元被创建和销毁,然后离开并返回到你的应用程序会导致口吃

我能够在我的应用程序中解决这个问题,方法是从不取消对AudioUnits的初始化


关于我的问题和我的AudioUnit代码。

您是否在代码中初始化和取消初始化AudioUnits?我最近发现一个问题,音频单元被创建和销毁,然后离开并返回到你的应用程序会导致口吃

我能够在我的应用程序中解决这个问题,方法是从不取消对AudioUnits的初始化


关于我的问题和我的音频单元代码。

我在我的一个项目中遇到了同样的问题。我发现,如果在挂起应用程序之前通过单击按钮调用AudioOutputUnitStop(),然后在应用程序恢复时调用AudioOutputUnitStart(),我就没有问题了。但是,如果我从viewDidUnload处理程序自动调用AudioOutputUnitStop(),或者作为对UIApplicationWillResignActiveNotification的响应,我会听到上面描述的口吃、反馈声

我还注意到,如果我手动停止音频单元,然后暂停应用程序,就会调用中断侦听器。但是,如果我在音频单元仍在运行时暂停应用程序,则不会调用中断侦听器。中断侦听器应该停止音频单元,所以这对我没有多大好处


经过几个小时的追踪,我找到了一种不用音频单元就能完成任务的方法,并将它们从我的应用程序中删除。所以我恐怕没有一个完整的答案。但希望这些线索能对某人有所帮助。我以后可能需要再做一次,所以我会回来看看是否有其他人已经解决了这个问题。

我在一个项目中遇到了同样的问题。我发现,如果在挂起应用程序之前通过单击按钮调用AudioOutputUnitStop(),然后在应用程序恢复时调用AudioOutputUnitStart(),我就没有问题了。但是,如果我从viewDidUnload处理程序自动调用AudioOutputUnitStop(),或者作为对UIApplicationWillResignActiveNotification的响应,我会听到上面描述的口吃、反馈声

我还注意到,如果我手动停止音频单元,然后暂停应用程序,就会调用中断侦听器。但是,如果我在音频单元仍在运行时暂停应用程序,则不会调用中断侦听器。中断侦听器应该停止音频单元,所以这对我没有多大好处

经过几个小时的追踪,我找到了一种不用音频单元就能完成任务的方法,并将它们从我的应用程序中删除。所以我恐怕没有一个完整的答案。但希望这些线索能对某人有所帮助。我以后可能需要再做一次