如何检测耳机是否连接到iPod touch G1?

时间:2009-08-06 13:08:24

标签: iphone core-audio ipod-touch ipod

有很多关于如何通过 AudioSessionGetProperty / kAudioSessionProperty_AudioInputAvailable 检测麦克风是否连接到iPod touch G2的文章,但我还没有看到任何与检测有关的文章连接到iPod touch G1的耳机。

要查看: iPod touch G2硬件与iPod touch G1硬件的区别在于以下几种方式:

  • iPod touch G2内置扬声器
  • iPod touch G2可以使用麦克风关闭耳机端口

我有一个应用程序,需要播放声音才有用,我希望自己很好,并且有一个探测器,显示应用程序在连接一些耳机后很有用。

我的初步测试显示,即使耳机未连接到iPod,AudioSession API(特别是 AudioSessionGetProperty kAudioSessionProperty_AudioRoute 常量)也会始终报告“耳机”触摸G1。

我错过了什么吗?我的AudioSession呼叫是否有交叉连线?如果有人在iPod touch G1上试过这个并获得了不同的结果?是否有另一种方法可以编织AudioSession API并获得我想要的东西?

这完全针对iPhone OS 3.0以及真正的iPod touch G1硬件上的iPhone OS 3.0 SDK。

提前致谢, --Batgar

5 个答案:

答案 0 :(得分:2)

您可以轻松使用此方法:

- (BOOL)isHeadsetPluggedIn {
UInt32 routeSize = sizeof (CFStringRef);
CFStringRef route;

OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute,
&routeSize,
&route);

if (!error && (route != NULL) && ([route isEqual:@"HeadsetInOut"])) {
return YES;
}

return NO;
}

答案 1 :(得分:1)

检查一下。

http://developer.apple.com/iphone/library/samplecode/SpeakHere/index.html#//apple_ref/doc/uid/DTS40007802

以下是录音源代码,支持在移除耳机时暂停播放,这可能对您有帮助。

答案 2 :(得分:1)

由于没有其他路线,kAudioSessionProperty_AudioRoute将始终返回第一代耳机。当耳机被拔出时,第二代和iphone以及其他所有将支持另一条路线(扬声器),但是第一代的另一条路线也是如此。

至少使用这个记录的API调用,你将无法检测到第一代ipod耳机状态。

答案 3 :(得分:0)

来自SpeakHere

  

error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable,& size,& inputAvailable);   if(error)printf(“ERROR GETTING INPUT AVAILABILITY!%d \ n”,错误);   btn_record.enabled =(inputAvailable)?是:否;

答案 4 :(得分:0)

上面的答案不起作用,因为它不编译,所以我发布这个,因为这可能会帮助一些人。您需要做的就是找到音频路线。以下是音频的可能路线

路线的已知值:

  • “耳机”
  • “耳机”
  • “免提”
  • “SpeakerAndMicrophone”
  • “HeadphonesAndMicrophone”
  • “HeadsetInOut”
  • “ReceiverAndMicrophone”
  • “线外”

希望这有帮助

  - (BOOL)isHeadsetPluggedIn {
UInt32 routeSize = sizeof (CFStringRef);
CFStringRef route;

OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute,
                                          &routeSize,
                                          &route);



if (!error && (route != NULL)) {

    NSString* routeStr = (__bridge NSString*)route;  //Convert CFStringRef to NSString
    NSRange routeRange = [routeStr rangeOfString:@"Head"];
    if (routeRange.location != NSNotFound){
         return YES;
    }

}
    return NO;
}