天天看點

系統聲音服務與震動

系統聲音服務(System Sound Services)提供了一個接口,用于播放不超過30秒的聲音。它支援的檔案格式有限,具體地說隻有CAF、AIF和使用PCM或IMA/ADPCM資料的WAV檔案。由于這些函數沒有提供操縱聲音和控制音量的功能,是以當你為多媒體或者遊戲建立專門的配樂時,不要使用系統聲音服務。

iOS使用系統聲音服務來支援三種不同的通知:

1. 聲音:立刻播放一個簡單的聲音檔案。如果手機被設定為靜音,使用者什麼也聽不到

2. 提醒:播放一個聲音檔案,如果手機被設定為靜音或震動,将通過震動提醒使用者

3. 震動:震動手機,而不考慮其他設定

要在項目中使用系統聲音服務,首先要導入AudioToolbox.h

#import <AudioToolbox/AudioToolbox.h>      

系統聲音服務并非是通過類實作的,而是使用傳統的C語言函數調用來觸發播放操作。要播放音頻,需要使用的兩個函數是AudioServicesCreateSystemSoundID 和 AudioServicesPlaySystemSound。還需要聲明一個類型為SystemSoundID的變量,它表示要使用的聲音檔案。下面示範了如何加載并播放聲音:

- (IBAction)testSystemSound:(id)sender 
{
    SystemSoundID soundID;
    NSString *strSoundFile = [[NSBundle mainBundle] pathForResource:@"alertsound" ofType:@"wav"];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:strSoundFile],&soundID);
    AudioServicesPlaySystemSound(soundID);
}      

其實這段代碼應該這樣來了解:

在寫這個功能時最主要是兩句代碼:

SystemSoundID soundID;
AudioServicesPlaySystemSound(soundID);      

然後考慮如何在中間加代碼使得soundID被指派:

AudioServicesCreateSystemSoundID((CFURLRef)fileURL,&myID);      

第二個參數就是我們建立的SystemSoundID對象,但是這裡要傳位址(加&符号)。

第一個參數需要一個CFURLRef類型的url參數,要建立一個NSString來做橋接轉換(bridge),而這個NSString的值,是通過NSBundle來傳回音頻檔案路徑:

NSString *strSoundFile = [[NSBundle mainBundle] pathForResource:@"alertsound" ofType:@"wav"];      

mainBundle -- 總地來說,mainBundle對應于應用程式檔案歸檔或者應用程式的封包:一個以“.app”為擴充名并以應用程式名稱為基本名的目錄。

pathForResource方法 -- 通過檔案名和字尾名擷取路徑。

這句話調用pathForResource方法,來擷取mainBundle下名為alertsound.wav的音頻檔案,然後将路徑值傳回。

對于提醒音來說,與系統聲音之間的差别在于,如果手機處于靜音狀态,提醒音将自動觸發震動。提醒音的設定和用法與系統聲音相同,差別在于系統聲音調用AudioServicesPlaySystemSound,而提醒音調用AudioServicesPlayAlertSound。

震動更容易實作,隻需要調用AudioServicesPlaySystemSound,并将常量kSystemSoundID_Vibrate傳遞給它:

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);      

如果視圖震動不支援震動的裝置(如iPad2),将靜默失敗。是以将震動代碼留在應用程式中不會有任何害處,而不管目标裝置是什麼。

轉載于:https://www.cnblogs.com/CoderWayne/p/3596772.html