2012-04-16 16 views
7

Uygulama arka planda olduğunda sanal araç uygulamamın (bir MIDI klavye aracılığıyla) kullanılabilmesini sağlamak istiyorum. Bu, UIBackgroundModes'i "audio" olarak ayarlayarak ve AudioSessions'ın kategorisini AVAudioSessionCategoryPlayback'e ayarlayarak iyi çalışır. Ayrıca, Müzik çalar uygulaması ile karıştırmaya izin vermek için, kAudioSessionProperty_OverrideCategoryMixWithOthers özelliğini ayarlayın.kAudioSessionProperty_OverrideCategoryMixWithOthers kullanımı

Pil enerjisinden tasarruf etmek için, kullanıcının gerekmiyorsa arka plan çalışmasını kapatması önerilir. Yani benim app AVAudioSessionCategoryAmbient ve AVAudioSessionCategoryPlayback kategorisi (kAudioSessionProperty_OverrideCategoryMixWithOthers ile) arasında geçiş yapmak için bir anahtar var. kodu (hata ihmal sokulması) şu şekildedir:

NSString *category = supportsBackgroundOperation ? AVAudioSessionCategoryPlayback : AVAudioSessionCategoryAmbient; 

[session setCategory:category error:nil]; 

if (category == AVAudioSessionCategoryPlayback) { 
    UInt32 allowMixing = true; 
    AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); 
} 

Şimdi sorun: Müzik Uygulama arka planda oynuyor varsayalım. Kullanıcı, müzik çalara eşlik etmek için sanal enstrümanı (MIDI klavyesi aracılığıyla) çalıyor ve başka bir uygulamayı başlatmaya karar veriyor, enstrümanın neden oynatılmasının tadını çıkarmak için bir slayt gösterisi söyleyin. Böylece, uygulamamın ayarlar görünümüne gider ve arka plan çalışmasını etkinleştirir. Daha sonra yukarıdaki kod çalıştırılır. Boom, Müzik uygulaması sessizleşiyor. Anladığım kadarıyla, kAudioSessionProperty_OverrideCategoryMixWithOthers özelliği, kategorisini ayarladıktan sonra olarak ayarlanabiliyor, ancak kategoriyi AVAudioSessionCategoryPlayback olarak ayarladığımda, kAudioSessionProperty_OverrideCategoryMixWithOthers öğesini ayarlama şansım olmadan önce müzik çalar sistem tarafından susturuluyor.

Bu oldu mu? Bir şey yapılabilir mi? Kategoriyi değiştirmeden önce/sonra oturumu devre dışı bırakmaya/etkinleştirmeye çalıştım, ancak bu başka sorunlara yol açtı.

Markus

cevap

16

Bunu başarabilirsiniz. İlk önce ses oturumunuzu devre dışı bırakmak, ses oturumunuzun tüm özelliklerini ve sonra aktif ses oturumunu kurmak. Bu şekilde, diğer uygulamada çalınan müzik susturulmayacaktır.

// Initialize audio session 
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 

// Active your audio session 
[audioSession setActive: NO error: nil]; 

// Set audio session category 
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; 

// Modifying Playback Mixing Behavior, allow playing music in other apps 
OSStatus propertySetError = 0; 
UInt32 allowMixing = true; 

propertySetError = AudioSessionSetProperty (
         kAudioSessionProperty_OverrideCategoryMixWithOthers, 
         sizeof (allowMixing), 
         &allowMixing); 

// Active your audio session 
[audioSession setActive: YES error: nil]; 

Bu çözüm benim için çalışır. Fakat açıklamanızdan önce, kategoriyi değiştirmeden önce/sonra oturumu etkinleştirmeyi/devre dışı bırakmayı denediniz, ancak diğer sorunlara yol açtığınızı belirttiniz. Yukarıdaki gibi aynı şekilde devre dışı/aktif hale getirdiniz mi? Eğer öyleyse, diğer sıkıntılar hakkında daha fazla bilgi verin ve belki yardımcı olabilirim.

+0

mı? Belgelere göre: Parametreler beTaktif Uygulamanızın ses oturumunu aktif hale getirmek için YES veya bunu devre dışı bırakmak için HAYIR'ı kullanın. ' http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioSession_ClassReference/Reference/Reference.html Yoksa bir şey mi eksik? – Marc

+0

Ses oturumunu devre dışı bırakmak için önce AIP'yi ayarlamak için NO'yu geçiyorum, ardından özelliği değiştirin ve ses oturumunu tekrar etkinleştirmek için EVET'i setActive'a geçirin. –

+2

Yardımlarınız için teşekkürler ve yanıtımın geç kaldığı için üzgünüm. Aynı problemle başka bir uygulamada (farklı bir ses kategorisi olan AVAudioSessionCategoryPlayAndRecord ile) karşılaştım.Bunun nedeni, oturumu nasıl yapılandırdığım ve etkinleştirdiğim değil, oturum özelliklerini ayarlamadan önce ses grafiğini başlattığım gerçeğiydi. Oturum özelliklerini ilk olarak ayarladığımda (diğerleri ile karıştırın), ses grafiğini oluşturup, daha sonra oturumun etkinliğini ayarladıktan sonra diğer uygulamaların sesi kapatılmaz. – masi

17

iOS 6.0 beri

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; 
+1

'[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback withOptions: 0 error: nil];' – StilesCrisis

-6

Ben M0rph3v5 katılmamak kullanabilirsiniz. Eğer setactive NO geçmesi Neden

withOptions parametresi için tek geçerli değer AVAudioSessionInterruptionOptionShouldResume

+1

Yanlışsınız: http://developer.apple.com/library/ios/documentation/ AVFoundation/Reference/AVAudioSession_ClassReference/Reference/Reference.html # // apple_ref/doc/c_ref/AVAudioSessionCategoryOptions – Joshua

+0

xcode içinde deneyin. AVAudioSessionInterruptionOptionShouldResume dışında bir şey kullanırsanız bir derleme hatası alırsınız. –