61 lines
1.8 KiB
Text
61 lines
1.8 KiB
Text
#import <Foundation/Foundation.h>
|
|
#import <AVFoundation/AVFoundation.h>
|
|
|
|
void (*gSuspendCallback)(bool suspend);
|
|
bool gIsSuspended = false;
|
|
|
|
extern "C" void RegisterSuspendCallback(void (*callback)(bool))
|
|
{
|
|
if (!gSuspendCallback)
|
|
{
|
|
gSuspendCallback = callback;
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserverForName:AVAudioSessionInterruptionNotification object:nil queue:nil usingBlock:^(NSNotification *notification)
|
|
{
|
|
bool began = [[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] intValue] == AVAudioSessionInterruptionTypeBegan;
|
|
|
|
if (began == gIsSuspended)
|
|
{
|
|
return;
|
|
}
|
|
if (@available(iOS 10.3, *))
|
|
{
|
|
if (began && [[notification.userInfo valueForKey:AVAudioSessionInterruptionWasSuspendedKey] boolValue])
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
gIsSuspended = began;
|
|
if (!began)
|
|
{
|
|
[[AVAudioSession sharedInstance] setActive:TRUE error:nil];
|
|
}
|
|
if (gSuspendCallback)
|
|
{
|
|
gSuspendCallback(began);
|
|
}
|
|
}];
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification *notification)
|
|
{
|
|
#ifndef TARGET_OS_TV
|
|
if (!gIsSuspended)
|
|
{
|
|
return;
|
|
}
|
|
#else
|
|
if (gSuspendCallback)
|
|
{
|
|
gSuspendCallback(true);
|
|
}
|
|
#endif
|
|
[[AVAudioSession sharedInstance] setActive:TRUE error:nil];
|
|
if (gSuspendCallback)
|
|
{
|
|
gSuspendCallback(false);
|
|
}
|
|
gIsSuspended = false;
|
|
}];
|
|
}
|
|
}
|