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 ...
随机推荐
- Notepad++背景颜色设置
经常试用notepad++看代码,白色的背景连续看的时间长了眼睛很容变花,所以找了相关的设置选项,分享给大家 具体设置步骤如下: 然后如下设置 这样前景色背景色已经发生改变了哟,下面再修改下选中行的背 ...
- 浏览器缓存相关http头
近期看雅虎黄金34条,学习下优化站点性能的方法. 当中有一条:"为文件头指定Expires或Cache-Control",详细来说指对于静态内容:设置文件头过期时间Expires的 ...
- Vue.js快速入门
Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们 ...
- resolv.conf 是什么
From Wikipedia, the free encyclopedia This article does not cite any references or sources. Please h ...
- 表设计与SQL优化
1. 说说分区表的主要好处是什么,为什么会有这些好处. 分区功能能够将表.索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区.每个分区有自己的名称,还可以选择自己的存储特性. 从数据库管理员的 ...
- 在Red Hat Enterprise Linux 5 64-bit安装oracle11g r2
网上这种文档一搜就一堆,没别的目的,刚接触oracle为了加深理解记忆.只要是跟我的版本一样操作系统和oracle软件,按照步骤肯定可以成功安装 在虚拟机上安装Red Hat Enterprise L ...
- oc特有语法
分类 问题 1.什么是分类? 就是把一个类的功能,分出一部分来放在一个独立的文件中 2.分类的语法是什么样的? @interface Person(SuperMan) 3.分类与类是什么关系? 分类依 ...
- 类 的重载(Overloads)与隐藏(Shadows)
我在上篇文章中讲解了类 的继承和重写,如果想要在派生类中重写基类了方法或函数,那首先基类必须要有用 Overridable 关键字的公开声明的方法或函数,这样,基类的派生类才能用 Overrides ...
- js获取当期日期累加天数
本文是转载的,,忘记出处了,我用上了,也给大家分享一下 一.日期减去天数等于第二个日期 function cc(dd,dadd)...{//可以加上错误处理var a = new Date(dd)a ...
- %hd %d %ld %u ......
%d 有符号10进制整数 %ld 长整型 %hd短整型%md,m指定的是输出字段的宽度,默认左补空格, 如果数据的位数小于m,则左端补以空格,若大于m,则 按实际位数输出,如: printf(&quo ...