2011-09-08 46 views
7

Tôi đang cố gắng tìm ra cách phát hiện xem thiết bị âm thanh nào được kết nối trên iphone/ipad/ipod. Tôi biết tất cả về các cuộc gọi đường âm thanh và cuộc gọi lại thay đổi tuyến đường nhưng những điều này không cho tôi biết bất kỳ điều gì về nội dung được đính kèm. Họ chỉ báo cáo nơi âm thanh hiện đang định tuyến. Tôi cần phải biết, ví dụ, nếu tai nghe và/hoặc bluetooth vẫn được gắn trong khi âm thanh được định tuyến thông qua loa. Hoặc, ví dụ: nếu người dùng cắm tai nghe trong khi sử dụng bluetooth thì hãy quyết định ngắt kết nối bluetooth, tôi cần biết rằng bluetooth bị ngắt kết nối ngay cả khi âm thanh vẫn đang định tuyến qua tai nghe.Phát hiện thiết bị âm thanh đính kèm iOS

+1

Tôi gặp vấn đề tương tự trong ứng dụng, nếu tôi thay đổi đầu ra âm thanh (tai nghe chưa cắm), nó dừng phát .. bạn có biết cách phát hiện khi đầu ra âm thanh bị thay đổi không? –

+2

Có, phát hiện thay đổi tuyến đường được thực hiện thông qua gọi lại AudioSessionPropertyListener. Trình nghe thuộc tính sau đó được đăng ký thông qua chức năng AudioSessionAddPropertyListener. Tuy nhiên đó không phải là những gì tôi đã cố gắng làm ở trên. Trong ứng dụng của tôi, tôi cần phải phát hiện thiết bị nào được kết nối để hiển thị chính xác các tùy chọn định tuyến sẵn có cho người dùng. – Cliff

Trả lời

0

Bạn có thể nhận được từ các thuộc tính AudioSession danh sách các InputSources và OutputDestinations. Kiểm tra các thuộc tính Session:

kAudioSessionProperty_InputSources 
kAudioSessionProperty_OutputDestinations 

Và để truy vấn các thông tin chi tiết của mỗi, bạn có thể sử dụng:

kAudioSessionProperty_InputSource 
kAudioSessionProperty_OutputDestination 
+0

Các thuộc tính này dành cho các phụ kiện USB để chúng không áp dụng trong trường hợp của tôi. Tôi đang tìm cách phát hiện khi có tai nghe bluetooth hoặc tai nghe có dây. – Cliff

+0

Rất tiếc, xin lỗi, tôi thấy sự khác biệt trong câu hỏi của bạn ngay bây giờ. – MOK9

1

Trong trường hợp của iOS 5 bạn nên sử dụng:

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) 
} 
0

Thật không may , như iOS11, có vẻ như không có API để nhận danh sách các thiết bị đầu ra hiện tại một cách đáng tin cậy - ngay sau khi thay đổi tuyến đường hiện tại, bạn chỉ thấy 1 thiết bị (hiện được định tuyến) qua AVAu dioSession's currentRoute.outputs, mặc dù nhiều thiết bị vẫn có thể được đính kèm.

Tuy nhiên, đối đầu vào, và bao gồm các thiết bị Bluetooth với hồ sơ HFP, nếu chế độ âm thanh phiên thích hợp được sử dụng (AVAudioSessionModeVoiceChat hoặc AVAudioSessionModeVideoChat chẳng hạn), người ta có thể có được danh sách của các đầu vào có sẵn thông qua AVAudioSession của availableInputs, và những đầu vào được liệt kê ở đó ngay cả khi thiết bị đó không phải là tuyến đang hoạt động - điều này rất hữu ích khi người dùng đang thực hiện ghi đè thủ công qua số MPVolumeView từ Bluetooth sang loa, và từ HFP là IO 2 chiều (có cả hai đầu vào và đầu ra), bạn có thể đánh giá liệu đầu ra HFP Bluetooth vẫn có sẵn bằng cách xem các đầu vào.

BOOL isBtInputAvailable = NO; 
NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs]; 
for (AVAudioSessionPortDescription* port in inputs) { 
    if ([port.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) { 
     isBtInputAvailable = YES; 
     break; 
    } 
} 
Các vấn đề liên quan