7

Được rồi, tôi đã xác định AVAudioSession với những điều sau (có, trộn các cuộc gọi c và obj-c) Cũng lưu ý rằng ứng dụng có âm thanh chế độ nền, vì nếu ghi âm phải tiếp tục làm như vậy trong khi các ứng dụng đang ở chế độ nền:Đầu ra chuyển đổi AVAudioSession/Audio Session Services

[(AVAudioSession *)[AVAudioSession sharedInstance] setDelegate: self]; 
// Allow the app sound to continue to play when the screen is locked. 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
//Turn off automatic gain on the microphone 
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeMeasurement error:nil]; 
//Turn on the ability to mix with others 
UInt32 doSetProperty = 1; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty); 

//Activate the audio session 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

ứng dụng có các tùy chọn khác nhau cho âm thanh (chỉ có hai đầu tiên đã được lập trình):

  • bình thường: không có âm thanh từ ứng dụng, vì vậy don không gây rối với âm thanh bên ngoài
  • Chỉ ghi âm micrô tai nghe: không có điều chỉnh độ lợi và không gây rối với âm thanh bên ngoài (sẽ phát qua tai nghe)
  • Phát nhạc từ trong ứng dụng mà không cần ghi: Dừng âm thanh bên ngoài và phát qua hiện tại đầu ra (loa hoặc tai nghe)
  • chơi nhạc từ trong ứng dụng và ghi lại tai nghe mic: Dừng bên ngoài âm thanh, ghi âm và chơi chỉ thông qua tai nghe

Buổi ghi hình đang làm việc tốt trong foreground và background, và tôi sẽ thêm chơi sau. Tuy nhiên, tôi mới nhận thấy rằng nếu âm thanh đang phát (Pandora) trên loa lớn và tôi vào ứng dụng và kích hoạt chế độ ghi thì nó sẽ chuyển Pandora sang chơi qua loa điện thoại và thậm chí sau khi âm thanh bị tắt và ứng dụng được tạo nền (nhưng không bị buộc phải đóng) âm thanh tiếp tục phát qua loa điện thoại cho đến khi tôi buộc đóng ứng dụng.

//Deactivate the audio session 
[[AVAudioSession sharedInstance] setActive:NO error:nil]; 

Ở bên flip, nếu tai nghe là trong và đang phát nhạc qua tai nghe khi ứng dụng được bắt đầu vào chế độ ghi âm, sau đó chỉ có một khoảng dừng ngắn và âm nhạc tiếp tục chơi tại cùng một khối lượng (chính xác, không có vịt).

Tôi không thấy bất kỳ lý do nào khiến tuyến đường thay đổi khi tôi kích hoạt phiên âm thanh mà không cần tai nghe và tại sao nó không thay đổi trở lại khi phiên bị hủy kích hoạt. Đặc biệt là thay đổi loa điện thoại! Có điều gì đó mà tôi đang làm sai, hay tôi chỉ cần xác định AVAudioSession khác nhau tùy thuộc vào những gì người dùng muốn làm (thay vì vở kịch + bản ghi và chế độ đo lường)? Và ngay cả khi tôi cần phải xác định nó một cách riêng biệt cho các trường hợp sử dụng khác nhau. Ví dụ: âm thanh sẽ di chuyển qua tai nghe nếu ứng dụng đang ghi và nếu ứng dụng không ghi, thì đầu ra âm thanh là tai nghe hoặc loa lớn (tùy thuộc vào người dùng có cắm tai nghe hay không - tức là, hành vi bình thường).

Chi tiết bổ sung

Được rồi, tôi đã cố gắng chuyển đổi tất cả các mã c và nhận thấy một lưu ý chôn trong các tài liệu về kAudioSessionProperty_OverrideAudioRoute

kAudioSessionOverrideAudioRoute_None
Chỉ định, đối với các loại kAudioSessionCategory_PlayAndRecord, mà âm thanh đầu ra nên đi đến người nhận. Đây là tuyến âm thanh đầu ra mặc định cho danh mục này.

Vì vậy, sau đó tôi cố gắng thiết lập thuộc tính này (những tài sản) trong 3 cách khác nhau:

  • kAudioSessionProperty_OverrideAudioRoute với kAudioSessionOverrideAudioRoute_Speaker tiếp tục chơi âm thanh, nhưng chuyển nó ra thông qua việc tiếp nhận, và cho thấy con đường như ReceiverAndMicrophone
  • kAudioSessionProperty_OverrideCategoryDefaultĐối với kAudioSessionOverrideAudioRoute_Speaker dừng âm thanh hiện đang phát và hiển thị tuyến đường dưới dạng LoaAndMicrophone
  • kAud ioSessionProperty_OverrideCategoryDefaultToSpeaker với giá trị bằng 1 tương tự như kAudioSessionOverrideAudioRoute_Speaker

Vì vậy, về cơ bản các tài liệu nói rằng mặc định là chuyển sang người nhận. Tuy nhiên, không có vấn đề gì tôi làm, tôi dường như không thể giữ đầu ra Loa và giữ cho âm thanh bên ngoài chơi.

+0

Xin chào ... Bạn có giải pháp nào không? Tôi đang đối mặt với cùng một vấn đề ở đây. –

Trả lời

8

Dường như thứ tự thiết lập thuộc tính quan trọng, mặc dù không có đề cập đến điều này trong tài liệu. Đối với những người tìm thấy điều này cuối cùng, đây là những gì hoạt động:

//Init and set the interrupt listener. last parameter is passed to interruptlistener 
AudioSessionInitialize(NULL, NULL, interruptlistener, NULL); 

//Allow the app sound to continue to play when the screen is locked. 
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); 

//Force current audio out through speaker 
UInt32 routeSpeaker = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(routeSpeaker), &routeSpeaker); 

//Turn on the ability to mix with others 
UInt32 doSetProperty = 1; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);