【发布时间】:2012-04-21 02:34:11
【问题描述】:
我意识到没有任何关于使用 isight 光传感器的公开文档,但是诸如 ShadowBook (shown here) 之类的程序能够访问亮度数据,我只是想知道是否有人能够实现类似的结果并知道如何访问此传感器?谢谢!
【问题讨论】:
标签: objective-c xcode macos cocoa isight
我意识到没有任何关于使用 isight 光传感器的公开文档,但是诸如 ShadowBook (shown here) 之类的程序能够访问亮度数据,我只是想知道是否有人能够实现类似的结果并知道如何访问此传感器?谢谢!
【问题讨论】:
标签: objective-c xcode macos cocoa isight
您可以通过 IOKit 库中的 IOService 访问光传感器。光传感器的名称是“AppleLMUController”。这是一个很好的例子:light sensor。
简单来说,获取这样的服务:io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleLMUController"));
然后,使用以下命令连接到服务:
io_connect_t port = 0;
IOServiceOpen(service, mach_task_self(), 0, &port);
使用以下命令获取光照水平:IOConnectMethodScalarIScalarO(port, 0, 0, 2, &left, &right);
其中left 和right 是现在保存传感器光照水平的整数。
请注意,许多 IOService 方法返回一个 kern_return_t 变量,该变量将保存 KERN_SUCCESS,除非该方法失败。还要确保使用IOObjectRelease(service);释放服务对象
编辑:再想一想,IOConnectMethodScalarIScalarO() 似乎已被弃用。
相反,使用:
uint32_t outputs = 2;
uint64_t values[outputs];
IOConnectCallMethod(port, 0, nil, 0, nil, 0, values , &outputs, nil, 0);
左值和右值将分别存储在values[0] 和values[1] 中。请注意,并非所有 MacBook 都以这种方式工作:在我的 2010 年中期 15'' pro 上,这两个值是相同的,因为光传感器位于 iSight 摄像头中。
【讨论】:
NSLog(@"right %f", values);?我将如何格式化左/右?
NSLog(@"Left:%i, Right:%i", (int)values[0], (int)values[1]); 就足够了。我认为使用values 作为数组将解决您的数字不更新问题。如果没有,我可以给你发一个我做的简单例子。