IOS工程:NSThread sleepForTimeInterval的使用,游戏中途中断(接电话或者点击Home按钮),重新回到游戏音频音效失效问题

文章讲述了在iOS游戏中,由于中断(如接电话或点击Home按钮)后重新进入导致音效失效的问题。作者分析了AVAudioSession的错误信息,确定为音频会话激活时有冲突的I/O。为了解决这个问题,作者引入了延迟调用恢复音频的代码,通过NSThreadsleepForTimeInterval来确保在程序其他功能启动之前恢复音频,从而避免了冲突。修改后的代码在异步队列中执行,有效解决了音频无响应的故障。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IOS工程:NSThread sleepForTimeInterval的使用,游戏中途中断(接电话或者点击Home按钮),重新回到游戏音频音效失效问题

设备/引擎:Mac(11.7)/cocos

开发工具:Xcode

开发语言:c++/java

错误信息:AVAudioSession_iOS.mm:1271 Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.

最近工程中用户反馈游戏在中途被中断再回来会出现所有音效消失的情况,体验上会不太好,一开始考虑是可能在哪里不小心设置了stopEffect的选项,查了一圈并没有,所以就打断点来测试,发现有个报错信息如下:AVAudioSession_iOS.mm:1271 Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.

乍一看可以判断是音频冲突的问题,用Chatgpt查了一下,给出了检查是否在恢复音频时已经有其他音频流在运行,以及可以增加延迟来避免这种情况,如下图:
在这里插入图片描述
在这里插入图片描述

通过提示也基本有了修改的思路,之前工程中的源码是直接调用恢复音频的代码,这块的隐患在于视觉上是直接调用执行的,但在程序运行时,方法调用及执行会有所延迟,当运行恢复音频的代码时,可能程序中已经有其他的功能开始运行了,也就有可能会出现音频流冲突的问题。所以修改的方法便是去延迟调用相关的恢复音频的代码。

如下图是开始时的代码:

void AppDelegate::applicationWillEnterForeground()
{
    SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
    SimpleAudioEngine::sharedEngine()->resumeAllEffects();
    CCDirector::sharedDirector()->startAnimation();
}

如下是修改后的代码,在.mm文件中进行延迟:

void AppDelegate::applicationWillEnterForeground()
{
    DeviceManager::sharedManager()->resumeAllSounds();
    CCDirector::sharedDirector()->startAnimation();
}

.mm文件修改如下:

void DeviceManager::resumeAllSounds()
{
    dispatch_queue_t resumeQueue = dispatch_queue_create("resumeSound", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(resumeQueue, ^{
        CCLog("check resume");
        [NSThread sleepForTimeInterval:0.5];
        CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
        CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeAllEffects();
    });
}

以上为新添加的一个异步执行的代码块,用来添加延迟调用的效果,并保证在程序恢复前都被执行完成。避免程序多任务间的冲突问题。NSThread sleepForTimeInterval:0.5 函数就是延迟操作的代码。

至此就将音频无响应的问题解决了。

希望能给大家带来帮助!!!有什么问题需要讨论的可以评论私信欢迎讨论~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GameTomato

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值