监听耳机插拔设置语音播放重定向 & WebRTC & 音频播放路由初始化_audioroutechangelistenercallback-程序员宅基地

技术标签: iOS  

最近发现一种情况:当耳机插入的时候,如果启动使用音频设置播放路由模式为speaker的话不起作用。要监听耳机插拔,重新设置。

使用WebRTC音频功能,设置播放重定向的前提貌似是需要有语音在播放,所以在WebRTC设置时,收到有语音数据过来,然后设置播放路由(算是初始化)。然后在APP代码层做监听耳机插拔设置播放重定向解决由于耳机引起的一些问题。

//首先设置监听
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteChangeListenerCallback:) name:AVAudioSessionRouteChangeNotification object:nil];


/**
 监听影响语音播放的状态变化
 @param isLoudSpeaker
 */
- (void)audioRouteChangeListenerCallback:(NSNotification*)notification
{
    NSDictionary *interuptionDict = notification.userInfo;
    NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
    switch (routeChangeReason) {
        case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
//            NSLog(@"AVAudioSessionRouteChangeReasonNewDeviceAvailable");
            [self p_audioPropertySet:NO];
            NSLog(@"耳机插入");
            break;
        case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
//            NSLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable");
            NSLog(@"耳机拔出,停止播放操作");
            [self p_audioPropertySet:YES];
            break;
        case AVAudioSessionRouteChangeReasonCategoryChange:
            // called at start - also when other audio wants to play
            NSLog(@"AVAudioSessionRouteChangeReasonCategoryChange");
            break;
    }
}
- (void)p_audioPropertySet:(BOOL)isLoudSpeaker
{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *error = nil;

    if(isLoudSpeaker)
    {

        if (![audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionAllowBluetoothA2DP | AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:&error])
        {
            NSLog(@"AudioSession set mode error %@", error);
        }
        [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
    }
    else
    {
        if (![audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionAllowBluetoothA2DP | AVAudioSessionCategoryOptionMixWithOthers error:&error])
        {
            NSLog(@"AudioSession set mode error %@", error);
        }

        [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error];
    }

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36259863/article/details/77159710

智能推荐

Android NDK开发——人脸检测与静默活体检测_安卓 人脸检测-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏41次。安卓实现工业级静默活体检测,判别机器前出现的人脸是真实还是伪造。用于判别虚假人脸。_安卓 人脸检测

Java isDigit()-程序员宅基地

文章浏览阅读3.5k次,点赞4次,收藏20次。Java isDigit() 方法JAVA Character类1.用于判断指定字符是否是数字,返回boolean类型public static boolean isDigit(char ch)2.参数:字符3.测试:public class isDigit { /** * @param args */ public static void main(String[]..._java isdigit

Linux学习资料-基础正规表示法(grep)-程序员宅基地

文章浏览阅读79次。2019独角兽企业重金招聘Python工程师标准>>> ..._grep命令配合特殊符号进行各种查询。如:查找 /etc 底下只要含有 xyz 三个字符的任

Jena 解析 TTL格式文件-程序员宅基地

文章浏览阅读893次。import java.io.InputStream;import java.util.*;import org.apache.jena.rdf.model.Model;import org.apache.jena.rdf.model.ModelFactory;import org.apache.jena.rdf.model.RDFNode;import org.apa..._java 对 ttl文件进行解析

推荐系统中的双塔模型_双塔模型中的sigmoid-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏43次。文章目录1. 为什么要学习DSSM双塔模型2. DSSM模型理论知识2.1 DSSM模型的原理2.2 DSSM深度语义匹配模型整体结构2.2.1 输入层2.2.2 表示层2.2.3 匹配层2.3 DSSM模型的优缺点3. 推荐领域中的DSSM双塔模型3.1 从NLP领域跨界到推荐领域的DSSM3.2 朴素的DSSM双塔模型,20153.3 百度的双塔模型3.4 谷歌的双塔模型,20194. 实战广告推荐的双塔模型4.1 广告推荐业务场景4.2 广告推荐的DSSM双塔模型结构4.2.1 输入层4.2.2 表示_双塔模型中的sigmoid

JavaWeb学习——Servlet学习(Cookie、Session)_用cookie和session是用sevlet还是java-程序员宅基地

文章浏览阅读204次。JavaWeb学习——Servlet学习(Cookie、Session)1.Cookie和Session简单理解问题引出:我想大家都有这种经历,当我们在网页上访问一个网页时,比如博客,邮箱等一些需要登陆的网站。每当我们关闭浏览器,下次再进入该网站时我们还需要再登陆(当然有些浏览器可能会做处理,询问用户是否保存用户名和密码,这个是属于浏览器帮我们做的,不做考虑)。但是当我们登陆上去但是不关闭浏览..._用cookie和session是用sevlet还是java

随便推点

【计算机组成原理】第三章 Cache主存地址映射专题及练习_四路组相联映射-程序员宅基地

文章浏览阅读1.3w次,点赞39次,收藏303次。这里写自定义目录标题0. Cache工作原理1. 直接映射优缺点计算方法2. 全相联映射优缺点3. 组相联映射例题1.2.3.0. Cache工作原理1. 直接映射下面针对该映射方式,举一个小例子:当缓存接收到CPU发送来的主存地址后,只需根据中间c位字段(假设为00…01)找到缓存块1,然后根据字块1的”标记”是否与主存地址的高t位相符合,若符合且有效位为1(这里的有效位用来识别Cache存储块中的额数据是否有效,因为有时Cache中的数据是无效的,例如,在初始时刻Cache中的额内容为空,是_四路组相联映射

【数学建模】MATLAB_matlab的setvar-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。MATLAB一、基本介绍二级目录三级目录二、矩阵运算三、编程基础(1)四、编程基础(2)五、常见函数六、二维图形绘制七、三维图形绘制八、运算符九、流程控制语句十、其他常用函数十一、自定义函数十二、画图进阶一、基本介绍二级目录三级目录二、矩阵运算三、编程基础(1)四、编程基础(2)五、常见函数六、二维图形绘制七、三维图形绘制八、运算符九、流程控制语句十、其他常用函数十一、自定义函数十二、画图进阶..._matlab的setvar

VS2022 无法启动程序 不是有效的win32程序_vs不是有效的win32应用程序怎么解决-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏7次。VS2022 无法启动程序 不是有效的win32程序_vs不是有效的win32应用程序怎么解决

Unix/Linux/BSD 它们之间的关系以及各自派系的介绍_linux bsd简单描述-程序员宅基地

文章浏览阅读4k次,点赞11次,收藏30次。Unix 是什么电话发明人贝尔于 1877 年创建的美国贝尔电话公司,后来创建了一家子公司叫美国电信业公司,1900年美国电信业公司接管了贝尔公司的全部资产,成为母公司,改名为美国电话电报公司(AT&T),美国电话电报公司有个部门叫贝尔实验室,以肯•汤普森为首的贝尔实验室研究人员于 1969 年实现了一种分时操作系统的雏形,1970 年该系统正式取名为 UNIX。而肯•汤普森的同事丹尼斯•里奇发明了传说中的 C 语言,这是一种适合编写系统软件的高级语言,后来 UNIX 系统的绝大部分源代码都用 C_linux bsd简单描述

贝叶斯网络:Netica的使用记录_netica 逆向推理-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏27次。1. 节点的Name与Title区别。name是根据IDname的命名规则,只能用字母开头,随后跟数组、下划线。不能出现空格或者发音。Title突破了这一限制。系统首选Title,如果没有,用name作为节点名字。2. 节点的Status Value与 Table Value的区别。Status对应着状态的名字,可以是单词,Status Value表示状态对应的值。例如爆炸控制系统中“off”状态_netica 逆向推理

【GRU回归预测】基于麻雀算法优化空间注意力机制卷积神经网络结合门控循环单元SSA-CNN-GRU-SAM-Attention实现数据多维输入单输出预测附matlab代码-程序员宅基地

文章浏览阅读799次,点赞18次,收藏18次。本文提出了一种基于麻雀算法优化空间注意力机制卷积神经网络结合门控循环单元SSA-CNN-GRU-SAM-Attention的回归预测模型,用于解决数据多维输入单输出预测问题。该模型将麻雀算法与空间注意力机制卷积神经网络相结合,并加入门控循环单元GRU,以提高模型的预测精度和泛化能力。同时,该模型还采用了SAM注意力机制,进一步增强了模型对重要特征的提取能力。实验结果表明,该模型在多个数据集上取得了良好的预测性能,优于传统回归预测模型。

推荐文章

热门文章

相关标签