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.
201 lines
6.2 KiB
201 lines
6.2 KiB
![]()
2 years ago
|
//
|
||
|
// XHAudioPlayerHelper.m
|
||
|
// MessageDisplayKit
|
||
|
//
|
||
|
// Created by Aevitx on 14-1-22.
|
||
|
// Copyright (c) 2014年 Aevitx. All rights reserved.
|
||
|
//
|
||
|
|
||
|
#import "XHAudioPlayerHelper.h"
|
||
|
#import "XHVoiceCommonHelper.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];
|
||
|
}
|
||
|
}
|
||
|
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
#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
|