Skip to content

Commit f363790

Browse files
committed
[测试] 增加AudioInterrupted事件
1 parent 4eb5581 commit f363790

3 files changed

Lines changed: 79 additions & 4 deletions

File tree

Plugins/CS/Audio.cs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,49 @@ namespace iOSNativePlugin
88
{
99
public static class Audio
1010
{
11-
[DllImport("__Internal")] static extern float Audio_Init(Action OnAudioSessionRouteChangedCallback);
11+
[DllImport("__Internal")] static extern void Audio_Init(Action audioSessionRouteChangedCallback,
12+
ULongCallback audioInterruptionCallback);
1213
[DllImport("__Internal")] static extern float Audio_SystemVolume();
1314
[DllImport("__Internal")] static extern double Audio_InputLatency();
1415
[DllImport("__Internal")] static extern double Audio_OutputLatency();
1516
[DllImport("__Internal")] static extern double Audio_SampleRate();
1617
[DllImport("__Internal")] static extern bool Audio_IsBluetoothHeadphonesConnected();
1718
[DllImport("__Internal")] static extern void Audio_SetAudioExclusive(bool exclusive);
1819

19-
static Action onAudioSessionRouteChangedEvent;
20+
21+
static bool inited;
22+
static void Init()
23+
{
24+
if (inited) return;
25+
Audio_Init(OnAudioSessionRouteChanged, OnAudioInterruption);
26+
inited = true;
27+
}
28+
29+
#region AudioInterruption
30+
31+
static Action<AVAudioSessionInterruptionType> audioInterruptionEvent;
32+
33+
/// <summary>
34+
/// 游戏音频干扰与恢复事件
35+
/// </summary>
36+
public static event Action<AVAudioSessionInterruptionType> AudioInterruptionEvent
37+
{
38+
add
39+
{
40+
Init();
41+
audioInterruptionEvent += value;
42+
}
43+
remove => audioInterruptionEvent -= value;
44+
}
45+
46+
[MonoPInvokeCallback(typeof(ULongCallback))]
47+
static void OnAudioInterruption(ulong type)
48+
{
49+
audioInterruptionEvent?.Invoke((AVAudioSessionInterruptionType)type);
50+
}
51+
52+
#endregion
53+
2054
#region AudioSessionRouteChanged
2155

2256
static Action audioSessionRouteChangedEvent;

Plugins/CS/Utils.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@ public static unsafe string PtrToStr(char* ptr)
3636
delegate void CompletionCallback();
3737
delegate void UserSettingsChangeCallback();
3838
delegate void LongCallback(long value);
39+
delegate void ULongCallback(ulong value);
40+
41+
/// Values for AVAudioSessionInterruptionTypeKey in AVAudioSessionInterruptionNotification's
42+
/// userInfo dictionary.
43+
public enum AVAudioSessionInterruptionType : ulong
44+
{
45+
Began = 1, // the system has interrupted your audio session
46+
Ended = 0, // the interruption has ended
47+
}
3948

4049
public enum UIContentSizeCategory
4150
{

Plugins/Native/Implementations/Audio.mm

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33

44
@implementation Audio
55

6-
static Action onAudioSessionRouteChangedEvent;
76
static Action audioSessionRouteChangedEvent;
7+
static ULongCallback audioInterruptionEvent;
88
static BOOL inited;
99

10-
+(void)Init:(Action)OnAudioSessionRouteChangedCallback
10+
+(void)Init:(Action)audioSessionRouteChangedCallback
11+
audioInterruptionCallback:(ULongCallback)audioInterruptionCallback
1112
{
1213
if(inited)
1314
return;
@@ -16,9 +17,40 @@ +(void)Init:(Action)OnAudioSessionRouteChangedCallback
1617
selector: @selector(OnAudioSessionRouteChanged:)
1718
name: AVAudioSessionRouteChangeNotification
1819
object: nil];
20+
21+
audioInterruptionEvent = audioInterruptionCallback;
22+
[[NSNotificationCenter defaultCenter] addObserver: [Audio class]
23+
selector: @selector(OnAudioInterruptionEvent:)
24+
name: AVAudioSessionInterruptionNotification
25+
object: nil];
1926
inited = YES;
2027
}
2128

29+
//static BOOL audioInterrupted;
30+
31+
32+
+(void)OnAudioInterruptionEvent:(NSNotification *)notification
33+
{
34+
auto userInfo = notification.userInfo;
35+
auto typeValue = [userInfo[AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
36+
auto type = (AVAudioSessionInterruptionType)typeValue;
37+
38+
//audioInterrupted = type == AVAudioSessionInterruptionTypeBegan;
39+
40+
/*switch (type) {
41+
case AVAudioSessionInterruptionTypeBegan:
42+
audioInterrupted = true;
43+
break;
44+
45+
default:
46+
audioInterrupted = false;
47+
break;
48+
}*/
49+
50+
if(audioInterruptionEvent != nil)
51+
audioInterruptionEvent(typeValue);
52+
}
53+
2254
+(void)OnAudioSessionRouteChanged:(NSNotification *)notification
2355
{
2456
if(audioSessionRouteChangedEvent != nil)

0 commit comments

Comments
 (0)