0

我遇到了一个问题,即我的应用程序在屏幕处于活动状态时工作正常,但是,当屏幕被锁定或休眠时,某些代码似乎无限期地暂停了应用程序,而实际上并没有崩溃。

该应用程序使用 AVAudioPlayers 和 boost::threads 来播放一些音乐曲目。当轨道结束时,必须调用大量设置才能准备新轨道。同时,应用程序必须暂停几秒钟。这种并行活动是通过 boost::threads 实现的。

当屏幕处于活动状态时,一切正常。但是,当屏幕处于非活动状态时,永远不会播放新曲目。没有崩溃,并且,使用断点进行调试,似乎应用程序只是挂在某一行上 - 该行从调试会话更改为调试会话 - 并且卡住了。我从来没有如此希望 EXC_BAD_ACCESS - 但什么都没有。没有提示代码为何挂起。

难道是我的主线程被阻塞了?我使用了一些 performSelectorOnMainThread 调用,但是当使用 applicationWillResignActive 锁定屏幕时,我已经停用了它们。然而,这并没有解决问题。

它似乎挂起的 boost::thread 如下:

void MyClass::loopThread(int waitSeconds)
{
    loopScheduled = true;

    sleep(waitSeconds);

    if ( loopScheduled == true ) {

        if (engine_isRunning()) {
            joinEngineThread();
        }
        startEngineThread();
        ((CPlusPlus*)m_obj)->markAsPlaying();
    }
}

它似乎徘徊在

if ( loopScheduled == true ) {

线。

在这个线程中发生的事情是其他并行线程可以在 sleep() 调用期间将 loopScheduled 设置为 false,如果 loopScheduled 为 false,则不会调用后面的方法。

但是,就我遇到的问题而言, loopScheduled 应该是无关紧要的——它没有被任何其他方法设置为 false,并且在 sleep() 调用之后仍然是 true。

有谁知道会发生什么?

4

1 回答 1

0

我发现了问题。当应用程序在轨道之间暂停时,音频会话正在结束。

事实证明,当屏幕被锁定或睡眠或应用程序处于后台时,当最后一个 AVAudioPlayer 完成播放音频会话时完成。这意味着无法再准备或播放新的 AVAudioPlayers - 因此无法播放新曲目。

为了解决这个问题,我现在在曲目之间的暂停期间播放无声文件。这使音频会话继续进行,这意味着新曲目在被指示播放时播放。

于 2012-11-05T16:36:08.050 回答