iOS音频播放(二):AudioSession

(本文转自码农人生)
前言

- extern OSStatus AudioSessionInitialize(CFRunLoopRef inRunLoop,
- CFStringRef inRunLoopMode,
- AudioSessionInterruptionListener inInterruptionListener,
- void *inClientData);
- typedef void (*AudioSessionInterruptionListener)(void * inClientData, UInt32 inInterruptionState);
- extern OSStatus AudioSessionAddPropertyListener(AudioSessionPropertyID inID,
- AudioSessionPropertyListener inProc,
- void *inClientData);
- typedef void (*AudioSessionPropertyListener)(void * inClientData,
- AudioSessionPropertyID inID,
- UInt32 inDataSize,
- const void * inData);
- //AudioSession的AudioRouteChangeReason枚举
- enum {
- kAudioSessionRouteChangeReason_Unknown = 0,
- kAudioSessionRouteChangeReason_NewDeviceAvailable = 1,
- kAudioSessionRouteChangeReason_OldDeviceUnavailable = 2,
- kAudioSessionRouteChangeReason_CategoryChange = 3,
- kAudioSessionRouteChangeReason_Override = 4,
- kAudioSessionRouteChangeReason_WakeFromSleep = 6,
- kAudioSessionRouteChangeReason_NoSuitableRouteForCategory = 7,
- kAudioSessionRouteChangeReason_RouteConfigurationChange = 8
- };
- //AVAudioSession的AudioRouteChangeReason枚举
- typedef NS_ENUM(NSUInteger, AVAudioSessionRouteChangeReason)
- {
- AVAudioSessionRouteChangeReasonUnknown = 0,
- AVAudioSessionRouteChangeReasonNewDeviceAvailable = 1,
- AVAudioSessionRouteChangeReasonOldDeviceUnavailable = 2,
- AVAudioSessionRouteChangeReasonCategoryChange = 3,
- AVAudioSessionRouteChangeReasonOverride = 4,
- AVAudioSessionRouteChangeReasonWakeFromSleep = 6,
- AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory = 7,
- AVAudioSessionRouteChangeReasonRouteConfigurationChange NS_ENUM_AVAILABLE_IOS(7_0) = 8
- }
- + (BOOL)usingHeadset
- {
- #if TARGET_IPHONE_SIMULATOR
- return NO;
- #endif
- CFStringRef route;
- UInt32 propertySize = sizeof(CFStringRef);
- AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &route);
- BOOL hasHeadset = NO;
- if((route == NULL) || (CFStringGetLength(route) == 0))
- {
- // Silent Mode
- }
- else
- {
- /* Known values of route:
- * "Headset"
- * "Headphone"
- * "Speaker"
- * "SpeakerAndMicrophone"
- * "HeadphonesAndMicrophone"
- * "HeadsetInOut"
- * "ReceiverAndMicrophone"
- * "Lineout"
- */
- NSString* routeStr = (__bridge NSString*)route;
- NSRange headphoneRange = [routeStr rangeOfString : @"Headphone"];
- NSRange headsetRange = [routeStr rangeOfString : @"Headset"];
- if (headphoneRange.location != NSNotFound)
- {
- hasHeadset = YES;
- }
- else if(headsetRange.location != NSNotFound)
- {
- hasHeadset = YES;
- }
- }
- if (route)
- {
- CFRelease(route);
- }
- return hasHeadset;
- }
- + (BOOL)isAirplayActived
- {
- CFDictionaryRef currentRouteDescriptionDictionary = nil;
- UInt32 dataSize = sizeof(currentRouteDescriptionDictionary);
- AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, ¤tRouteDescriptionDictionary);
- BOOL airplayActived = NO;
- if (currentRouteDescriptionDictionary)
- {
- CFArrayRef outputs = CFDictionaryGetValue(currentRouteDescriptionDictionary, kAudioSession_AudioRouteKey_Outputs);
- if(outputs != NULL && CFArrayGetCount(outputs) > 0)
- {
- CFDictionaryRef currentOutput = CFArrayGetValueAtIndex(outputs, 0);
- //Get the output type (will show airplay / hdmi etc
- CFStringRef outputType = CFDictionaryGetValue(currentOutput, kAudioSession_AudioRouteKey_Type);
- airplayActived = (CFStringCompare(outputType, kAudioSessionOutputRoute_AirPlay, 0) == kCFCompareEqualTo);
- }
- CFRelease(currentRouteDescriptionDictionary);
- }
- return airplayActived;
- }
- extern OSStatus AudioSessionSetProperty(AudioSessionPropertyID inID,
- UInt32 inDataSize,
- const void *inData);
- UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
- AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,
- sizeof(sessionCategory),
- &sessionCategory);
- /* set session category */
- - (BOOL)setCategory:(NSString *)category error:(NSError **)outError;
- /* set session category with options */
- - (BOOL)setCategory:(NSString *)category withOptions: (AVAudioSessionCategoryOptions)options error:(NSError **)outError NS_AVAILABLE_IOS(6_0);
- //AudioSession的AudioSessionCategory枚举
- enum {
- kAudioSessionCategory_AmbientSound = 'ambi',
- kAudioSessionCategory_SoloAmbientSound = 'solo',
- kAudioSessionCategory_MediaPlayback = 'medi',
- kAudioSessionCategory_RecordAudio = 'reca',
- kAudioSessionCategory_PlayAndRecord = 'plar',
- kAudioSessionCategory_AudioProcessing = 'proc'
- };
- //AudioSession的AudioSessionCategory字符串
- /* Use this category for background sounds such as rain, car engine noise, etc.
- Mixes with other music. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryAmbient;
- /* Use this category for background sounds. Other music will stop playing. */
- AVF_EXPORT NSString *const AVAudioSessionCategorySoloAmbient;
- /* Use this category for music tracks.*/
- AVF_EXPORT NSString *const AVAudioSessionCategoryPlayback;
- /* Use this category when recording audio. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryRecord;
- /* Use this category when recording and playing back audio. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryPlayAndRecord;
- /* Use this category when using a hardware codec or signal processor while
- not playing or recording audio. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryAudioProcessing;
- //AudioSession的启动方法
- extern OSStatus AudioSessionSetActive(Boolean active);
- extern OSStatus AudioSessionSetActiveWithFlags(Boolean active, UInt32 inFlags);
- //AVAudioSession的启动方法
- - (BOOL)setActive:(BOOL)active error:(NSError **)outError;
- - (BOOL)setActive:(BOOL)active withFlags:(NSInteger)flags error:(NSError **)outError NS_DEPRECATED_IOS(4_0, 6_0);
- - (BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError **)outError NS_AVAILABLE_IOS(6_0);

- #import <Endian.h>
- NSString * OSStatusToString(OSStatus status)
- {
- size_t len = sizeof(UInt32);
- long addr = (unsigned long)&status;
- char cstring[5];
- len = (status >> 24) == 0 ? len - 1 : len;
- len = (status >> 16) == 0 ? len - 1 : len;
- len = (status >> 8) == 0 ? len - 1 : len;
- len = (status >> 0) == 0 ? len - 1 : len;
- addr += (4 - len);
- status = EndianU32_NtoB(status); // strings are big endian
- strncpy(cstring, (char *)addr, len);
- cstring[len] = 0;
- return [NSString stringWithCString:(char *)cstring encoding:NSMacOSRomanStringEncoding];
- }
- static void MyAudioSessionInterruptionListener(void *inClientData, UInt32 inInterruptionState)
- {
- AudioSessionInterruptionType interruptionType = kAudioSessionInterruptionType_ShouldNotResume;
- UInt32 interruptionTypeSize = sizeof(interruptionType);
- AudioSessionGetProperty(kAudioSessionProperty_InterruptionType,
- &interruptionTypeSize,
- &interruptionType);
- NSDictionary *userInfo = @{MyAudioInterruptionStateKey:@(inInterruptionState),
- MyAudioInterruptionTypeKey:@(interruptionType)};
- [[NSNotificationCenter defaultCenter] postNotificationName:MyAudioInterruptionNotification object:nil userInfo:userInfo];
- }
- - (void)interruptionNotificationReceived:(NSNotification *)notification
- {
- UInt32 interruptionState = [notification.userInfo[MyAudioInterruptionStateKey] unsignedIntValue];
- AudioSessionInterruptionType interruptionType = [notification.userInfo[MyAudioInterruptionTypeKey] unsignedIntValue];
- [self handleAudioSessionInterruptionWithState:interruptionState type:interruptionType];
- }
- - (void)handleAudioSessionInterruptionWithState:(UInt32)interruptionState type:(AudioSessionInterruptionType)interruptionType
- {
- if (interruptionState == kAudioSessionBeginInterruption)
- {
- //控制UI,暂停播放
- }
- else if (interruptionState == kAudioSessionEndInterruption)
- {
- if (interruptionType == kAudioSessionInterruptionType_ShouldResume)
- {
- OSStatus status = AudioSessionSetActive(true);
- if (status == noErr)
- {
- //控制UI,继续播放
- }
- }
- }
- }
iOS音频播放(二):AudioSession的更多相关文章
- iOS音频播放 (二):AudioSession 转
原文出处 :http://msching.github.io/blog/2014/07/08/audio-in-ios-2/ 前言 本篇为<iOS音频播放>系列的第二篇. 在实施前一篇中所 ...
- IOS 音频播放
iOS音频播放 (一):概述 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也因此对于iOS下的音频播放实现有了一定的研究.写这个系列的博客目的一方面希望能够抛砖 ...
- iOS音频播放(一):概述
(本文转自码农人生) 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改,我也因此对于iOS下的音频播放实现有了一定的研究.写这个 系列的博客目的一方面希望能够抛砖引玉 ...
- iOS音频播放 (五):AudioQueue
码农人生 ChengYin's coding life 主页 Blog 分类 Categories 归档 Archives 关于 About Weibo GitHub RSS Where there ...
- iOS音频播放、录音、视频播放、拍照、视频录制
随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...
- iOS音频播放概述
在iOS系统中apple对音频播放需要的操作进行了封装并提供了不同层次的接口 下面对其中的中高层接口进行功能说明: Audio File Services:读写音频数据,可以完成播放流程中的第2步: ...
- iOS音频播放 (四):AudioFile 转
原文出处 : http://msching.github.io/blog/2014/07/19/audio-in-ios-4/ 前言 接着第三篇的AudioStreamFile这一篇要来聊一下Audi ...
- iOS音频播放之AudioQueue(一):播放本地音乐
AudioQueue简单介绍 AudioStreamer说明 AudioQueue具体解释 AudioQueue工作原理 AudioQueue主要接口 AudioQueueNewOutput Audi ...
- iOS音频播放 (三):AudioFileStream 转
原文出处 :http://msching.github.io/blog/2014/07/09/audio-in-ios-3/ 前言 本来说好是要在第三篇中讲AudioFileStream和AudioQ ...
随机推荐
- XMPP通讯开发-仿QQ显示好友列表和用户组
在 XMPP通讯开发-服务器好友获取以及监听状态变化 中我们获取服务器上的用户好友信息,然后结合XMPP通讯开发-好友获取界面设计 我们将两个合并起来,首先获取用户组,然后把用户组用List ...
- NSNotificationCenter 传对象
[[NSNotificationCenter defaultCenter] postNotificationName:@"postCity" object:pro]; [[NSNo ...
- 逐渐深入地理解Ajax
Ajax的基本原理是:XMLHttpRequest对象(简称XHR对象),XHR为向服务器发送请求和解析服务器响应提供了流畅的接口.能够以异步方式从服务器获得更多信息.意味着用户不必刷新页面也能取得新 ...
- cocos2d-x(quick-lua)读取csv文件
一.准备一份csv文件 ID,Name,Des,Model ID,名字,描写叙述,图片模型 1,广告,www.benmutou.com,csv.png 2,否认,呵呵,广告什么的,我才不会加,good ...
- H5 视频直播相关技术
一.移动视频直播发展 大家首先来看下面这张图: 可以看到,直播从 PC 到一直发展到移动端,越来越多的直播类 App 上线,同时移动直播进入了前所未有的爆发阶段,但是对于大多数移动直播来说,还是要以 ...
- Properties的读取和写入
Properties是HashTable下的一个持久的属性集,没有泛型,key-value都是String类型.由于能与IO流结合使用,所以能方便地操作属性文件或者xml文件. 一.propertie ...
- ORACLE 横表与纵表
一.横表和纵表 横表:通常指我们平时在数据库中建立的表,是一种普通的建表方式. (主键.字段1.字段2......)如:时间.客户ID,基本通话费.漫游通话费,国内长途费.国际长途费... ...
- Java并发编程之volatile变量
volatile提供了弱同步机制,用来确保将变量更新通知到其它线程.volatile变量不会被缓存在寄存器中或者对其它处理器不可见的地方,因此在读取volatile变量时总会返回最新写入的值.可以想象 ...
- 如何使用NODEJS+REDIS开发一个消息队列
作者: RobanLee 原创文章,转载请注明: 萝卜李 http://www.robanlee.com MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应 ...
- Android Studio导入GitHub
方法一:引用开源项目的compile添加到gradle中http://www.zhihu.com/question/27027667 方法二:下载安装包引入:http://blog.csdn.net/ ...