2010-06-17 43 views
8

我知道,我必須將AudioSession設置爲「播放」類別,即使靜音開關打開時也允許使用音頻。這就是我所做的,但開關打開時,聲音仍會消失。PlaySystemSound與靜音開關

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory); 

SystemSoundID soundID; 
NSString *path = [[NSBundle mainBundle] pathForResource:soundString ofType:@"wav"];  

AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID); 
AudioServicesPlaySystemSound (soundID); 


編輯:順便說一下,該應用程序是一個soundpad。播放聲音是應用程序的唯一目的。下面是蘋果文件說一下:

使用此類別的應用程序 其音頻播放是首要 重要性。即使 屏幕鎖定並且 鈴聲/靜音開關設置爲無聲,您的音頻也會播放。


編輯2:與靜音開關,聲音甚至不會通過耳機播放。 我知道用戶是王。我知道靜音開關有其目的。這不是問題。我試圖得到一個答案,將AudioSession類別設置爲kAudioSessionCategory_MediaPlayback沒有預期的結果。


編輯3:以下喬納森Watmough的建議下,我設置了AudioServiceskAudioServicesPropertyIsUISound財產,但仍然沒有運氣。我錯過了什麼嗎?

// set the session property 
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory); 

// creates soundID 
SystemSoundID soundID; 
NSString *path = [[NSBundle mainBundle] pathForResource:soundString ofType:@"wav"];  
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID); 

// Jonathan Watmough suggestion 
UInt32 flag = 0; 
AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(UInt32), &soundID, sizeof(UInt32), &flag); 

AudioServicesPlaySystemSound (soundID); 
+0

顯得完全是惡意的,當用戶靜音自己的手機來播放聲音。如果系統級別的東西不這樣做,爲什麼你的應用程序。除非你的應用程序是「核反應堆崩潰警告」,否則我認爲沒有理由爲什麼應該允許你的應用程序中斷會議,婚禮或有噪音的葬禮。 – 2010-06-17 02:26:49

+0

從Apple Doc:「將此類別用於音頻播放非常重要的應用程序。即使屏幕鎖定並且Ring/Silent開關設置爲無聲,您的音頻仍會播放。」 – samvermette 2010-06-17 02:28:41

+0

那麼什麼歸類爲您的首要重要?我想在一天結束時他們已經打開你的應用程序,因爲我忘記了你的應用程序不能在沒有打開它的情況下執行操作,但即使它們的手機靜音並且聽不到任何似乎期望的行爲的噪聲,它仍然可以。 – 2010-06-17 02:31:48

回答

4

好上添加喬納森Watmough的答案,事實上,它似乎並不可能讓AudioServicesSystemSound覆蓋靜音開關。我最終做的是使用OpenAL來播放聲音,這將在您指定的音頻會話類別後播放。下面是我設置的音頻會議:

AudioSessionInitialize(NULL, NULL, NULL, NULL); 
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory); 
AudioSessionSetActive(YES); 

要播放的聲音,我用Finch,一個簡單的基於OpenAL的聲音效果播放器的iPhone。

+0

謝謝你的回答。我做了一個測試,你是對的,使用芬奇使用O即使使用kAudioSessionCategory_MediaPlayback設置了靜音,penAL也能讓您播放聲音(如此常數的文檔中所述)。 – yonel 2011-03-18 17:07:13

1

我還沒有嘗試過,但你可能要改變你的加載的聲音屬性:

kAudioServicesPropertyIsUISound 一個UInt32的值,其中1 意味着,對於音頻文件由在inSpecifier參數中傳遞的系統聲音指定,System Sound服務器尊重Sound Effects首選項中的用戶設置,並在用戶關閉音效時保持沉默。 默認情況下,此屬性設置爲1。 無論用戶在聲音首選項中的設置如何,系統聲音在傳遞到AudioServicesPlaySystemSound時始終播放時設置爲0。 適用於iPhone OS 2.0及更高版本。 在AudioServices.h中聲明。

我希望完成所有其他的事情,將屬性設置爲0會告訴系統您的聲音是應用程序聲音,而不是'UI'聲音,因此可能會導致靜音。

編輯:它看起來不能用系統聲音來完成。如果你經過OpenAL,你顯然可以使用靜音按鈕進行播放。

我構建了SysSound示例,並添加了以下代碼來設置標誌,如上所述,並且它根本不播放靜音。

// Set the sound to always play 
    int setTo0 = 0; 
    AudioServicesSetProperty(kAudioServicesPropertyIsUISound,0,nil, 
          4,&setTo0);
+0

認爲這是它,但沒有:(請參閱我原來的帖子編輯3 – samvermette 2010-06-17 15:58:35

+0

是的,這是我的想法。請強調這一事實的答案,它不能用SystemSound(建議OpenAL)完成,所以我可以接受你的答案。非常感謝您的幫助! – samvermette 2010-06-18 19:10:00

+0

這段代碼是錯誤的。您需要傳遞一個SystemSoundID作爲第二個和第三個參數。 – matt 2011-01-08 19:54:28

0

你打電話setActive:error:爲AVAudioSession某處權利?這是我用來初始化的代碼。但我沒有使用系統聲音,我使用AVAudioPlayer播放聲音。

avSession = [AVAudioSession sharedInstance]; // init session, important 

// allow other audio to mix, such as iPod 
const UInt32 categoryProp = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(categoryProp), &categoryProp); 

UInt32 category = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category); 

// Allow our audio to mix with any iPod audio that is playing 
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(setProperty_YES), &setProperty_YES); 

[avSession setActive:YES error:nil]; 
0

我找不到它在文檔中明確提到,但我期望AudioServicesPlaySystemSound()會忽略您的音頻會話配置。

如果你想控制你需要使用AVAudioPlayer會話混合和其他屬性,而不是如:

NSError *err; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayback error:&err]; 
[session setActive:YES error:&err]; 

NSString *path = [[NSBundle mainBundle] pathForResource:@"Basso" ofType:@"aiff"];  
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&err]; 
[player prepareToPlay]; 
[player play]; 
+0

我正在播放不應該與AVAudioPlayer一起播放的超級短音。AudioServicesPlaySystemSound或OpenAL是2合適的聲音引擎可以播放短暫的聲音 – samvermette 2010-06-24 06:37:39

+0

那麼你不能使用AudioServicesPlaySystemSound作爲「系統」來控制會話混音選項,包括靜音。我看不出一種方法來規避這種情況,儘管它有時可以非常方便 – Crufty 2010-06-25 07:36:53

0

我使用下面的代碼來解決我的問題

AudioSessionInitialize(NULL, NULL, NULL, NULL); UInt32 
sessionCategory = kAudioSessionCategory_MediaPlayback;  
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), 
&sessionCategory); AudioSessionSetActive(YES);