我正在尝试注册一个回调以发送到
AudioSessionAddPropertyListener
它会在音频属性发生更改时通知您(例如,拔下耳机)。
在iOS 文档和另一个论坛中,显示您可以将代码放在实现块之外,并使用调用来获取 ViewController,因此您可以访问实例变量。
一个简单的例子,将是这样的:
#import "ViewController.h"
#import <MediaPlayer/MediaPlayer.h>
#import <Foundation/Foundation.h>
void audioRouteChangeListenerCallback (
void *inUserData,
AudioSessionPropertyID inPropertyID,
UInt32 inPropertyValueSize,
const void *inPropertyValue
) {
ViewController *controller = (ViewController *) inUserData;
}
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
@end
所以在回调中,它告诉我需要桥接获取 ViewController 的调用。如果我这样做,我将无法访问某些变量。奇怪的是,我已经下载了 iOS 示例(上面链接)并且在这种情况下符合要求。我在这里做错了什么?
编辑:
如果我确实桥接调用以获取控制器实例,我会得到这个
ViewController *controller = (__bridge ViewController *) inUserData;
int isPlaying = controller->appSoundPlayer.playing;
我收到 appSoundPlayer 受保护的错误消息。我相信有一种方法可以在没有桥接的情况下做到这一点,因为正如我所说,苹果示例以某种方式编译,但我看不出我在做什么不同