1

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

回顾:iPod touch G2 硬件与 iPod touch G1 硬件在以下方面不同:

  • iPod touch G2 有一个内置扬声器
  • iPod touch G2 能够在耳机端口之外使用麦克风

我有一个需要播放声音才能发挥作用的应用程序,我想变得更好,并且有一个检测器,一旦连接了一些耳机,它就会显示该应用程序很有用。

我最初的试验表明,即使耳机未连接到 iPod touch G1 ,AudioSession API(特别是带有kAudioSessionProperty_AudioRoute常量的AudioSessionGetProperty )总是报告“耳机”。

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

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

提前致谢,--Batgar

4

5 回答 5

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;
}
于 2012-03-28T15:35:02.987 回答
1

kAudioSessionProperty_AudioRoute由于没有其他路线,因此将始终返回第一代耳机。拔下耳机时,第 2 代和 iphone 以及最重要的将支持另一条路线(扬声器),但请注意第一代中的另一条路线。

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

于 2009-10-31T05:32:53.947 回答
1

核实。

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

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

于 2009-10-31T05:06:51.150 回答
0

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

路线的已知值:

  • “耳机”
  • “耳机”
  • “扬声器”
  • “扬声器和麦克风”
  • 《耳机与麦克风》
  • “耳机输入输出”
  • “接收器和麦克风”
  • “线路输出”

希望这可以帮助

  - (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;
}
于 2014-07-02T12:50:34.117 回答
0

从这里说

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

于 2010-01-01T10:29:40.283 回答