You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

198 lines
6.2 KiB

//
// XHAudioPlayerHelper.m
// MessageDisplayKit
//
// Created by Aevitx on 14-1-22.
// Copyright (c) 2014年 Aevitx. All rights reserved.
//
#import "XHAudioPlayerHelper.h"
#import "XHVoiceCommonHelper.h"
#import <UIKit/UIKit.h>
@implementation XHAudioPlayerHelper
#pragma mark - Public Methed
- (void)managerAudioWithFileName:(NSString*)amrName toPlay:(BOOL)toPlay {
if (toPlay) {
[self playAudioWithFileName:amrName];
} else {
[self pausePlayingAudio];
}
}
//暂停
- (void)pausePlayingAudio {
if (_player) {
[_player pause];
if ([self.delegate respondsToSelector:@selector(didAudioPlayerPausePlay:)]) {
[self.delegate didAudioPlayerPausePlay:_player];
}
}
}
- (void)stopAudio {
[self setPlayingFileName:@""];
[self setPlayingIndexPathInFeedList:nil];
if (_player && _player.isPlaying) {
[_player stop];
}
[[UIDevice currentDevice] setProximityMonitoringEnabled:NO];
if ([self.delegate respondsToSelector:@selector(didAudioPlayerStopPlay:)]) {
[self.delegate didAudioPlayerStopPlay:_player];
}
}
#pragma mark - action
//播放转换后wav
- (void)playAudioWithFileName:(NSString*)fileName {
if (fileName.length > 0) {
//不随着静音键和屏幕关闭而静音。code by Aevit
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
if (_playingFileName && [fileName isEqualToString:_playingFileName]) {//上次播放的录音
if (_player) {
[_player play];
[[UIDevice currentDevice] setProximityMonitoringEnabled:YES];
if ([self.delegate respondsToSelector:@selector(didAudioPlayerBeginPlay:)]) {
[self.delegate didAudioPlayerBeginPlay:_player];
}
}
} else {//不是上次播放的录音
if (_player) {
[_player stop];
self.player = nil;
}
/*
[self convertAmrToWav:amrName];
NSString *wavName = [amrName stringByReplacingOccurrencesOfString:@"wavToAmr" withString:@"amrToWav"];
AVAudioPlayer *pl = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[XHVoiceCommonHelper getPathByFileName:fileName ofType:@"wav"]] error:nil];
*/
AVAudioPlayer *pl = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:fileName] error:nil];
pl.delegate = self;
[pl play];
self.player = pl;
[[UIDevice currentDevice] setProximityMonitoringEnabled:YES];
if ([self.delegate respondsToSelector:@selector(didAudioPlayerBeginPlay:)]) {
[self.delegate didAudioPlayerBeginPlay:_player];
}
}
self.playingFileName = fileName;
}
}
/*
#pragma mark - amr转wav
- (void)convertAmrToWav:(NSString*)amrName {
if (amrName.length > 0){
NSString *wavName = [amrName stringByReplacingOccurrencesOfString:@"wavToAmr" withString:@"amrToWav"];// [amrName stringByAppendingString:@"amrToWav"];
//转格式
[VoiceConverter amrToWav:[SCAudioRecordManager getPathByFileName:amrName ofType:@"amr"] wavSavePath:[SCAudioRecordManager getPathByFileName:wavName ofType:@"wav"]];
}
}
*/
#pragma mark - Getter
- (AVAudioPlayer*)player {
return _player;
}
- (BOOL)isPlaying {
if (!_player) {
return NO;
}
return _player.isPlaying;
}
#pragma mark - Setter
- (void)setDelegate:(id<XHAudioPlayerHelperDelegate>)delegate {
if (_delegate != delegate) {
_delegate = delegate;
if (_delegate == nil) {
[self stopAudio];
}
}
}
#pragma mark - Life Cycle
+ (id)shareInstance {
static XHAudioPlayerHelper *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[XHAudioPlayerHelper alloc] init];
});
return instance;
}
- (id)init {
self = [super init];
if (self) {
[self changeProximityMonitorEnableState:YES];
[[UIDevice currentDevice] setProximityMonitoringEnabled:NO];
}
return self;
}
- (void)dealloc {
[self changeProximityMonitorEnableState:NO];
}
#pragma mark - audio delegate
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
[self stopAudio];
if ([self.delegate respondsToSelector:@selector(didAudioPlayerStopPlay:)]) {
[self.delegate didAudioPlayerStopPlay:_player];
}
}
#pragma mark - 近距离传感器
- (void)changeProximityMonitorEnableState:(BOOL)enable {
[[UIDevice currentDevice] setProximityMonitoringEnabled:YES];
if ([UIDevice currentDevice].proximityMonitoringEnabled == YES) {
if (enable) {
//添加近距离事件监听,添加前先设置为YES,如果设置完后还是NO的读话,说明当前设备没有近距离传感器
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sensorStateChange:) name:UIDeviceProximityStateDidChangeNotification object:nil];
} else {
//删除近距离事件监听
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceProximityStateDidChangeNotification object:nil];
[[UIDevice currentDevice] setProximityMonitoringEnabled:NO];
}
}
}
- (void)sensorStateChange:(NSNotificationCenter *)notification {
//如果此时手机靠近面部放在耳朵旁,那么声音将通过听筒输出,并将屏幕变暗
if ([[UIDevice currentDevice] proximityState] == YES) {
//黑屏
DLog(@"Device is close to user");
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
} else {
//没黑屏幕
DLog(@"Device is not close to user");
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
if (!_player || !_player.isPlaying) {
//没有播放了,也没有在黑屏状态下,就可以把距离传感器关了
[[UIDevice currentDevice] setProximityMonitoringEnabled:NO];
}
}
}
@end