gpt4 book ai didi

iphone - openAL 流媒体和中断

转载 作者:行者123 更新时间:2023-12-03 19:22:29 25 4
gpt4 key购买 nike

我制作了一个 iPhone 应用程序,它使用 OpenAL 来播放许多声音。这些声音是 mp3 格式,相当重(超过 100 万),我对它们进行流式传输(每个声音 2 个缓冲区),以便使用更少的内存。为了管理中断,我使用以下代码:

在 OpenALSupport.c 文件中:

  //used to disable openAL during a call
void openALInterruptionListener ( void *inClientData, UInt32 inInterruptionState)
{
if (inInterruptionState == kAudioSessionBeginInterruption)
{
alcMakeContextCurrent (NULL);
}
}

//used to restore openAL after a call
void restoreOpenAL(void* a_context)
{
alcMakeContextCurrent(a_context);
}

在我的 SoundManager.m 文件中:

 - (void) restoreOpenAL
{
restoreOpenAL(mContext);
}

//OPENAL initialization
- (bool) initOpenAL
{
// Initialization
mDevice = alcOpenDevice(NULL);
if (mDevice) {
...

// use the device to make a context
mContext=alcCreateContext(mDevice,NULL);
// set my context to the currently active one
alcMakeContextCurrent(mContext);

AudioSessionInitialize (NULL, NULL, openALInterruptionListener, mContext);

NSError *activationError = nil;
[[AVAudioSession sharedInstance] setActive: YES error: &activationError];

NSError *setCategoryError = nil;

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: &setCategoryError];

...
}

最后在我的 AppDelegate 中:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[CSoundManager getInstance] restoreOpenAL];
...
}

使用此方法,声音会在通话后恢复,但流程似乎是随机播放的。是否有特定的方法来管理流声音的中断?我没有找到任何相关文章。

感谢您的帮助。

最佳答案

好吧,我回答我自己的问题。

我通过管理流方法上的错误解决了问题:

- (void) updateStream
{
ALint processed;
alGetSourcei(sourceID, AL_BUFFERS_PROCESSED, &processed);

while(processed--)
{
oldPosition = position;

NSUInteger buffer;

alSourceUnqueueBuffers(sourceID, 1, &buffer);

////////////////////
//code freshly added
ALint err = alGetError();
if (err != 0)
{
NSLog(@"Error Calling alSourceUnQueueBuffers: %d",err);
processed++;
//restore old position for the next buffer
position = oldPosition;
usleep(10000);
continue;
}
////////////////////

[self stream:buffer];

alSourceQueueBuffers(sourceID, 1, &buffer);

////////////////////
//code freshly added
err = alGetError();
if (err != 0)
{
NSLog(@"Error Calling alSourceQueueBuffers: %d",err);
processed++;
usleep(10000);
//restore old position for the next buffer
position = oldPosition;
}
///////////////////
}

}

关于iphone - openAL 流媒体和中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4678709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com