iOS IM消息声音连声用延时解决

最近做IM消息, 接受到很多消息时, 如果播放声音, 会造成持续的连声, 可以这样解决, 用延时来做, 记录下 !

// 注册声音

- (void)registerSystemSound

{

    NSString *path1 = [[NSBundle mainBundle] pathForResource:@"sendmsg" ofType:@"caf"];

    NSString *path2 = [[NSBundle mainBundle] pathForResource:@"in" ofType:@"caf"];


    //注册声音到系统

    CFURLRef url1 = (__bridge CFURLRef)[NSURL fileURLWithPath:path1];

    AudioServicesCreateSystemSoundID(url1,&sendmsg_sound_id);

    

    CFURLRef url2 = (__bridge CFURLRef)[NSURL fileURLWithPath:path2];

    AudioServicesCreateSystemSoundID(url2,&receive_sound_id);

}

// 播放声音

- (void)playSound:(int)type

{

    if(_isSoundPlaying) {

        return;

    };

    

    _isSoundPlaying = YES;

     //这个是重点

    [self delayExecutePlaySoundTimeInterval:20.f completionCallBack:^{

        _isSoundPlaying = NO;

    }];


        // 添加音频结束时的回调

       AudioServicesAddSystemSoundCompletion(sendmsg_sound_id, NULL, NULL, completionCallback, (__bridge void *)(self));

        AudioServicesPlaySystemSound(sendmsg_sound_id);


}


//这样是每次都要注册一个声音, 播放完就注销了, 个人不建议这么做, 这个注销的可以写在dealloc中, 就是声音只需要注册一次就够了

static void completionCallback (SystemSoundID  mySSID, void* clientData)

{

    // 在播放结束后循环播放

//    AudioServicesPlaySystemSound(mySSID);

    // 移除完成后执行的函数
    AudioServicesRemoveSystemSoundCompletion(mySSID);
    
    // 释放声音对象以及相关的所有资源
    AudioServicesDisposeSystemSoundID(mySSID);

}

//延时操作

-(void)delayExecutePlaySoundTimeInterval:(CGFloat)timeInterval completionCallBack:(void(^)(void))completionBlock {

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeInterval * NSEC_PER_SEC));

    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

        completionBlock();

    });

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值