【问题标题】:How can I detect if headphones are connected to an iPod touch G1?如何检测耳机是否连接到 iPod touch G1?
【发布时间】:2010-11-17 08:21:14
【问题描述】:

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

复习: iPod touch G2 硬件在以下方面与 iPod touch G1 硬件不同:

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

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

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

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

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

提前致谢, --蝙蝠侠

【问题讨论】:

    标签: iphone core-audio ipod-touch ipod


    【解决方案1】:

    检查一下。

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

    这是录音的源代码,支持摘下耳机时暂停播放,这可能对你有所帮助。

    【讨论】:

      【解决方案2】:

      kAudioSessionProperty_AudioRoute 将始终返回第一代耳机,因为没有其他路线。 2nd gen and iphone and above all will support another route (speaker) when the听筒被拔掉,但在第一代有另一条路线。

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

      【讨论】:

      • 核心问题是即使没有插入耳机,它也总是报告“耳机”。
      • 正确。这就是我要说的。该方法不会告诉您是否插入了耳机。它会告诉你声音被传送到哪里。由于此设备没有内置扬声器,因此它始终将声音传送到耳机 - 即使没有连接耳机。
      【解决方案3】:

      从这里说

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

      【讨论】:

        【解决方案4】:

        你可以用这个方法轻松搞定:

        - (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;
        }
        

        【讨论】:

        • 此方法无法编译。错误的接收器类型'CFStringRef'(又名'const struct __CFString *')
        • @Sabobin: 不,你做错了什么,因为这个方法已经过测试并且我在我的一个项目中使用了相同的代码.....所以请检查一次并解决你的问题...... ..希望你能成功...!
        【解决方案5】:

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

        路由的已知值:

        • “耳机”​​li>
        • “耳机”​​li>
        • “演讲者”
        • “扬声器和麦克风”
        • “耳机和麦克风”
        • “耳机输入输出”
        • “接收器和麦克风”
        • “边线”

        希望对你有帮助

          - (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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 2020-08-17
          • 2015-12-22
          • 2020-11-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多