提交 302ff85a 编写于 作者: Z Zhang Rui

ios: replace AudioSession with AVAudioSession

上级 7d522da0
......@@ -24,6 +24,8 @@
#import "IJKAudioKit.h"
#import <AVFoundation/AVFoundation.h>
@implementation IJKAudioKit {
__weak id<IJKAudioSessionDelegate> _delegate;
......@@ -47,30 +49,24 @@
return;
}
OSStatus status = noErr;
if (!_audioSessionInitialized) {
status = AudioSessionInitialize(NULL,
kCFRunLoopCommonModes,
IjkAudioSessionInterruptionListener,
NULL);
if (status != noErr) {
NSLog(@"IJKAudioKit: AudioSessionInitialize failed (%d)", (int)status);
return;
}
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(handleInterruption:)
name: AVAudioSessionInterruptionNotification
object: [AVAudioSession sharedInstance]];
_audioSessionInitialized = YES;
}
/* Set audio session to mediaplayback */
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
status = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
if (status != noErr) {
NSLog(@"IJKAudioKit: AudioSessionSetProperty(kAudioSessionProperty_AudioCategory) failed (%d)", (int)status);
NSError *error = nil;
if (NO == [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error]) {
NSLog(@"IJKAudioKit: AVAudioSession.setCategory() failed: %@\n", error ? [error localizedDescription] : @"nil");
return;
}
status = AudioSessionSetActive(true);
if (status != noErr) {
NSLog(@"IJKAudioKit: AudioSessionSetActive(true) failed (%d)", (int)status);
error = nil;
if (NO == [[AVAudioSession sharedInstance] setActive:YES error:&error]) {
NSLog(@"IJKAudioKit: AVAudioSession.setActive(YES) failed: %@\n", error ? [error localizedDescription] : @"nil");
return;
}
......@@ -78,6 +74,33 @@
return ;
}
- (void)handleInterruption:(NSNotification *)notification
{
int reason = [[[notification userInfo] valueForKey:AVAudioSessionInterruptionTypeKey] intValue];
switch (reason) {
case AVAudioSessionInterruptionTypeBegan: {
NSLog(@"AVAudioSessionInterruptionTypeBegan\n");
dispatch_async(dispatch_get_main_queue(), ^{
[_delegate ijkAudioBeginInterruption];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
});
break;
}
case AVAudioSessionInterruptionTypeEnded: {
NSLog(@"AVAudioSessionInterruptionTypeEnded\n");
dispatch_async(dispatch_get_main_queue(), ^{
[_delegate ijkAudioEndInterruption];
@try {
[[AVAudioSession sharedInstance] setActive:NO error:nil];
} @catch (NSException *exception) {
NSLog(@"failed to inactive AVAudioSession\n");
}
});
break;
}
}
}
static void IjkAudioSessionInterruptionListener(void *inClientData, UInt32 inInterruptionState)
{
id<IJKAudioSessionDelegate> delegate = [IJKAudioKit sharedInstance]->_delegate;
......@@ -89,15 +112,19 @@ static void IjkAudioSessionInterruptionListener(void *inClientData, UInt32 inInt
NSLog(@"kAudioSessionBeginInterruption\n");
dispatch_async(dispatch_get_main_queue(), ^{
[delegate ijkAudioBeginInterruption];
AudioSessionSetActive(false);
[[AVAudioSession sharedInstance] setActive:YES error:nil];
});
break;
}
case kAudioSessionEndInterruption: {
NSLog(@"kAudioSessionEndInterruption\n");
dispatch_async(dispatch_get_main_queue(), ^{
AudioSessionSetActive(true);
[delegate ijkAudioEndInterruption];
@try {
[[AVAudioSession sharedInstance] setActive:NO error:nil];
} @catch (NSException *exception) {
NSLog(@"failed to inactive AVAudioSession\n");
}
});
break;
}
......
......@@ -25,6 +25,8 @@
#import "IJKSDLAudioQueueController.h"
#import "IJKSDLAudioKit.h"
#import <AVFoundation/AVFoundation.h>
#define kIJKAudioQueueNumberBuffers (3)
@implementation IJKSDLAudioQueueController {
......@@ -107,7 +109,11 @@
return;
_isPaused = NO;
AudioSessionSetActive(true);
NSError *error = nil;
if (NO == [[AVAudioSession sharedInstance] setActive:YES error:&error]) {
NSLog(@"AudioQueue: AVAudioSession.setActive(YES) failed: %@\n", error ? [error localizedDescription] : @"nil");
}
OSStatus status = AudioQueueStart(_audioQueueRef, NULL);
if (status != noErr)
NSLog(@"AudioQueue: AudioQueueStart failed (%d)\n", (int)status);
......@@ -119,9 +125,6 @@
return;
_isPaused = YES;
// Delay > 1 seconds on ios8
// Maybe we don't need this call in pause
// AudioSessionSetActive(false);
OSStatus status = AudioQueuePause(_audioQueueRef);
if (status != noErr)
NSLog(@"AudioQueue: AudioQueuePause failed (%d)\n", (int)status);
......@@ -137,7 +140,6 @@
- (void)stop
{
// AudioSessionSetActive(false);
if (!_audioQueueRef)
return;
......
......@@ -26,6 +26,8 @@
#include "ijkutil/ijkutil.h"
#import "IJKSDLAudioKit.h"
#import <AVFoundation/AVFoundation.h>
@implementation IJKSDLAudioUnitController {
AudioUnit _auUnit;
BOOL _isPaused;
......@@ -98,7 +100,7 @@
&streamDescription,
&i_param_size);
if (status != noErr) {
ALOGE("AudioUnit: failed to verify stream format (%d)", (int)status);
ALOGE("AudioUnit: failed to verify stream format (%d)\n", (int)status);
}
AURenderCallbackStruct callback;
......@@ -109,7 +111,7 @@
kAudioUnitScope_Input,
0, &callback, sizeof(callback));
if (status != noErr) {
ALOGE("AudioUnit: render callback setup failed (%d)", (int)status);
ALOGE("AudioUnit: render callback setup failed (%d)\n", (int)status);
self = nil;
return nil;
}
......@@ -119,7 +121,7 @@
/* AU initiliaze */
status = AudioUnitInitialize(auUnit);
if (status != noErr) {
ALOGE("AudioUnit: AudioUnitInitialize failed (%d)", (int)status);
ALOGE("AudioUnit: AudioUnitInitialize failed (%d)\n", (int)status);
self = nil;
return nil;
}
......@@ -140,8 +142,14 @@
return;
_isPaused = NO;
AudioSessionSetActive(true);
AudioOutputUnitStart(_auUnit);
NSError *error = nil;
if (NO == [[AVAudioSession sharedInstance] setActive:YES error:&error]) {
NSLog(@"AudioUnit: AVAudioSession.setActive(YES) failed: %@\n", error ? [error localizedDescription] : @"nil");
}
OSStatus status = AudioOutputUnitStart(_auUnit);
if (status != noErr)
NSLog(@"AudioUnit: AudioOutputUnitStart failed (%d)\n", (int)status);
}
- (void)pause
......@@ -150,12 +158,9 @@
return;
_isPaused = YES;
// Delay > 1 seconds on ios8
// Maybe we don't need this call in pause
// AudioSessionSetActive(false);
OSStatus status = AudioOutputUnitStop(_auUnit);
if (status != noErr)
ALOGE("AudioUnit: failed to stop AudioUnit (%d)", (int)status);
ALOGE("AudioUnit: failed to stop AudioUnit (%d)\n", (int)status);
}
- (void)flush
......@@ -168,8 +173,6 @@
- (void)stop
{
// AudioSessionSetActive(false);
if (!_auUnit)
return;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册