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 ...
 
随机推荐
- unity3d 捕获系统日志,来处理一些问题
			
注册系统日志回调,根据日志内容和类型处理一些特殊问题 using UnityEngine; using System.Collections; public class SetupVerificati ...
 - CodeForces 10D. LCIS 最长公共上升子序列模板题 + 打印路径
			
推荐一篇炒鸡赞的blog. 以下代码中有打印路径. #include <algorithm> #include <iostream> #include <cstring& ...
 - [转载]android中The connection to adb is down,问题和解决
			
原网址:http://blog.sina.com.cn/s/blog_5fc93373010164p3.html 今天我出现了第3个错误,于是百度了一下.感觉这篇博客对我挺有帮助,推荐给大家.以下是原 ...
 - Hibernate 查询:HQL查询(Hibernate Query Languge)
			
HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念. 使用HQL查询所有学生: public static void main(String[] args) { Sess ...
 - [Math]Sqrt(x)
			
Total Accepted: 75767 Total Submissions: 314003 Difficulty: Medium Implement int sqrt(int x). Comput ...
 - [Linked List]Copy List with Random Pointer
			
Total Accepted: 53943 Total Submissions: 209664 Difficulty: Hard A linked list is given such that ea ...
 - Java并发编程小记
			
1. Semaphore 信号量是一种计数器,用来保护一个或者多个共享资源的访问.如果线程要访问一个共享资源,必须先获得信号量.若内部计数器大于0,则减1,若等于0,则线程进入休眠直至计数器大于等于0 ...
 - webStorm 列编辑
			
webStorm可以像Sublime一样使用列编辑,只是区别在于webStorm只可以编辑连续列表. 按住alt键鼠标选择一列,然后输入文字就会编辑多行,这个功能很赞,比较实用
 - win8上安装 Pillow
			
1.确保正确安装pip(2.7.9默认安装) 2. pip install wheel 3.下载 pillow-*.whl 根据自己的电脑和python版本 地址 4.安装 pip install x ...
 - SQL Server 日志文件增长原因定位
			
方法 1.sys.databases; -------------------------------------------------------------------------------- ...