2012-06-18 79 views
6

我正试图让音频应用在后台播放。到目前为止,我补充说:“应用程序播放音频”中的info.plist的“所需的背景模式”,也有下面的代码刚开始我的声音发生器前:屏幕锁定时iOS背景音频会停止

AudioSessionInitialize(NULL, kCFRunLoopDefaultMode, &interruptionListener, sgD); 
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, &routeChangeListener, sgD); 

// select "Playback" audio session category 
NSError *setCategoryError = nil; 
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError]; 

OSStatus propertySetError = 0; 
UInt32 category = kAudioSessionCategory_MediaPlayback; 
propertySetError = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (category), &category); 

AudioSessionSetActive(true); 

然而,这个时候我切换到另一个应用程序仅适用或iPod的主屏幕。当我关闭屏幕时,它也会关闭我的音频输出,这绝对不是我想要的。但是,对于stackoverflow上的问题,所有教程/文档/答案似乎都表明,在屏幕关闭时保持音频运行时会自动获得背景音频。有人给我提示吗?提前感谢! 弗里茨

+0

什么我忘了说:我使用AudioQueues来生成音频输出流。当屏幕关闭时,音频队列回调被调用,但耳机听不到声音。这可能表示一些音频路由问题。但是,我的路由更改回调从未被调用。 –

+4

好的,问题解决了......原来,音频缓冲区大小必须足够大,如果它应该在屏幕关闭时运行。我不知道这是否适用于所有应用程序,但我的应用程序需要至少2048个样本的缓冲区大小。有1024个样本,它只是停止工作。 –

+3

如果你能够得到它的工作,你可以添加你的解决方案作为答案?谢谢。 –

回答

5

这篇文章解释了这个问题:

Technical Q&A QA1606 Audio Unit Processing Graph - Ensuring audio playback continues when screen is locked

基本上,你只需要确保你将所有AudioUnits支持4096片:

// set the mixer unit to handle 4096 samples per slice since we want to keep rendering during screen lock 
UInt32 maxFPS = 4096; 
AudioUnitSetProperty(
    mMixer, 
    kAudioUnitProperty_MaximumFramesPerSlice, 
    kAudioUnitScope_Global, 
    0, 
    &maxFPS, 
    sizeof(maxFPS)); 
+0

任何想法如何将此应用于AVAudioEngine? – DrMickeyLauer