簡體   English   中英

檢測連接的音頻設備iOS

[英]Detect attached audio devices iOS

我正在試圖弄清楚如何在iphone / ipad / ipod上連接哪個音頻設備。 我知道有關音頻路由呼叫和路由更改回調的所有內容,但這些並沒有告訴我任何關於附加內容的信息。 它們僅報告音頻當前路由的位置。 例如,我需要知道,當音頻通過揚聲器路由時,耳機和/或藍牙是否仍然連接。 或者,例如,如果用戶在使用藍牙時插入耳機然后決定斷開藍牙,我需要知道即使音頻仍然通過耳機路由,藍牙也會斷開連接。

不幸的是,從iOS11開始,似乎沒有API可靠地獲取當前連接的輸出設備列表 - 只要當前路由發生變化,您只能通過AVAudioSession的currentRoute.outputs看到1個設備(當前路由),即使仍可連接多個設備。

但是,對於輸入,包括具有HFP配置文件的藍牙設備,如果使用正確的音頻會話模式(例如AVAudioSessionModeVoiceChatAVAudioSessionModeVideoChat ),可以通過AVAudioSession的availableInputs可用輸入的列表,並在那里列出那些輸入即使該設備不是活動路由 - 例如,當用戶通過MPVolumeView從藍牙到揚聲器進行手動覆蓋時,這非常有用,並且由於HFP是雙向IO(具有輸入和輸出),您可以通過查看輸入來判斷輸出HFP藍牙是否仍然可用。

BOOL isBtInputAvailable = NO;
NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs];
for (AVAudioSessionPortDescription* port in inputs) {
    if ([port.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) {
        isBtInputAvailable = YES;
        break;
    }
}

對於iOS 5,您應該使用:

CFStringRef newRoute;
size = sizeof(CFStringRef);
XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute), "couldn't get new audio route");
if (newRoute)
{
    CFShow(newRoute);
    if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), NULL) == kCFCompareEqualTo) // headset plugged in
          {
            colorLevels[0] = .3;                
            colorLevels[5] = .5;
          }
    else if (CFStringCompare(newRoute, CFSTR("SpeakerAndMicrophone"), NULL) == kCFCompareEqualTo)
}

您可以從AudioSession屬性獲取InputSources和OutputDestinations的列表。 查看這些會話屬性:

kAudioSessionProperty_InputSources
kAudioSessionProperty_OutputDestinations

並查詢每個細節,您可以使用:

kAudioSessionProperty_InputSource
kAudioSessionProperty_OutputDestination

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM